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