Búsqueda de sitios web

La guía definitiva para proteger, reforzar y mejorar el rendimiento del servidor web Nginx


Según las cosas maravillosas que has oído sobre Nginx, quizás decidiste probarlo. Quizás te haya gustado tanto que estás considerando reemplazar tus instalaciones de Apache con Nginx después de leer algunos de los artículos sobre el tema que hemos publicado en este sitio.

Si es así, estoy seguro de que recibirás esta guía con los brazos abiertos, ya que cubriremos 12 consejos para aumentar la seguridad de tus servidores Nginx (que van desde mantener Nginx actualizado hasta usando TLS y redirigiendo HTTP a HTTPS), y notarás que algunos de ellos son muy similares a lo que harías con Apache.

No te pierdas:

13 consejos de seguridad y refuerzo del servidor web Apache

25 trucos de Apache Htaccess para proteger el servidor web Apache

Entorno de prueba de Nginx

Usaremos el siguiente entorno en esta guía:

  1. Debian GNU/Linux 8.1 (jessi).
  2. Dirección IP: 192.168.0.25 (tecmintlovesnginx.com) y 192.168.0.26 (nginxmeanspower.com), como se describe en el sitio web virtual basado en IP. sección de anfitriones en

    1. "Cómo configurar hosts virtuales (bloques de servidores) basados en nombres e IP con Nginx"
  3. Versión de Nginx: nginx/1.6.2.
  4. Para su comodidad, aquí está el archivo de configuración final (enlace Pastebin).

Con eso en mente, comencemos.

CONSEJO #1: Mantenga Nginx actualizado

En el momento de escribir este artículo, las últimas versiones de Nginx en CentOS (en EPEL) y en los repositorios de Debian son 1.6.3 y 1.6.2-5 . , respectivamente.

No te pierdas: Instalar la última versión estable de Nginx desde los repositorios y el código fuente

Aunque instalar software desde los repositorios es más fácil que compilar el programa desde el código fuente, esta última opción tiene dos ventajas: 1) le permite crear módulos adicionales en Nginx (como mod_security) y 2) siempre proporcionará una versión más nueva. que los repositorios (1.9.9 a partir de hoy). Las notas de la versión siempre están disponibles en el sitio web de Nginx.

No te pierdas:

Proteja Apache contra fuerza bruta y ataques DDoS utilizando Mod_Security y Mod_Evasive

CONSEJO #2: Eliminar módulos innecesarios en Nginx

Para eliminar explícitamente módulos de Nginx durante la instalación desde el código fuente, haga:

./configure --without-module1 --without-module2 --without-module3

Por ejemplo:

./configure  --without-http_dav_module --withouthttp_spdy_module 

Como probablemente adivinarás, eliminar módulos de una instalación anterior de Nginx desde el código fuente requiere realizar la compilación nuevamente.

Una palabra de precaución: las directivas de configuración las proporcionan los módulos. ¡Asegúrese de no desactivar un módulo que contenga una directiva que necesitará en el futuro! Debe consultar los documentos de nginx para obtener la lista de directivas disponibles en cada módulo antes de tomar una decisión sobre deshabilitar los módulos.

CONSEJO #3: Deshabilite la directiva server_tokens en Nginx

La directiva server_tokens le dice a Nginx que muestre su versión actual en las páginas de error. Esto no es deseable ya que no desea compartir esa información con el mundo para evitar ataques a su servidor web causados por vulnerabilidades conocidas en esa versión específica.

Para deshabilitar la directiva server_tokens, desactívela dentro de un bloque de servidor:

server {
    listen       192.168.0.25:80;
    server_tokens        off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    access_log  /var/www/logs/tecmintlovesnginx.access.log;
    error_log  /var/www/logs/tecmintlovesnginx.error.log error;
        root   /var/www/tecmintlovesnginx.com/public_html;
        index  index.html index.htm;
}

Reinicie nginx y verifique los cambios:

CONSEJO #4: Denegar agentes de usuario HTTP en Nginx

Un agente de usuario HTTP es un software que se utiliza para la negociación de contenido contra un servidor web. Esto también incluye robots y rastreadores de malware que pueden terminar afectando el rendimiento de su servidor web al desperdiciar recursos del sistema.

Para mantener más fácilmente la lista de agentes de usuario no deseados, cree un archivo (/etc/nginx/blockuseragents.rules por ejemplo) con el siguiente contenido:

map $http_user_agent $blockedagent {
        default         0;
        ~*malicious     1;
        ~*bot           1;
        ~*backdoor      1;
        ~*crawler       1;
        ~*bandit        1;
}

A continuación, coloque la siguiente línea antes de la definición del bloque del servidor:

include /etc/nginx/blockuseragents.rules;

Y una declaración if para devolver una respuesta 403 si la cadena del agente de usuario está en la lista negra definida anteriormente:

Reinicie nginx y todos los agentes de usuario cuya cadena coincida con lo anterior no podrán acceder a su servidor web. Reemplace 192.168.0.25 con la IP de su servidor y no dude en elegir una cadena diferente para el parámetro --user-agent de wget:

wget http://192.168.0.25/index.html
wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 

CONSEJO #5: Deshabilite los métodos HTTP no deseados en Nginx

También conocidos como verbos, los métodos HTTP indican la acción deseada que se debe realizar en un recurso servido por Nginx. Para aplicaciones y sitios web comunes, solo debe permitir GET, POST y HEAD y deshabilitar todos los demás.

Para hacerlo, coloque las siguientes líneas dentro de un bloque de servidor. Una respuesta HTTP 444 significa una respuesta vacía y se usa a menudo en Nginx para engañar a los ataques de malware:

if ($request_method !~ ^(GET|HEAD|POST)$) {
   return 444;
}

Para probar, use curl para enviar una solicitud DELETE y compare el resultado con cuando envía un GET normal:

curl -X DELETE http://192.168.0.25/index.html
curl -X POST http://192.168.0.25/index.html 

CONSEJO #6: Establecer limitaciones de tamaño de búfer en Nginx

Para evitar ataques de desbordamiento de búfer contra su servidor web Nginx, establezca las siguientes directivas en un archivo separado (cree un nuevo archivo llamado /etc/nginx/conf.d/buffer.conf, por ejemplo):

client_body_buffer_size  1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;

Las directivas anteriores garantizarán que las solicitudes realizadas a su servidor web no provoquen un desbordamiento del búfer en su sistema. Una vez más, consulte los documentos para obtener más detalles sobre lo que hace cada uno de ellos.

Luego agregue una directiva de inclusión en el archivo de configuración:

include /etc/nginx/conf.d/*.conf;

CONSEJO #7: Limite el número de conexiones por IP en Nginx

Para limitar las conexiones por IP, utilice las directivas limit_conn_zone (en un contexto http o al menos fuera del bloque del servidor) y limit_conn (en un http, bloque de servidor o contexto de ubicación).

Sin embargo, tenga en cuenta que no se cuentan todas las conexiones, sino solo aquellas que tienen una solicitud procesada por el servidor y se ha leído todo el encabezado de la solicitud.

Por ejemplo, establezcamos el número máximo de conexiones en 1 (sí, es una exageración, pero funcionará bien en este caso) en una zona llamada addr (puede configurar esto en cualquier nombre que desee):

limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 1;

Una prueba simple con Apache Benchmark (Perform Nginx Load) donde se realizan 10 conexiones en total con 2 solicitudes simultáneas nos ayudará a demostrar nuestro punto:

ab -n 10 -c 2 http://192.168.0.25/index.html

Consulte el siguiente consejo para obtener más detalles.

CONSEJO #8: Configurar registros de monitor para Nginx

Una vez que hayas realizado la prueba descrita en el consejo anterior, revisa el log de errores que está definido para el bloque del servidor:

Es posible que desee utilizar grep para filtrar los registros de solicitudes fallidas realizadas en la zona addr definida en el CONSEJO n.º 7:

grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto

Asimismo, podrá filtrar el registro de acceso por información de interés, como por ejemplo:

  1. IP del cliente
  2. tipo de navegador
  3. tipo de solicitud HTTP
  4. Recurso solicitado
  5. Bloque de servidor que responde a la solicitud (útil si varios hosts virtuales inician sesión en el mismo archivo).

Y tome las medidas adecuadas si detecta alguna actividad inusual o no deseada.

CONSEJO #9: Evite el enlace de imágenes en Nginx

El hotlinking de imágenes ocurre cuando una persona muestra en otro sitio una imagen alojada en el suyo. Esto provoca un aumento en el uso de ancho de banda (por el cual usted paga) mientras la otra persona muestra felizmente la imagen como si fuera de su propiedad. En otras palabras, es una doble pérdida para usted.

Por ejemplo, digamos que tiene un subdirectorio llamado img dentro del bloque de su servidor donde almacena todas las imágenes utilizadas en ese host virtual. Para evitar que otros sitios utilicen sus imágenes, deberá insertar el siguiente bloque de ubicación dentro de su definición de host virtual:

location /img/ {
  valid_referers none blocked 192.168.0.25;
   if ($invalid_referer) {
     return   403;
   }
}

Luego modifique el archivo index.html en cada host virtual de la siguiente manera:

192.168.0.26 192.168.0.25
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Nginx means power</title>
</head>
<body>
<h1>Nginx means power!</h1>
<img src=”http://192.168.0.25/img/nginx.png” />
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8″>
<title>Tecmint loves Nginx</title>
</head>
<body>
<h1>Tecmint loves Nginx!</h1>
<img src=”img/nginx.png” />
</body>
</html>

Ahora navegue a cada sitio y, como puede ver, la imagen se muestra correctamente en 192.168.0.25 pero se reemplaza por una respuesta 403 en 192.168.0.26 fuerte>:

Tenga en cuenta que este consejo depende de que el navegador remoto envíe el campo Referer.

CONSEJO #10: Deshabilite SSL y solo habilite TLS en Nginx

Siempre que sea posible, haz lo que sea necesario para evitar SSL en cualquiera de sus versiones y utiliza TLS en su lugar. Los siguientes ssl_protocols deben colocarse en un servidor o contexto http en su archivo de host virtual o son un archivo separado mediante una directiva de inclusión (algunas personas usan un archivo llamado ssl.conf , pero depende totalmente de usted):

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

Por ejemplo:

CONSEJO #11: Crear certificados en Nginx

En primer lugar, genere una clave y un certificado. No dudes en utilizar un tipo diferente de cifrado si lo deseas:

openssl genrsa -aes256 -out tecmintlovesnginx.key 1024
openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
cp tecmintlovesnginx.key tecmintlovesnginx.key.org
openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt

Luego agregue las siguientes líneas dentro de un bloque de servidor separado en preparación para el siguiente consejo (http --> https redirección) y mueva también las directivas relacionadas con SSL al nuevo bloque:

server {
    listen 192.168.0.25:443 ssl;
    server_tokens off;
    server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
    root   /var/www/tecmintlovesnginx.com/public_html;
    ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
    ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
}

En el siguiente consejo, verificaremos cómo nuestro sitio utiliza ahora un certificado autofirmado y TLS.

CONSEJO #12: Redirigir el tráfico HTTP a HTTPS en Nginx

Agregue la siguiente línea al primer bloque del servidor:

return 301 https://$server_name$request_uri;

La directiva anterior devolverá una respuesta 301 (Movido permanentemente), que se utiliza para la redirección URL permanente cada vez que se realiza una solicitud al puerto 80 de su host virtual, y redirigirá la solicitud al servidor bloqueado que añadido en el consejo anterior.

La siguiente imagen muestra la redirección y confirma el hecho de que estamos utilizando TLS 1.2 y AES-256 para el cifrado:

Resumen

En este artículo hemos compartido algunos consejos para proteger su servidor web Nginx. Nos encantaría escuchar lo que piensa y, si tiene otros consejos que le gustaría compartir con el resto de la comunidad, no dude en hacérnoslo saber enviándonos una nota mediante el formulario de comentarios a continuación.