La guía final para asegurar, endurecer y mejorar el rendimiento del servidor web NGINX

La guía final para asegurar, endurecer y mejorar el rendimiento del servidor web NGINX
Consejos de endurecimiento de seguridad Nginx

Basado en las cosas maravillosas de las que has oído hablar Nginx, Quizás decidiste intentarlo. Es posible que le haya gustado tanto que esté considerando reemplazar sus instalaciones de Apache con Nginx después de pasar por algunos de los artículos sobre el tema que hemos publicado en este sitio.

Si es así, estoy seguro de que dará la bienvenida a esta guía con los brazos abiertos ya que vamos a cubrir 12 consejos para aumentar la seguridad de su Nginx Servidores (que van desde mantener a Nginx hasta la fecha hasta usar TLS y redirigir HTTP hasta HTTPS), y notará que algunos de ellos son muy similares a lo que haría con Apache.

No te pierdas:

13 Consejos de seguridad y endurecimiento del servidor web Apache

25 trucos de apache htaccess para asegurar el servidor web Apache

Entorno de prueba Nginx

Usaremos el siguiente entorno en esta guía:

  1. Debian GNU/Linux 8.1 (Jessie).
  2. Dirección IP: 192.168.0.25 (tecmintlovesnginx.comunicarse) y 192.168.0.26 (nginxmeanspower.comunicarse), como se describe en la sección de hosts virtuales basados ​​en IP en
    1. "Cómo configurar hosts virtuales basados ​​en nombres y basados ​​en IP (bloques de servidor) con Nginx"
  3. Versión Nginx: Nginx/1.6.2.
  4. Para su conveniencia, aquí está el archivo de configuración final (enlace Pastebin).

Con eso en mente, comencemos.

Consejo #1: Mantenga a Nginx actualizado

En el momento de este escrito, las últimas versiones de Nginx en Centos (en Epel) y los repositorios de Debian son 1.6.3 y 1.6.2-5, respectivamente.

No te pierdas: Instale la última versión estable de Nginx desde repositorios y fuente

Aunque instalar software desde los repositorios es más fácil que compilar el programa del 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:

Proteger a Apache contra la fuerza bruta y los ataques DDoS usando mod_security y mod_evasive

Consejo #2: Retire los módulos innecesarios en Nginx

Para eliminar explícitamente módulos de NGINX mientras se instala desde la fuente, haga:

# ./Configurar--Without-Module1--Without-Module2--Without-Module3 

Por ejemplo:

# ./Configurar-without-http_dav_module --withouthttp_spdy_module 

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

Una palabra de precaución: Las directivas de configuración son proporcionadas por módulos. Asegúrese de no deshabilitar un módulo que contenga una directiva que necesitará en el futuro! Debe verificar los documentos de Nginx para la lista de directivas disponibles en cada módulo antes de tomar una decisión de deshabilitar módulos.

Consejo #3: Deshabilitar la directiva Server_Tokens en Nginx

El servidor_tokens Directiva 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 en su servidor web causados ​​por vulnerabilidades conocidas en esa versión específica.

Para deshabilitar el servidor_tokens Directiva, configure si se apaga dentro de un bloque de servidor:

servidor escucha 192.168.0.25:80; servidor_tokens apagado; server_name tecMintlovesnginx.com www.tecmintlovesnginx.com; access_log/var/www/logs/tecMintlovesnginx.acceso.registro; Error_log/var/www/logs/tecMintlovesnginx.error.error de registro; root/var/www/tecMintlovesnginx.com/public_html; índice índice.índice HTML.htm;  

Reinicie Nginx y verifique los cambios:

Ocultar información de la versión Nginx

Consejo #4: Denegar los agentes de usuarios de HTTP en Nginx

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

Para mantener más fácilmente la lista de agentes de usuarios no deseados, cree un archivo (/etc/nginx/blockuseragents.normas Por ejemplo) con los siguientes contenidos:

mapa $ http_user_agent $ blockedagent predeterminado 0; ~*malicioso 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:

incluir/etc/nginx/blockuseragents.normas; 

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

Deshabilitar los agentes de los usuarios en Nginx

Reiniciar Nginx y todos los agentes de usuarios cuya cadena coincide con lo anterior se bloqueará para acceder a su servidor web. Reemplazar 192.168.0.25 con la IP de su servidor y no dude en elegir una cadena diferente para el --agente de usuario interruptor de wget:

# wget http: // 192.168.0.25/índice.html # wget --user-agent "Soy un bandido jaja" http: // 192.168.0.25/índice.html 
Bloquear agentes de usuario en Nginx

Consejo #5: Desactivar métodos HTTP no deseados en Nginx

También conocidos como verbos, los métodos HTTP indican la acción deseada que se tomarán en un recurso atendido por Nginx. Para sitios web y aplicaciones comunes, solo debe permitir CONSEGUIR, CORREO, y CABEZA y deshabilitar a todos los demás.

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

if ($ request_method !~ ^(Get | Head | Post) $) return 444;  

Para probar, usar rizo Para enviar un BORRAR Solicite y compare la salida con cuando envíe un regular CONSEGUIR:

# curl -x eliminar http: // 192.168.0.25/índice.html # curl -x post http: // 192.168.0.25/índice.html 
Deshabilitar solicitudes HTTP no deseadas en Nginx

Consejo #6: Establezca limitaciones del tamaño del búfer en Nginx

Para evitar ataques de desbordamiento del búfer contra su servidor web NGINX, establezca las siguientes directivas en un archivo separado (cree un nuevo archivo nombrado /etc/nginx/conf.d/búfer.confusión, Por ejemplo):

client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; grande_client_header_buffers 2 1k; 

Las directivas anteriores se asegurarán de que las solicitudes realizadas en su servidor web no causen un desbordamiento de 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:

incluir/etc/nginx/conf.d/*.conf; 
Establecer el tamaño del búfer en Nginx

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

Para limitar las conexiones por IP, use el Limit_conn_zone (en un contexto HTTP o al menos fuera del bloque del servidor) y Limit_Conn (en un HTTP, bloqueo del 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 su encabezado de solicitud completo se ha leído.

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

Limit_conn_zone $ binary_remote_addr zona = addr: 5m; Limit_Conn AdDR 1; 
Número de límite de solicitudes HTTP en Nginx

Una prueba simple con el punto de referencia de Apache (realizar la carga Nginx) donde 10 Las conexiones totales se realizan con 2 Las solicitudes simultáneas nos ayudarán a demostrar nuestro punto:

# AB -n 10 -C 2 http: // 192.168.0.25/índice.html 

Vea el siguiente consejo para más detalles.

Consejo #8: Configuración de registros de monitor para NGINX

Una vez que haya realizado la prueba descrita en el consejo anterior, verifique el registro de errores que se define para el bloque del servidor:

Registro de errores de Nginx

Es posible que desee usar grep Para filtrar los registros para las solicitudes fallidas realizadas en el agregarzona r definida en Consejo #7:

# GREP ADDR/VAR/WWW/LOGS/TECMINTLOVESNGINX.error.log -color = auto 
Monitoreo de registro de Nginx

Del mismo modo, puede filtrar el registro de acceso para obtener información de interés, como:

  1. IP del cliente
  2. Tipo de navegador
  3. Tipo de solicitud HTTP
  4. Recurso solicitado
  5. Bloque de servidor respondiendo a la solicitud (útil si varios hosts virtuales están registrando el mismo archivo).

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

Consejo #9: Evite la imagen de la imagen en Nginx

La imagen de la imagen ocurre cuando una persona muestra en otro sitio una imagen alojada en la tuya. Esto causa un aumento en su uso de ancho de banda (que usted paga) mientras que la otra persona muestra felizmente la imagen como si fuera su propiedad. En otras palabras, es una doble pérdida para ti.

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

ubicación / img / válido_referers ninguno bloqueado 192.168.0.25; if ($ invalid_referer) return 403;  

Luego modifique el índice.html Archivo en cada host virtual de la siguiente manera:

192.168.0.26

192.168.0.25





Nginx significa potencia


Nginx significa potencia!








Tecmint ama a Nginx


Tecmint ama a Nginx!




Ahora navegue a cada sitio y, como puede ver, la imagen se muestra correctamente en 192.168.0.25 pero es reemplazado por un 403 respuesta a 192.168.0.26:

Deshabilitar la imagen de la imagen nginx

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

Consejo #10: Desactivar SSL y solo habilite TLS en Nginx

Siempre que sea posible, haga lo que sea necesario para evitar Ssl en cualquiera de sus versiones y usa TLS en cambio. La siguiente ssl_protocols debe colocarse en un servidor o contexto HTTP en su archivo de host virtual o es un archivo separado a través de una directiva de inclusión (algunas personas usan un archivo nombrado ssl.confusión, Pero depende completamente de ti):

ssl_protocols tlsv1 tlsv1.1 TLSV1.2; 

Por ejemplo:

Desactivar SSL y habilitar TLS en Nginx

Consejo #11: Crear certificados en Nginx

En primer lugar, genere una clave y un certificado. Siéntase libre de usar un tipo diferente de cifrado si lo desea:

# OpenSSL GenRSA -AES256 -out tecMintlovesnginx.Key 1024 # OpenSSL Req -new -Key TecMintlovesnginx.clave -Out tecMintlovesnginx.CSR # CP TECMINTLOVESNGINX.clave tecMintlovesnginx.llave.org # openssl rsa -in tecMintlovesnginx.llave.org -out tecMintlovesnginx.Clave # OpenSSL x509 -req -days 365 -in tecMintlovesnginx.CSR -SignKey TecMintlovesnginx.clave -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 mover las directivas relacionadas con SSL al nuevo bloque también:

servidor escucha 192.168.0.25: 443 SSL; servidor_tokens apagado; server_name tecMintlovesnginx.com www.tecmintlovesnginx.com; root/var/www/tecMintlovesnginx.com/public_html; ssl_certificate/etc/nginx/sites-habilitado/certs/tecMintlovesnginx.CRT; ssl_certificate_key/etc/nginx/sites-habilitado/certs/tecMintlovesnginx.llave; ssl_protocols tlsv1 tlsv1.1 TLSV1.2;  

En el siguiente consejo verificaremos cómo nuestro sitio ahora está utilizando un certificado autofirmado y TLS.

Consejo #12: redirige 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; 
Redirigir http a https en nginx

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

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

Verifique el encriptación TLS Nginx

Resumen

En este artículo hemos compartido algunos consejos para asegurar 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 informarnos enviándonos una nota usando el formulario de comentarios a continuación.