Guía de hardening para Nginx con configuración segura de SSL/TLS, cabeceras de seguridad HTTP y protecciones contra ataques comunes.
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
# En /etc/nginx/nginx.conf, dentro del bloque http {}:
server_tokens off;
# 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
# 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;
# 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;
server {
listen 80;
server_name midominio.com www.midominio.com;
return 301 https://$host$request_uri;
}
# 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;
}
# Verificar sintaxis sin reiniciar:
nginx -t
# Aplicar cambios:
systemctl reload nginx
# Comprobar nota SSL en:
# https://www.ssllabs.com/ssltest/