tutoriales.com

Nginx y ModSecurity: Reforzando la Seguridad Web con un WAF de Código Abierto

Este tutorial te guiará a través del proceso de instalación y configuración de ModSecurity con Nginx para crear un potente Web Application Firewall (WAF). Protegerás tus aplicaciones web de vulnerabilidades comunes como inyección SQL y XSS, mejorando drásticamente su seguridad. Aprenderás a compilar Nginx con el módulo ModSecurity y a configurar reglas de seguridad.

Intermedio25 min de lectura19 views
Reportar error

🛡️ Introducción: ¿Por qué Nginx y ModSecurity?

En el panorama actual de amenazas cibernéticas, la seguridad de las aplicaciones web es más crítica que nunca. Un Web Application Firewall (WAF) actúa como un escudo entre tus aplicaciones web y los atacantes, filtrando el tráfico malicioso y bloqueando ataques antes de que lleguen a tu servidor.

Nginx es un servidor web y proxy inverso de alto rendimiento, conocido por su eficiencia y escalabilidad. ModSecurity es un WAF de código abierto, robusto y flexible, que se integra perfectamente con Nginx para proporcionar una capa adicional de seguridad. Juntos, Nginx y ModSecurity forman una combinación poderosa para proteger tus servicios web.

💡 Consejo: Un WAF no reemplaza buenas prácticas de codificación segura, pero añade una defensa crucial contra vulnerabilidades conocidas y ataques de día cero.

¿Qué es ModSecurity?

ModSecurity es un motor de WAF de código abierto que proporciona una potente protección para aplicaciones web. Funciona analizando el tráfico HTTP(S) en tiempo real, aplicando un conjunto de reglas para detectar y prevenir ataques como:

  • Inyección SQL
  • Cross-Site Scripting (XSS)
  • Inclusión de Archivos Remotos (RFI)
  • Inclusión de Archivos Locales (LFI)
  • Denegación de Servicio (DoS)
  • Fuerza bruta
  • Manipulación de sesiones

Utiliza un lenguaje de reglas flexible para definir patrones de ataque y acciones a tomar (bloquear, registrar, alertar).

¿Por qué integrarlo con Nginx?

Nginx, por sí mismo, no incluye funcionalidades WAF. Al compilar Nginx con el módulo dinámico de ModSecurity, le otorgamos la capacidad de procesar estas reglas de seguridad, funcionando como un proxy inverso inteligente que inspecciona cada solicitud y respuesta.


🎯 Objetivos del Tutorial

Al finalizar este tutorial, serás capaz de:

  • Instalar las dependencias necesarias para ModSecurity.
  • Descargar y compilar Nginx con el módulo dinámico de ModSecurity.
  • Configurar ModSecurity para que funcione con Nginx.
  • Implementar y entender las Core Rule Set (CRS) de OWASP.
  • Probar la configuración de seguridad y monitorear los registros.
Tutorial Completo

🛠️ Requisitos Previos

Antes de empezar, asegúrate de tener lo siguiente:

  • Un servidor Ubuntu 20.04 (o similar distribución basada en Debian) con acceso sudo.
  • Nginx no debe estar ya instalado desde los repositorios, ya que lo compilaremos desde cero.
  • Conocimientos básicos de la línea de comandos de Linux.
🔥 Importante: Compilar Nginx desde la fuente es necesario para añadir el módulo de ModSecurity de forma dinámica. Si ya tienes Nginx instalado de otra manera, deberás desinstalarlo primero o considerar usar un método de compilación de Nginx que añada módulos dinámicos.

⚙️ Paso 1: Preparar el Entorno e Instalar Dependencias

Primero, actualizaremos los paquetes del sistema e instalaremos las herramientas de compilación y las bibliotecas necesarias para ModSecurity.

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential autoconf automake libtool libcurl4-openssl-dev libxml2-dev libpcre3 libpcre3-dev libssl-dev libfuzzy-dev libyajl-dev pkg-config git ca-certificates wget zlib1g-dev libmaxminddb-dev

ModSecurity necesita la biblioteca libmodsecurity. Clona su repositorio y compílala.

cd /usr/local/src
sudo git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
sudo git submodule init
sudo git submodule update
sudo ./build.sh
sudo ./configure
sudo make -j$(nproc)
sudo make install

🚀 Paso 2: Descargar y Compilar Nginx con el Módulo ModSecurity

Ahora descargaremos la última versión estable de Nginx y la compilaremos, incluyendo el módulo dinámico de ModSecurity.

📌 Nota: Consulta la página oficial de Nginx para la versión más reciente. En este tutorial usaremos la versión 1.24.0.

Descargar Nginx

cd /usr/local/src
sudo wget http://nginx.org/download/nginx-1.24.0.tar.gz
sudo tar -xvzf nginx-1.24.0.tar.gz
cd nginx-1.24.0

Descargar el Módulo Nginx Connector para ModSecurity

Necesitamos un conector que permita a Nginx interactuar con la biblioteca libmodsecurity.

sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git

Compilar Nginx

Ahora compilaremos Nginx con el módulo dinámico de ModSecurity. Usaremos las opciones de compilación comunes para un servidor Nginx.

sudo ./configure --prefix=/etc/nginx \
    --sbin-path=/usr/sbin/nginx \
    --modules-path=/usr/lib/nginx/modules \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/run/nginx.lock \
    --http-client-body-temp-path=/var/cache/nginx/client_temp \
    --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
    --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
    --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
    --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
    --user=nginx \
    --group=nginx \
    --with-compat \
    --with-file-aio \
    --with-threads \
    --with-http_addition_module \
    --with-http_auth_request_module \
    --with-http_dav_module \
    --with-http_flv_module \
    --with-http_gunzip_module \
    --with-http_gzip_static_module \
    --with-http_mp4_module \
    --with-http_random_index_module \
    --with-http_realip_module \
    --with-http_slice_module \
    --with-http_ssl_module \
    --with-http_sub_module \
    --with-http_v2_module \
    --with-mail \
    --with-mail_ssl_module \
    --with-stream \
    --with-stream_ssl_module \
    --with-stream_ssl_preread_module \
    --with-cc-opt='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wno-ignored-qualifiers -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -fasynchronous-unwind-tables -Wl,-z,relro -Wl,-z,now -speculation-safe-indirect-calls -fPIC' \
    --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' \
    --add-dynamic-module=./ModSecurity-nginx

sudo make -j$(nproc)
sudo make install

Después de la instalación, crea el usuario y grupo nginx, y las carpetas de caché y logs:

sudo useradd --system --home /nonexistent --shell /bin/false --no-create-home --uid 999 nginx
sudo mkdir -p /var/cache/nginx /var/log/nginx
sudo chown -R nginx:nginx /var/cache/nginx /var/log/nginx
sudo chmod 755 /var/cache/nginx /var/log/nginx

Verifica que Nginx se haya instalado correctamente y que el módulo de ModSecurity esté disponible:

nginx -V 2>&1 | grep -i modsecurity

Deberías ver una salida similar a configure arguments: ... --add-dynamic-module=./ModSecurity-nginx. Esto confirma que el módulo fue enlazado.


🔩 Paso 3: Configurar ModSecurity

Ahora necesitamos configurar ModSecurity. Esto implica copiar el archivo de configuración de ejemplo y crear un directorio para las reglas.

Directorio de Configuración de ModSecurity

sudo mkdir /etc/nginx/modsecurity
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsecurity/modsecurity.conf
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsecurity/

Edita modsecurity.conf:

sudo nano /etc/nginx/modsecurity/modsecurity.conf

Cambia SecRuleEngine DetectionOnly a SecRuleEngine On para habilitar el motor de reglas.

# De:
# SecRuleEngine DetectionOnly
# A:
SecRuleEngine On

También es buena idea configurar el SecAuditLog para registrar los detalles de las solicitudes bloqueadas. Puedes ajustar la ruta y el formato según sea necesario.

# Asegúrate de que esta línea esté habilitada y apunte a un archivo log:
SecAuditLog /var/log/modsecurity_audit.log

# Puedes ajustar el nivel de detalle del log (1-9, siendo 9 el más detallado)
SecAuditLogParts ABCEFHJKZ
SecAuditLogType Concurrent

Crear Archivo de Configuración para Nginx

Crea un archivo de configuración para que Nginx cargue ModSecurity:

sudo nano /etc/nginx/modsecurity.conf

Añade lo siguiente:

load_module modules/ngx_http_modsecurity_module.so;

modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf;

📂 Paso 4: Instalar las Reglas OWASP Core Rule Set (CRS)

Las reglas de OWASP CRS son un conjunto genérico de reglas WAF que protegen contra una amplia gama de ataques web, incluyendo OWASP Top 10. Son esenciales para una protección efectiva.

cd /etc/nginx/modsecurity
sudo git clone https://github.com/OWASP/crs.git
sudo mv crs owasp-crs
cd owasp-crs
sudo cp crs-setup.conf.example crs-setup.conf
sudo cp rules/REQUEST-900-EXCLUSION-RULES-CRS.conf.example rules/REQUEST-900-EXCLUSION-RULES-CRS.conf

Ahora, necesitamos incluir estas reglas en nuestro archivo modsecurity.conf. Abre el archivo:

sudo nano /etc/nginx/modsecurity/modsecurity.conf

Al final del archivo, añade las siguientes líneas. Estas incluyen el archivo de configuración principal de CRS y luego todas las reglas individuales.

# OWASP CRS v3
Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf
⚠️ Advertencia: Las reglas CRS pueden ser muy detalladas y, en ocasiones, generar falsos positivos con aplicaciones legítimas. Es crucial probar a fondo tu aplicación después de habilitarlas y ajustar las exclusiones según sea necesario.

📝 Paso 5: Configurar Nginx para usar ModSecurity

Ahora integraremos el WAF en la configuración de Nginx. Editaremos el archivo principal nginx.conf y el archivo de configuración del sitio.

Configuración Global de Nginx

Edita nginx.conf:

sudo nano /etc/nginx/nginx.conf

Carga el módulo ModSecurity al inicio del bloque http:

# ... otras configuraciones

http {
    include /etc/nginx/modsecurity.conf; # Añade esta línea

    # ... otras configuraciones

    server {
        # ... tu configuración de servidor
    }
}
📌 Nota: Si instalaste Nginx con `--add-dynamic-module` y usaste `load_module` en el archivo `/etc/nginx/modsecurity.conf`, Nginx cargará el módulo al inicio. Si `modsecurity on;` y `modsecurity_rules_file` están dentro del bloque `http` o `server`, ModSecurity se aplicará a esos contextos.

Configuración del Sitio (Bloque server)

Crea un archivo de configuración para tu sitio web, por ejemplo, default.conf:

sudo nano /etc/nginx/sites-available/default

Y habilita el sitio:

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

Dentro de tu bloque server (o location), habilita ModSecurity. Para este ejemplo, configuraremos un server básico que escucha en el puerto 80 y aplica ModSecurity.

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        # Habilita ModSecurity para esta ubicación (o para todo el servidor si lo pones en el bloque server)
        modsecurity on;
        modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf;
        # Puedes especificar reglas adicionales aquí o en un archivo distinto
        # modsecurity_rules 'SecRuleEngine On';
        # modsecurity_rules 'SecRule ARGS "@rfi" "id:123,deny,status:403"';

        try_files $uri $uri/ =404;
    }

    # Puedes añadir un bloque de log para ModSecurity si no lo configuraste globalmente
    error_log /var/log/nginx/modsec_error.log warn;

}

Guarda los cambios y verifica la sintaxis de Nginx:

sudo nginx -t

Si no hay errores, reinicia Nginx para aplicar los cambios:

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl restart nginx

🧪 Paso 6: Probar la Configuración de ModSecurity

Ahora es el momento de verificar si ModSecurity está protegiendo tu aplicación. Intentaremos simular un ataque XSS y una inyección SQL.

Prueba de XSS (Cross-Site Scripting)

Abre tu navegador y navega a la IP o dominio de tu servidor. Luego, intenta acceder a una URL con un payload XSS conocido:

http://tu_ip_o_dominio/?q=<script>alert('XSS')</script>

ModSecurity debería bloquear la solicitud y mostrar un error 403 Forbidden. Revisa los logs de Nginx y ModSecurity:

sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/modsecurity_audit.log

Deberías ver entradas en modsecurity_audit.log indicando que una regla fue activada y la solicitud fue bloqueada.

Prueba de SQL Injection

Intenta una URL con un payload de inyección SQL:

http://tu_ip_o_dominio/?id=1%20OR%20'1'%3D'1'

De nuevo, ModSecurity debería interceptar esto y registrar el evento. Deberías recibir un error 403.

🔥 Importante: Si las pruebas no bloquean las solicitudes, verifica que `SecRuleEngine On` esté configurado correctamente en `modsecurity.conf` y que el archivo `modsecurity.conf` esté incluido en el bloque `server` o `location` de tu configuración de Nginx.
Cliente Nginx Módulo ModSec Motor ModSec OWASP CRS Aplicación Web Bloqueo / Log HTTP 403 Petición Limpia Ataque Respuesta denegada al cliente Flujo de Tráfico con ModSecurity

📊 Monitoreo y Mantenimiento

ModSecurity, especialmente con OWASP CRS, requiere monitoreo y posible ajuste. Los falsos positivos (bloqueo de tráfico legítimo) son comunes al principio.

Logs de ModSecurity

El archivo modsecurity_audit.log es tu mejor amigo. Contiene detalles exhaustivos sobre cada solicitud que activó una regla, incluyendo los datos de la solicitud, la respuesta y la regla específica que se activó.

Utiliza comandos como grep y less para analizar los logs:

sudo grep "ModSecurity: Access denied" /var/log/modsecurity_audit.log | less

Gestión de Falsos Positivos

Si una solicitud legítima es bloqueada, necesitarás crear reglas de exclusión. Esto se hace típicamente en un archivo separado, como owasp-crs/rules/REQUEST-900-EXCLUSION-RULES-CRS.conf o creando un nuevo archivo para tus exclusiones. Por ejemplo, si una URL específica GET /api/legit-endpoint?data=malicious_looking_string siempre es bloqueada por una regla de inyección SQL, podrías añadir una exclusión:

# Ejemplo de exclusión en un archivo .conf incluido por ModSecurity
SecRule ARGS:data "@contains malicious_looking_string" "id:9999999,phase:2,pass,nolog,noaudit,ctl:ruleEngine=Off"
⚠️ Advertencia: Las reglas de exclusión deben ser muy específicas para evitar crear nuevos agujeros de seguridad. Intenta excluir solo el parámetro afectado o la URL específica, y no deshabilitar reglas generales sin un buen motivo.

Actualización de Nginx y ModSecurity

Como Nginx y ModSecurity fueron compilados desde la fuente, las actualizaciones no se realizarán automáticamente con apt. Deberás repetir el proceso de compilación para instalar nuevas versiones de Nginx o ModSecurity.

¿Por qué no usar el paquete de Nginx precompilado?Los paquetes de Nginx en los repositorios estándar no suelen incluir el módulo ModSecurity. Para una integración completa y flexibilidad con ModSecurity, compilar desde la fuente es el método más común y recomendado. Algunos proveedores o distribuciones pueden ofrecer paquetes Nginx con ModSecurity precompilado, pero no es la norma.

✅ Consideraciones Adicionales y Buenas Prácticas

  • HTTPS: Siempre utiliza HTTPS para cifrar el tráfico. ModSecurity inspecciona el tráfico después de que Nginx lo descifra (si Nginx es el terminador SSL/TLS), por lo que seguirá funcionando correctamente.
  • Firewall de Red: ModSecurity complementa un firewall de red (como ufw o iptables), no lo reemplaza. Usa un firewall de red para bloquear puertos innecesarios.
  • SELinux/AppArmor: Si tu distribución usa SELinux o AppArmor, asegúrate de que las políticas permitan a Nginx y ModSecurity acceder a los archivos de configuración y logs.
  • Rendimiento: ModSecurity añade una sobrecarga de rendimiento. Monitorea el uso de CPU y memoria de tu servidor para asegurarte de que puede manejar la carga.
  • Entorno de Staging: Prueba a fondo todas las reglas y exclusiones en un entorno de staging antes de desplegarlas en producción para minimizar interrupciones.
Paso 1: Habilitar `SecRuleEngine On` en `modsecurity.conf` para protección activa.
Paso 2: Incluir las reglas de OWASP CRS en tu configuración de ModSecurity.
Paso 3: Asegurarse de que `modsecurity on;` esté en los bloques `http`, `server` o `location` de Nginx.
Paso 4: Monitorear `modsecurity_audit.log` para ajustar reglas y evitar falsos positivos.
Paso 5: Realizar pruebas de seguridad exhaustivas después de cualquier cambio en las reglas.

💡 Conclusión

Has logrado instalar y configurar Nginx con ModSecurity, transformando tu servidor web en un robusto Web Application Firewall. Esta combinación proporciona una defensa fundamental contra una amplia gama de ataques web, protegiendo tus aplicaciones y datos. Recuerda que la seguridad es un proceso continuo; el monitoreo, la actualización de reglas y la adaptación a nuevas amenazas son esenciales para mantener una postura de seguridad sólida.

¡Felicidades por fortalecer la seguridad de tus aplicaciones web!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!