Fortalecimiento de Seguridad en Servidores Nginx para una Protección Integral

Los servidores web Nginx son ampliamente desplegados en entornos de producción debido a su alto rendimeinto y flexibilidad. La seguridad de estas infraestructuras es crítica para mitigar vulnerabilidades y proteger aplicaciones web contra amenazas comunes.

Consideraciones Iniciales para la Instalación

Para minimizar riesgos, es fundamental seguir el principio de privilegio mínimo al configurar Nginx. Esto implica ejecutar el servicio con un usuario no privilegiado y restringir el acceso a recursos esenciales.


# Crear un volumen lógico dedicado para Nginx
lvcreate -L 10G -n vol_nginx vg_data

# Formatear el volumen con un sistema de archivos
mkfs.ext4 /dev/vg_data/vol_nginx

# Montar el sistema de archivos en un directorio específico
mkdir -p /opt/nginx_web
mount /dev/vg_data/vol_nginx /opt/nginx_web

# Actualizar fstab para persistencia
echo "/dev/vg_data/vol_nginx /opt/nginx_web ext4 defaults,noexec,nosuid,nodev 0 2" >> /etc/fstab

# Crear un grupo y usuario dedicados para Nginx
groupadd nginx_svc
useradd -g nginx_svc -s /bin/false nginx_user

# Compilar e instalar Nginx con módulos seleccionados
cd /opt/nginx_web
tar -xzf nginx-1.25.3.tar.gz
cd nginx-1.25.3
./configure --prefix=/opt/nginx_web --user=nginx_user --group=nginx_svc --with-http_ssl_module --with-http_v2_module --without-http_autoindex_module
make && make install

# Ajustar permisos en el directorio de instalación
chown -R nginx_user:nginx_svc /opt/nginx_web

Modificar los puertos de escucha a valores superiores a 1024 puede reducir la necesidad de privilegios elevados. Alternativamente, se pueden usar capacidades del kernel para permitir el enlace a puertos privilegiados sin ejecutar como root.


# Asignar la capacidad de enlazar puertos al ejecutable de Nginx
setcap cap_net_bind_service=+ep /opt/nginx_web/sbin/nginx

# Configurar puertos alternativos en nginx.conf
server {
    listen 8080;
    ...
}

server {
    listen 8443 ssl;
    ...
}

Configuración de Seguridad en el Sistema de Archivos

Desplegar contenido web en sistemas de archivos con opciones de montaje reforzadas limita la ejecución de binarios y el uso de dispositivos. OverlayFS permite separar el acceso de lectura y escritura, reforzando la integridad de los archivos estáticos.


# Preparar directorios para OverlayFS
mkdir -p /srv/nginx_lower /srv/nginx_upper /srv/nginx_work

# Mover contenido estático al directorio de solo lectura
mv /opt/nginx_web/html/* /srv/nginx_lower/

# Mover directorios con permisos de escritura al directorio superior
mv /opt/nginx_web/html/uploads /srv/nginx_upper/

# Montar OverlayFS para combinar capas
mount -t overlay overlay -o lowerdir=/srv/nginx_lower,upperdir=/srv/nginx_upper,workdir=/srv/nginx_work /opt/nginx_web/html

Duración de Sesión y Límites de Conexión

Ajustar los tiempos de espera y los tamaños de búfer ayuda a prevenir ataques de denegación de servicio y desbordameintos de búfer.


# Configurar límites en nginx.conf
client_body_timeout 15s;
client_header_timeout 15s;
keepalive_timeout 30s;
send_timeout 10s;

client_body_buffer_size 2k;
client_header_buffer_size 2k;
client_max_body_size 2k;
large_client_header_buffers 4 2k;

Protocolos y Cifrado Seguros

Desactivar protocolos TLS obsoletos y configurar cifrados fuertes previene ataques como BEAST o POODLE.


ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers on;

Cabeceras HTTP de Seguridad

Incorporar cabeceras específicas refuerza la seguridad contra ataques como XSS, clickjacking o sniffing.


add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline';" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

Protección contra Abusos y Accesos No Autorizados

Limitar tasas de solicitud y controlar el acceso por IP reduce el impacto de fuerza bruta y escaneos maliciosos.


# Definir zona de límite de velocidad
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

# Aplicar límites en bloques de ubicación
location /api/ {
    limit_req zone=req_limit burst=20 nodelay;
    allow 192.168.1.0/24;
    deny all;
}

# Bloquear agentes de usuario sospechosos
if ($http_user_agent ~* (sqlmap|nikto|nmap)) {
    return 403;
}

# Prevenir hotlinking de recursos
location ~* \.(jpg|png|gif)$ {
    valid_referers none blocked example.com *.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

Manejo de Errores y Ofuscación de Información

Ocultar detalles del servidor y versiones de software reduce la superficie de ataque.


server_tokens off;
proxy_hide_header X-Powered-By;
proxy_hide_header Server;

Establecer un nombre de servidor por defecto no válido puede atrapar solicitudes no dirigidas a dmoinios autorizados.


server {
    listen 80 default_server;
    server_name _;
    return 444;
}

Etiquetas: Nginx SSL/TLS seguridad web hardening balanceo de carga

Publicado el 7-6 08:18