Certificados TLS
El primer paso para ejecutar esta guía es obtener los certificados TLS.
Recuerde que el tamaño de las claves es un aspecto importante de la seguridad, actualmente está generalizado el tamaño de 2048 bis, pero la recomendación es usar 4096 bits para una mayor robustez.
Plantilla de configuración segura
Añadir la etiqueta server dentro de http{ en el fichero nginx.conf
/etc/nginx/nginx.conf
http { server { #Configuración de TLS listen 443 ssl http2; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/dhparam.pem; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256; ssl_ecdh_curve secp384r1; ssl_certificate ruta_certificado; #Indica la ruta de tu certificado ssl_certificate_key ruta_clave; #Indica la ruta de tu certificado ssl_stapling on; ssl_stapling_verify on; ssl_session_cache shared:SSL:40m; ssl_session_timeout 4h; ssl_session_tickets off; #Añadir cabeceras y DNS en función de tu producto resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; } } |
Explicación
Habilitar TLS y HTTP2
Indicar al servidor Nginx que utilice estos protocolos de la siguiente manera:
Habilitar protocolos
server { listen 443 ssl http2; ... } |
Deshabilitar SSL y las versiones anteriores de TLS
Estas versiones presentan vulnerabilidades conocidas, por lo que lo mejor es indicarle al servidor que solo use los más modernos, que son TLSv1.2 y v1.3:
Deshabilitar SSL y versiones obsoletas de TLS
ssl_protocols TLSv1.2 TLSv1.3; |
Optimizar las suites de cifrado
Tenemos que indicar al servidor que utilice nuestras suite de cifrado:
Suites de cifrado preferidas
ssl_prefer_server_ciphers on; |
El cifrado afecta directamente al rendimiento y a la seguridad, por lo que es importante ajustar estos valores a nuestro producto, un ejemplo para nuestra suite podría ser:
Ejemplo de suite de cifrado
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:!ADH:!AECDH:!MD5; |
DH Params
El método de intercambio de claves Diffie-Hellman permite que dos partes que no se conocen previamente establezcan conjuntamente una clave secreta compartida a través de un canal inseguro . Esta clave se puede utilizar para cifrar las comunicaciones posteriores mediante un cifrado de clave simétrica. Para configurar nuestro servidor es necesario que generemos los parámetros con el tamaño deseado (intentado igualarlo al tamaño de nuestro certificado TLS) y luego indiquemos que los use:
Generación de parámetros y establecer su uso
openssl dhparam 2048 -out /etc/nginx/certs/dhparam.pem ssl_dhparam /etc/nginx/certs/dhparam.pem; |
Habilitar OCSP
Para habilitar una conexión segura cliente-servidor, el cliente tiene que verificar que el certificado es de confianza y no ha caducado, por que tiene que consultar al emisor del certificado. Esto provoca un tiempo de carga mayor para la página que repercute en el usuario final. Para resolver este problema podemos configurar Nginx para que obtenga un mensaje firmado del servidor OCSP y al inicializar una conexión con algún cliente, unirlo al handshake inicial. De esta manera el cliente puede estar seguro de que el certificado no está caducado, evitando preguntar explícitamente al servidor OCSP.
Es necesario verificar que la respuesta OCSP no ha sido manipulada. Para que la verificación OCSP funcione, el certificado del emisor del certificado, el certificado raíz y todos los certificados intermedios deben ser configurados como de confianza utilizando la directiva ssl_trusted_certificate (http://nginx.org/en/docs/http/ngx_http_ssl_module.html?ref=hackernoon.com#ssl_trusted_certificate ).
Comprobar el emisor de un certificado
openssl x509 -in /etc/nginx/certs/example.crt -text -noout |
La configuración del servidor sería la siguiente:
Configuración Nginx para OCSP
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/certs/lets-encrypt-x3-cross-signed.pem; |
Habilitar HSTS
HSTS es una función que permite a un servidor decirle a los clientes que solo deben usar el protocolo seguro (HTTPS) para comunicarse con él.
Habilitar HSTS
add_header Strict-Transport-Security "max-age=31536000" always; |
Si es necesario que esto aplique a todos los subdominios deberemos especificar la cláusula includeSubDomains
Habilitar HSTS a todos los subdominios
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; |
Optimizar la caché de sesión SSL
La creación de una caché de parámetros de conexión TLS reduce el número de handshakes y por lo tanto puede mejorar el rendimiento de su aplicación. El caché se configura mediante la directiva ssl_session_cache. Otro parámetro que afecta al número de handshakes es ssl_session_timeout. La configuración recomendada es aumentar el tiempo por defecto de 5 minutos a unas 4 horas y aumentar el tamaño de la memoria caché TLS a unos 40MB.
Configuración de caché
server { ssl_session_cache shared:SSL:40m; ssl_session_timeout 4h; } |
NO habilitar los session tickets
Los tickets de sesión son una alternativa a la caché de sesión (caché → información guardada en el servidor // tickets → Información guardada en el cliente). Se puede establecer la directiva ssl_session_tickets, aun que la recomendación de seguridad es desactivarlos excepto en casos muy concretos :
Habilitar los tickets de sesión
server { ... ssl_session_tickets off; } |