Nginx+TLS y un poquito de seguridad, TLS es lo que hay…

Después de ver/configurar Apache y Postfix con TLS, hoy veremos como ponerle TLS a Nginx.índice2

Ayer compartí un librito de Nginx que está bueno… Espero que lo hayan descargado y le echaran una ojeada, pues lo van a necesitar.

Bueno, vamos por partes…

Asumo que ya usted tiene su certificado digital, sino, mire a ver como lo puede resolver

Esta configuración requiere que su certificado sea de al menos 2048-bits. Para certificados menores de 2048 bits, Google ha empezado a emitir alertas de seguridad. SSLv2, SSLv3, and TLSv1.0 tienen muy conocidas vulnerabilidades y debería ser desabilitados por default, esto lo veremos en breve.

– OpenSSL y Nginx actualizado.

Actualiza OpenSSL/Nginx en tu distribución[Linux/BSD] y chequea en internet por parches de seguridad. No dejes de la mano tu primera barrera de protección, que es tener el sistema actualizado.

– Lo primero es agregar a tu configuración:

ssl_protocols TLSv1.1 TLSv1.2;

– Tambien debemos añadir:

ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;

Lo que añade Forward Secrecy a nuestro server. Para más info ver este link. Con ssl_session_timeout vemos como se puede mejorar el reuso de la sesion ssl.

Usando cifrados fuertes.

ssl_ciphers «ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK»;

Con este bloque desactivamos los cifrados débiles y propensos a ataques, y robo de datos.

– Habilitando HTTP Strict Transport Security.

HTTP Strict Transport Security le informa al navegador que solo puede conectarse a través de HTTPS al servidor web. En OWASP explican bien detallado este apartado.

add_header Strict-Transport-Security «max-age=31536000; includeSubdomains; preload»;

Ahora bien, preload? Preload es una lista de «precargado» en la que nuestro servidor web mediante HTTP Strict Transport Security, le informa al navegador que el sitio web siempre será accedido mediante https, evitando ataques de tipo man-in-the-middle. Para añadir tu dominio a la lista de precargado debes visitar este enlace… Intenta cualificar en todos los requerimientos que te pidan.

– Asegurando la carpeta de nuestros certificados.

La carpeta donde almacenamos nuestros certificados debemos:

# chmod 700 certs-folder

Y los certificados:

# chmod 600 certs.[key,ca,pem]

– Aumentar la fuerza de los certificados Diffie-Hellman

# openssl dhparam -out dhparam.pem 4096

Sólo quedaría añadir esta linea a la configuración de los sitios alojados en tu servidor.

ssl_dhparam /path/to/your/dh/key.pem;

Ahora veamos. Debe de quedarte algo así:

server {
listen 443 ssl;
server_name tls.nginx.com;

ssl_certificate ssl/mysite.cer;
ssl_certificate_key ssl/key.pem;

#Perfect Forward Secrecy
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

# HSTS
add_header Strict-Transport-Security «max-age 31536000; includeSubdomains; preload»;

#Disable SSLv2.0 SSLv3.0 TLS1.0
ssl_protocols TLSv1.1 TLSv1.2;

#Cipher Suite
ssl_ciphers «ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK»;

#DH Key ssl_dhparam /etc/ssl/dh/key.pem

root /var/www/html;
index index.html index.htm;
}

– Un poco más de seguridad.

No nos debemos olvidar que en la configuración global de Nginx deben estar:

server_tokens off;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection «1; mode=block»;

Y redirigir el trafico HTTP a HTTPS:

server {
 listen 80;
 server_name .misitio.com;
 limit_conn conn_limit_per_ip 10;
 limit_req zone=req_limit_per_ip burst=10 nodelay;
 return 301 https://$host$request_uri;
 }

Ahora solo queda probar tu configuración contra Qualys SSL Labs.

Un glosario de los ataques mas comunes:

Un saludo y espero les sirva, muchachos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *