Configuración Servidor Nginx

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

Ejemplo de suite de cifrado

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

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

La configuración del servidor sería la siguiente:

Configuración Nginx para OCSP

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

Si es necesario que esto aplique a todos los subdominios deberemos especificar la cláusula includeSubDomains

Habilitar HSTS a todos los subdominios

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é

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