5. Servicio Nginx
Configuraciones para servicio Nginx. Las modificaciones se realizan desde ficheros /etc/nginx/sites-available/default o /etc/nginx/conf.d, dependiendo la configuración previa implementada.
Deshabilitar exposición de versión del servicio
server_tokens off;
Deshabilitar versiones antiguas SSL/TLS
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
Habilitar HSTS como Security Header
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Configurar límite de tamaño para carga de archivos
client_max_body_size 25M;
Proteger archivos privados .ht
location ~ /\.ht {
deny all;
}
Limitar número de solicitudes por segundo contra el servidor
Definir límite de solicitudes
http {
...SNIP...
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
...SNIP...
}
Aplicar configuración por bloque de zona límite para solicitudes emitidas
server {
listen 443;
server_name domain.com;
location / {
...SNIP...
limit_req zone=one burst=20;
proxy_pass http://backend_server;
...SNIP...
}
}
Proteger contra ataques de fuerza bruta en autenticaciones HTTP
Definir zona de conexión HTTP
http {
...SNIP...
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
...SNIP...
}
Aplicar límite de conexiones
server {
listen 443;
server_name domain.com;
location /login {
...SNIP...
limit_conn addr 1;
...SNIP...
}
}
Deshabilitar soporte para IPv6 si no es utilizado
listen [::]:443 ipv6only=off;
Implementar generación de logs para auditorías y seguimiento de peticiones
log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log combined;
error_log /var/log/nginx/error.log warn;
Desactivar listado de directorios
autoindex off;
Mejorar sesiones HTTPS mediante Perfect Forward Secrecy
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
Proteger por permisos archivos de configuración
sudo chmod 600 /etc/nginx/ssl/cert.pem
sudo chmod 600 /etc/nginx/ssl/key.pem
sudo chmod 600 /etc/nginx/nginx.conf
sudo chmod 600 /etc/nginx/sites-available/default
sudo chmod 600 /etc/nginx/conf.d/*.conf
Verificación de cadenas OCSP por SSL Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;
Validación de longitud de cadenas en las URL
large_client_header_buffers 4 16k;
Aplicar tiempo de expiración para contenido estático
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
Implementar cabeceras de seguridad
server {
listen 443 ssl;
server_name domain.com;
...SNIP...
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:;" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Permissions-Policy "geolocation=(), microphone=()" always;
add_header X-Frame-Options SAMEORIGIN always;
add_header Set-Cookie "name=value; HttpOnly; Secure; SameSite=Strict";
...SNIP...
}
Manejar errores a través de páginas personalizadas
error_page 400 /custom_400.html;
error_page 401 /custom_401.html;
error_page 403 /custom_403.html;
error_page 404 /custom_404.html;
location /custom_404.html {
root /usr/share/nginx/html;
}
Aplicar protección contra Slowloris y ataques de retardo
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 5s 5s;
send_timeout 10s;
Aplicar medidas de control de caché
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0";
Implementar Rate limiting específicos sobre recursos sensibles
...SNIP...
location /login {
limit_req zone=one burst=5 nodelay;
}
location /admin {
limit_req zone=one burst=5 nodelay;
}
...SNIP...
Cifrar datos de consultas emitidas con backend
proxy_pass https://internal_backend_server;