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;