← Volver al inicio
Nginx SSL TLS HTTPS Hardening

Hardening Nginx y SSL/TLS

25/03/2022

Guía de hardening para Nginx con configuración segura de SSL/TLS, cabeceras de seguridad HTTP y protecciones contra ataques comunes.

1. Instalación y estructura

apt install nginx

# Archivos de configuración:
/etc/nginx/nginx.conf          # Config principal
/etc/nginx/sites-available/    # VirtualHosts disponibles
/etc/nginx/sites-enabled/      # VirtualHosts activos (symlinks)
/etc/nginx/conf.d/             # Configuraciones adicionales

2. Ocultar versión de Nginx

# En /etc/nginx/nginx.conf, dentro del bloque http {}:
server_tokens off;

3. Configurar HTTPS con Let's Encrypt

# Instalar Certbot:
apt install certbot python3-certbot-nginx

# Obtener certificado:
certbot --nginx -d midominio.com -d www.midominio.com

# Renovación automática (ya configurada por Certbot):
# Verificar:
certbot renew --dry-run

4. Configuración SSL/TLS segura

# En el bloque server {} del VirtualHost HTTPS:
listen 443 ssl http2;

ssl_certificate     /etc/letsencrypt/live/midominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/midominio.com/privkey.pem;

# Solo TLS 1.2 y 1.3 (deshabilitar versiones antiguas):
ssl_protocols TLSv1.2 TLSv1.3;

# Ciphers seguros:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

# HSTS (máx. 1 año con subdominos y preload):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

# OCSP Stapling:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;

5. Cabeceras de seguridad HTTP

# En el bloque server {} o http {}:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.trusted.com; style-src 'self' 'unsafe-inline';" always;

6. Redirigir HTTP → HTTPS

server {
    listen 80;
    server_name midominio.com www.midominio.com;
    return 301 https://$host$request_uri;
}

7. Límites y protecciones

# Limitar tamaño de peticiones (anti-DoS):
client_max_body_size 10M;
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;

# Deshabilitar métodos HTTP peligrosos:
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 444;
}

# Bloquear acceso a archivos ocultos (.htaccess, .git):
location ~ /\. {
    deny all;
    return 404;
}

8. Verificar configuración

# Verificar sintaxis sin reiniciar:
nginx -t

# Aplicar cambios:
systemctl reload nginx

# Comprobar nota SSL en:
# https://www.ssllabs.com/ssltest/