Instalar ModSecurity en Ubuntu
Paso 1: Instalar dependencias necesarias
Primero, necesitas algunas dependencias. Abre una terminal y ejecuta:
sudo apt-get update sudo apt-get install libpcre3 libpcre3-dev libxml2 libxml2-dev libaprutil1 libaprutil1-dev libssl-dev
Paso 2: Descargar e instalar ModSecurity
Vamos a descargar y compilar ModSecurity:
- Descargar ModSecurity en Ubuntu:
cd /usr/local/src sudo git clone https://github.com/SpiderLabs/ModSecurity cd ModSecurity sudo git checkout v3/master sudo git submodule init sudo git submodule update
- Compilar e instalar ModSecurity:
sudo ./build.sh sudo ./configure sudo make sudo make install
Paso 3: Descargar e instalar el conector de Nginx
Ahora necesitamos el conector para Nginx:
- Descargar el conector:
cd /usr/local/src sudo git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
- Descargar y compilar Nginx con el módulo ModSecurity:
cd /usr/local/src sudo wget http://nginx.org/download/nginx-1.18.0.tar.gz sudo tar -xzvf nginx-1.18.0.tar.gz cd nginx-1.18.0 sudo ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx sudo make modules sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
Paso 4: Configurar Nginx para usar ModSecurity
- Editar la configuración de Nginx: Abre tu archivo de configuración principal de Nginx, normalmente ubicado en
/etc/nginx/nginx.conf
, y añade las siguientes líneas:
load_module modules/ngx_http_modsecurity_module.so; http { ... modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf; ... }
- Configurar ModSecurity: Vamos a crear un archivo de configuración principal para ModSecurity:
sudo mkdir /etc/nginx/modsec sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
Abre el archivo /etc/nginx/modsec/modsecurity.conf
y cambia la línea SecRuleEngine DetectionOnly
a SecRuleEngine On
para activar la protección activa.
- Añadir reglas de OWASP: Descarga y configura las reglas básicas de OWASP:
cd /etc/nginx/modsec sudo git clone https://github.com/coreruleset/coreruleset.git sudo mv coreruleset/crs-setup.conf.example coreruleset/crs-setup.conf
Luego, edita el archivo /etc/nginx/modsec/main.conf
y añade las siguientes líneas para incluir las reglas de OWASP:
sudo nano /etc/nginx/modsec/main.conf
Añade estas líneas:
Include /etc/nginx/modsec/modsecurity.conf Include /etc/nginx/modsec/coreruleset/crs-setup.conf Include /etc/nginx/modsec/coreruleset/rules/*.conf
Paso 5: Reiniciar Nginx
Finalmente, reinicia Nginx para que los cambios surtan efecto:
sudo systemctl restart nginx
Verificación
Para verificar que ModSecurity está funcionando, puedes revisar los logs de Nginx o crear una regla de prueba:
echo 'SecRule ARGS:testparam "@contains test" "id:1234,deny,log,status:403,msg:\'Test ModSecurity Rule Matched\'"' | sudo tee -a /etc/nginx/modsec/main.conf
Luego, intenta acceder a una URL con el parámetro testparam=test
(por ejemplo, http://tusitio.com/?testparam=test
). Deberías ver un mensaje de bloqueo en los logs de Nginx.
Habilitar ModSecurity para un sitio específico
Vamos a ver cómo se puede hacer esto:
- Configurar ModSecurity en el bloque de servidor específico: Abre el archivo de configuración del servidor virtual para el sitio donde deseas habilitar ModSecurity. Esto suele estar en
/etc/nginx/sites-available/
o en el archivo principal de configuración de Nginx.
sudo nano /etc/nginx/sites-available/tu-sitio
- Añadir configuración de ModSecurity: Dentro del bloque
server {}
del sitio específico, añade las directivas para habilitar ModSecurity. Aquí hay un ejemplo:
server { listen 80; server_name tu-sitio.com; root /var/www/tu-sitio; modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf; location / { try_files $uri $uri/ =404; } }
- Configurar ModSecurity para ubicaciones específicas (opcional): Si deseas habilitar ModSecurity solo para ciertas ubicaciones dentro de tu sitio, puedes hacerlo dentro del bloque
location {}
:
server { listen 80; server_name tu-sitio.com; root /var/www/tu-sitio; location /protegido { modsecurity on; modsecurity_rules_file /etc/nginx/modsec/main.conf; try_files $uri $uri/ =404; } location / { try_files $uri $uri/ =404; } }
Reiniciar Nginx
Después de hacer estos cambios, asegúrate de verificar la configuración de Nginx y reiniciarlo:
- Verificar la configuración:
sudo nginx -t
- Reiniciar Nginx:
sudo systemctl restart nginx
Verificación
Para verificar que ModSecurity está funcionando solo para el sitio o ubicación específica, puedes revisar los logs de Nginx o crear una regla de prueba, como lo hicimos antes:
echo 'SecRule ARGS:testparam "@contains test" "id:1234,deny,log,status:403,msg:\'Test ModSecurity Rule Matched\'"' | sudo tee -a /etc/nginx/modsec/main.conf
Luego, intenta acceder a una URL con el parámetro testparam=test
en la parte del sitio protegida por ModSecurity (por ejemplo, http://tu-sitio.com/protegido?testparam=test
). Deberías ver un mensaje de bloqueo en los logs de Nginx solo para esa parte del sitio.
Con esta configuración, puedes ajustar ModSecurity de manera granular, habilitándolo solo en los sitios o ubicaciones que consideres necesario.
Monitorización de ModSecurity
- Configurar el archivo de log: ModSecurity puede escribir sus logs en un archivo separado. Asegúrate de que tu archivo de configuración principal de ModSecurity en Ubuntu(
modsecurity.conf
) está configurado para registrar eventos:
sudo nano /etc/nginx/modsec/modsecurity.conf
Busca y ajusta las siguientes líneas para activar los logs y definir el archivo de log:
SecAuditEngine RelevantOnly SecAuditLog /var/log/nginx/modsec_audit.log SecAuditLogParts ABIJDEFHZ
SecAuditEngine RelevantOnly
asegura que solo los eventos relevantes se registren.SecAuditLog /var/log/nginx/modsec_audit.log
define la ubicación del archivo de log.SecAuditLogParts ABIJDEFHZ
define las partes del log que se registrarán.
- Revisar los logs: Puedes usar herramientas como
tail
para monitorear los logs en tiempo real:
sudo tail -f /var/log/nginx/modsec_audit.log
Busca entradas que indiquen eventos de detección, revisa los detalles del ataque detectado y determina si es un falso positivo.
Ajuste de Reglas
- Identificar falsos positivos: Al revisar los logs, si identificas que ModSecurity está detectando algo que no es un ataque (falso positivo), anota el
id
de la regla y los detalles del evento. - Crear excepciones: Puedes crear excepciones para reglas específicas en el archivo de configuración de reglas de ModSecurity (
main.conf
). Por ejemplo, si la regla conid
981176 está generando falsos positivos, puedes deshabilitarla para un sitio específico o en general:
SecRuleRemoveById 981176
Añade esta línea al archivo /etc/nginx/modsec/main.conf
o en un archivo de configuración específico para un sitio en particular:
sudo nano /etc/nginx/modsec/main.conf
- Ajustar reglas específicas: Si necesitas ajustar una regla específica, puedes modificarla o crear una nueva regla en el archivo de configuración. Por ejemplo:
SecRule ARGS:testparam "@contains test" "id:1234,phase:2,deny,log,status:403,msg:'Test ModSecurity Rule Matched'"
Prácticas adicionales
- Configurar un servidor de logs centralizado: Para facilitar la monitorización, considera configurar un servidor de logs centralizado como ELK Stack (Elasticsearch, Logstash, Kibana). Esto te permitirá visualizar y analizar los logs de ModSecurity de manera más eficiente.
- Configurar alertas: Puedes configurar alertas para eventos específicos usando herramientas como
swatch
ologwatch
, que te notificarán cuando ocurran ciertos tipos de eventos en los logs de ModSecurity.
Ejemplo de ajuste de regla:
Supongamos que encuentras un falso positivo relacionado con una regla que detecta ciertos parámetros en las URLs. Puedes deshabilitar la regla problemática o ajustarla para que sea menos estricta.
- Identificar la regla en el log:
Message: Warning. Pattern match "(?:\\b(?:(?:s(?:elect\\b.{1,100}?\\b(?:from|where)|(?:how\\s*to\\s*)?grant\\s*execute(?:\\s*on\\s*procedure|\\s*any))|c(?:on(?:vert\\b.{1,100}?\\b(...." at ARGS:testparam. [file "/etc/nginx/modsec/coreruleset/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [line "209"] [id "942260"] [rev "2"] [msg "Detects MySQL comment-/space-obfuscated injections and backtick termination"] [data "Matched Data: select from found within ARGS:testparam: select from users where 1=1"]
- Deshabilitar la regla (si es un falso positivo):
SecRuleRemoveById 942260
Añade esta línea al archivo /etc/nginx/modsec/main.conf
o a la configuración específica de tu sitio.
- Revisar y ajustar: Si la regla es necesaria pero demasiado estricta, puedes ajustar su lógica. Esto puede requerir conocimientos avanzados sobre cómo funcionan las reglas de ModSecurity.
Reiniciar Nginx
Cada vez que hagas cambios en la configuración de ModSecurity, asegúrate de verificar la configuración y reiniciar Nginx:
- Verificar la configuración:
sudo nginx -t
- Reiniciar Nginx:
sudo systemctl restart nginx
Con estos pasos, deberías poder monitorizar y ajustar ModSecurity de manera efectiva, permitiéndote afinar la configuración y asegurar tu sitio sin causar falsos positivos.
Deja un comentario