Nginx es una de las soluciones de servidor web y proxy inverso más utilizadas a nivel global. Sin embargo, su configuración por defecto incluye identificadores de versión expuestos y conjuntos de cifrado obsoletos que reducen el nivel de seguridad de la infraestructura.
1. Ocultar la Versión del Servidor (Server Tokens)
Evitar la divulgación de información (Information Disclosure) impide que atacantes identifiquen versiones vulnerables específicas del servidor Nginx mediante cabeceras HTTP:
http {
# Desactivar la emisión de la versión de Nginx en cabeceras de respuesta y páginas de error
server_tokens off;
# Ajustar tamaño máximo de cuerpo de petición (previene subidas excesivas)
client_max_body_size 10M;
# Tiempos de espera estrictos para mitigar conexiones lentas (Slowloris)
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 65s;
send_timeout 10s;
}2. Configuración Estricta de SSL/TLS (TLS 1.2 y TLS 1.3)
Se deben desactivar los protocolos obsoletos SSLv3, TLS 1.0 y TLS 1.1, forzando la utilización exclusiva de suites de cifrado seguras con Forward Secrecy (PFS):
# Protocolos permitidos (Deshabilitar TLS 1.0 y 1.1)
ssl_protocols TLSv1.2 TLSv1.3;
# Suites de cifrado recomendadas por OWASP / Mozilla Modern Configuration
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# Caché de sesiones SSL para mejorar el rendimiento
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# Parámetros Diffie-Hellman de 4096 bits
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# SSL Stapling (OCSP Stapling)
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;3. Implementación de Cabeceras HTTP de Seguridad
Las cabeceras de seguridad protegen a los usuarios contra ataques de Clickjacking, XSS (Cross-Site Scripting) y ataques de restricción de tipo MIME:
# Forzar uso exclusivo de HTTPS durante 1 año (HSTS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# Prevenir enmarcado dentro de iframes (Protección contra Clickjacking)
add_header X-Frame-Options "SAMEORIGIN" always;
# Bloquear sniffing de tipos MIME en navegadores
add_header X-Content-Type-Options "nosniff" always;
# Política de Referrer para no filtrar información sensible
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Política de Seguridad de Contenido (Content Security Policy - CSP) básica
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
# Desactivar características de dispositivo no requeridas
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;4. Rate Limiting (Control de Frecuencia por IP)
El control de frecuencia limita la cantidad de peticiones que una dirección IP puede realizar por segundo, mitigando ataques de fuerza bruta en formulaciones de login y peticiones masivas a la API:
# Zona de memoria compartida para limitar peticiones (10MB almacena ~160,000 IPs)
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
server {
listen 443 ssl http2;
server_name jorgebyte.com;
# Aplicar límite de velocidad en rutas críticas
location / {
limit_req zone=req_limit_per_ip burst=20 nodelay;
limit_conn conn_limit_per_ip 20;
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}