Mejores prácticas de seguridad de Nginx.

Nginx es el servidor web de más rápido crecimiento en la industria, y actualmente, ocupa la posición número dos en cuota de mercado.

Fue lanzado inicialmente en 2004, y desde entonces se ha ganado una excelente reputación y se utiliza en el millón de sitios más activos.

nginx-market-share-1

Hay una razón para ello: Nginx es rapidísimo.

En este artículo, voy a hablar de algunas de las guías esenciales para asegurar el Nginx para un entorno de producción. Así que vamos a empezar.

SSL/TLS

Implementar certificado SSL

El primer paso en la seguridad web es tener implementado SSL para poder acceder a las aplicaciones web con https y añadir una capa de encriptación en la comunicación.

  • Utilice OpenSSL para generar CSR con 2048 bits y sha-2
openssl req -nodes -new -sha256 -newkey rsa:2048 -keyout bestflare.key -out bestflare.csr
  • El comando anterior generará los archivos CSR y clave en el trabajo actual directamente. No olvide cambiar el nombre de los archivos .csr y .key.

Obtenga el CSR firmado por una autoridad de certificación y una vez que tenga el certificado firmado, puede implementarlos en Nginx como se indica a continuación.

  • Inicie sesión en el servidor Nginx
  • Vaya a la carpeta conf donde tiene un archivo ssl.conf.

Nota: En la instalación por defecto en Linux, tendrá este archivo en /etc/nginx/conf.d.

  • Edite el archivo y añada lo siguiente, que permitirá a Nginx escuchar en el puerto 443
servidor {
listen 443 ssl;
   nombre_servidor bestflare.com;
   ssl activado;
   ssl_certificate /opt/cert/bestflare.pem;
   ssl_certificate_key /opt/cert/bestflare.key;
   }

Nota: no olvide cambiar la ruta de los archivos de certificado y clave.

  • Guarde la configuración y reinicie el Nginx. El certificado SSL se ha implementado correctamente.

bestflare-ssl-cert

Optimización SSL/TLS

Tener SSL no significa que sea totalmente seguro y ahí es donde, como experto en seguridad web, debe aplicar una configuración para asegurar el servidor web.

Para empezar, recomendaría ejecutar un escaneo SSL contra el sitio web para encontrar la puntuación y la vulnerabilidad esencial.

ssl-labs-rating-c

Así que la calificación actual de SSL Labs es «C» y un objetivo es convertirla en «A»

Desactive los protocolos SSL/TLS débiles

SSL 3, TLS 1.0 y TLS 1.1 son vulnerables, y sólo permitiremos un protocolo TLS 1.2 fuerte.

  • Edite el archivo ssl.conf y añada lo siguiente en el bloque del servidor
ssl_protocols TLSv1.2;
  • Guarde el archivo ssl.conf y reinicie el Nginx

Deshabilite las suites de cifrado débiles

Los conjuntos de cifrado débiles pueden conducir a una vulnerabilidad como un bloqueo de sesión, y es por eso que necesitamos permitir sólo el cifrado fuerte.

  • Añada lo siguiente al bloque del servidor en el archivo ssl.conf
ssl_ciphers "EECDH ECDSA AESGCM EECDH aRSA AESGCM EECDH ECDSA SHA384 EECDH ECDSA SHA256 EECDH aRSA SHA384 EECDH aRSA SHA256 EECDH aRSA RC4 EECDH EDH aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
  • Guarde el archivo y reinicie Nginx

Instalar certificado de cadena

No tener un certificado de cadena también afecta a la clasificación general y esto puede mostrar un error al navegar en un navegador moderno como Chrome. Necesita obtener un certificado de cadena de la autoridad. La mayoría lo encontrará en su página web o simplemente búsquelo en Google.

  • Añada el contenido del certificado de cadena en el certificado del sitio web como se indica a continuación. En mi ejemplo, sería /opt/cert/bestflare.pem

cert-chain

  • Guarde el archivo y reinicie el Nginx

Diffie-Hellman seguro para TLS

Diffie-Hellman es menos seguro de lo que se creía. Una de las mejores prácticas añadidas últimamente en una lista es asegurar Diffie-hellman. Esto se consigue generando un DH GROUP único y añadiendo ssl_dhparam en el archivo ssl.conf.

  • Generar grupo DH único utilizando OpenSSL
openssl dhparam -out dhparams.pem 4096
  • Tardará unos minutos y generará un archivo dhparams.pem en un directorio de trabajo actual
  • Copie dhparams.pem a la carpeta cert
  • Modifique ssl.conf y añada lo siguiente en el bloque del servidor
ssl_dhparam /opt/cert/dhparams.pem;
  • Guarde el archivo y reinicie el Nginx

Esto debería ser suficiente para la optimización SSL/TLS y probemos de nuevo la URL para ver la calificación.

ssllabs-a-rating

¡Woo ho! Así que ahora puede ver que tiene una calificación «A» por SSLLabs. ¡Bien hecho!

Aquí está el ssl.conf completo

# Configuración del servidor HTTPS
servidor {
   listen 443 ssl;
   nombre_servidor bestflare.com;
   ssl activado;
   ssl_certificate /opt/cert/bestflare.pem;
   ssl_certificate_key /opt/cert/bestflare.key;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers activado;
   ssl_ciphers "EECDH ECDSA AESGCM EECDH aRSA AESGCM EECDH ECDSA SHA384 EECDH ECDSA SHA256 EECDH aRSA SHA384 EECDH aRSA SHA256 EECDH aRSA RC4 EECDH EDH aRSA HIGH !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
   ssl_dhparam /opt/cert/dhparams.pem;
}

Fuga de información

En la instalación por defecto de Nginx tendrá mucha información sensible revelada, lo que puede ayudar a los hackers a prepararse para un ataque.

Si está trabajando en un entorno de cumplimiento de la normativa PCI, esto se considera una vulnerabilidad de fuga de información y debe solucionar el problema.

Debe utilizar server_tokens off para desactivar la fuga de información. He explicado esto en mi artículo anterior. Eliminar la versión del encabezado del servidor en Nginx

Seguridad de aplicaciones web

La configuración por defecto de Nginx no es perfecta y puede tener muchas vulnerabilidades por eso la endurecemos para hacerla segura.

Deshabilite los métodos HTTP no deseados

La mayoría de las veces, sólo necesita las peticiones HTTP GET, HEAD y POST en su aplicación web. Permitir TRACE o DELETE es arriesgado ya que puede permitir el ataque Cross-Site Tracking y potencialmente permitir a un hacker robar la información de las cookies.

  • Modifique nginx.conf y añada lo siguiente bajo el bloque del servidor
if ($request_method !~ ^(GET|HEAD|POST)$ ) 
{
return 405; 
}

Guarde el archivo y reinicie el Nginx. Esto mostrará ahora 405 No Permitido si alguien intenta utilizar TRACE, DELETE, PUT, OPTIONS.

Chandans-iMac:~ chandan$ telnet bestflare.com 80
Intentando 128.199.100.162...
Conectado a bestflare.com.
El carácter de escape es '^]'.
TRACE / HTTP/1.1
Host: testing
HTTP/1.1 405 No permitido
Servidor: nginx
Fecha: Sat, 11 Jul 2015 06:04:34 GMT
Tipo de contenido: text/html
Contenido-Longitud: 166
Conexión: close

Ataque de clickjacking

Puede inyectar X-FRAME-OPTIONS en el encabezado HTTP para evitar un ataque de clickjacking.

Esto se consigue añadiendo lo siguiente en el archivo nginx.conf

add_header X-Frame-Options "SAMEORIGIN";

La cabecera anterior indicará al navegador que cargue los recursos SÓLO desde el mismo origen.

Protección X-XSS

Inyecte el encabezado HTTP con protección X-XSS para mitigar el ataque Cross-Site scripting.

  • Modifique el archivo nginx.conf para añadir lo siguiente
add_header X-XSS-Protection "1; mode=block";
  • Guarde el archivo de configuración y reinicie Nginx. Puede utilizar la herramienta de prueba de encabezados para verificar después de la implementación.

También puede interesarle implementar las cabeceras seguras recomendadas por OWASP que se explican aquí.

Implementar Mod Security WAF

Añada una capa adicional de seguridad implementando ModSecurity Web Application Firewall con OWASP Core Rule Set.

Alternativamente, si puede considere utilizar seguridad basada en la nube como SUCURI delante del servidor Nginx.

Mantenga Nginx actualizado

Por último, pero no menos importante, necesita mantener su Nginx actualizado ya que se están añadiendo muchas mejoras de rendimiento, correcciones de seguridad y nuevas características.

Espero que esto le ayude a mantener su Nginx seguro.

A continuación, puede que le interese aprender a construir Nginx de alto rendimiento desde cero.