Instalar el Firewall de Aplicaciones Web de LibModsecurity con Nginx en CentOS 8
LibModSecurity es un cortafuegos de aplicaciones web gratuito y de código abierto que puede utilizarse para proteger un servidor Nginx de diferentes tipos de ciberataques. Viene con un conjunto de reglas básicas que incluyen, inyección SQL, cross-site scripting, troyanos y muchas más. Funciona monitorizando el tráfico HTTP en tiempo real y luchando contra las vulnerabilidades mediante el conjunto de reglas básicas de OWASP ModSecurity. Se puede utilizar con Apache, Nginx e IIS y también es compatible con Debian, Ubuntu y CentOS.
En este tutorial, te mostraremos cómo descargar y compilar LibModSecurity con soporte para Nginx en CentOS 8.
Requisitos
- Un servidor con CentOS 8.
- Una contraseña de root configurada en el servidor.
Cómo empezar
Antes de empezar, actualiza tu servidor con la última versión utilizando el siguiente comando:
dnf update
Una vez que tu servidor esté actualizado, reinícialo para aplicar los cambios.
Instala los repositorios y las dependencias necesarias
Primero, instala el repositorio EPEL y REMI en tu sistema. Puedes instalarlos con el siguiente comando:
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
A continuación, instala todas las dependencias necesarias con el siguiente comando:
dnf install gcc-c++ flex bison yajl curl-devel zlib-devel pcre-devel autoconf automake git curl make libxml2-devel pkgconfig libtool httpd-devel redhat-rpm-config wget openssl openssl-devel nano
Una vez instalados todos los paquetes, puedes instalar otras dependencias utilizando el repositorio de PowerTool:
dnf --enablerepo=PowerTools install doxygen yajl-devel
A continuación, instala GeoIP utilizando el repositorio REMI ejecutando el siguiente comando:
dnf --enablerepo=remi install GeoIP-devel
Una vez instalados todos los paquetes, puedes pasar al siguiente paso.
Descarga y compila LibModsecurity
En primer lugar, tendrás que descargar el código fuente de LibModsecurity y compilarlo en tu sistema. Para ello, cambia el directorio a /opt y descarga la última versión de LibModsecurity del repositorio Git:
cd /opt/
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
A continuación, cambia el directorio a ModSecurity y descarga el código de libInjection con el siguiente comando:
cd ModSecurity
git submodule init
git submodule update
A continuación, configura el LibModsecurity con el siguiente comando:
./build.sh
./configure
Por último, compila e instala LibModSecurity con el siguiente comando:
make
make install
En este punto, LibModsecurity ha sido instalado en tu sistema. Ahora puedes proceder a instalar Nginx con soporte de LibModsecurity.
Descargar y compilar Nginx con soporte de LibModsecurity
En primer lugar, tendrás que crear un usuario y un grupo del sistema para Nginx. Puedes crearlo con el siguiente comando:
useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx
A continuación, tendrás que descargar Nginx y compilarlo con soporte de LibModsecurity.
Para ello, descarga primero el conector ModSecurity-nginx del repositorio Git con el siguiente comando:
cd /opt
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
A continuación, descarga la última versión estable de Nginx con el siguiente comando:
wget http://nginx.org/download/nginx-1.17.6.tar.gz
Una vez descargado, extrae el archivo descargado con el siguiente comando:
tar -xvzf nginx-1.17.6.tar.gz
A continuación, cambia el directorio de Nginx y configúralo con el siguiente comando:
cd nginx-1.17.6
./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/opt/ModSecurity-nginx
A continuación, instala el Nginx con el siguiente comando:
make
make install
Llegados a este punto, Nginx ha sido instalado con soporte de LibModsecurity. Ahora puedes proceder a configurar Nginx.
Configurar Nginx con ModSecurity
En primer lugar, tendrás que copiar el archivo de configuración de ejemplo de ModSecurity del directorio fuente de Nginx al directorio de configuración de Nginx.
Puedes copiarlos con el siguiente comando:
cp /opt/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp /opt/ModSecurity/unicode.mapping /usr/local/nginx/conf/
A continuación, crea un enlace simbólico del binario de Nginx a la ruta /usr/sbin/ con el siguiente comando:
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
A continuación, crea el directorio de registro de Nginx con el siguiente comando:
mkdir /var/log/nginx
A continuación, abre el archivo de configuración de Nginx con el siguiente comando
nano /usr/local/nginx/conf/nginx.conf
Realiza los siguientes cambios:
user nginx; worker_processes 1; pid /run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name your-server-ip; modsecurity on; modsecurity_rules_file /usr/local/nginx/conf/modsecurity.conf; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
Guarda y cierra el archivo cuando hayas terminado. A continuación, comprueba si Nginx tiene algún error de sintaxis con el siguiente comando
nginx -t
Deberías ver la siguiente salida:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
En este punto, Nginx ha sido configurado. Puedes proceder a crear un archivo de servicio systemd para Nginx.
Crear un archivo de servicio Systemd para Nginx
A continuación, tendrás que crear un archivo systemd para gestionar el servicio Nginx. Puedes crearlo con el siguiente comando:
nano /etc/systemd/system/nginx.service
Añade las siguientes líneas:
[Unit] Description=The nginx server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/bin/rm -f /run/nginx.pid ExecStartPre=/usr/sbin/nginx -t ExecStart=/usr/sbin/nginx ExecReload=/bin/kill -s HUP $MAINPID KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=mixed PrivateTmp=true [Install] WantedBy=multi-user.target
Guarda y cierra el archivo cuando hayas terminado. A continuación, recarga el demonio systemd con el siguiente comando
systemctl daemon-reload
A continuación, inicia el servicio Nginx y permite que se inicie tras el reinicio del sistema con el siguiente comando:
systemctl start nginx
systemctl enable --now nginx
Deberías ver la siguiente salida:
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.
A continuación, verifica el servicio Nginx con el siguiente comando:
systemctl status nginx
Deberías ver la siguiente salida:
? nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2019-12-30 10:20:01 EST; 41s ago Process: 17730 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 17728 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Process: 17727 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 17732 (nginx) Tasks: 2 (limit: 6102) Memory: 5.0M CGroup: /system.slice/nginx.service ??17732 nginx: master process /usr/sbin/nginx ??17733 nginx: worker process Dec 30 10:20:00 nginx systemd[1]: Starting The nginx HTTP and reverse proxy server... Dec 30 10:20:00 nginx nginx[17728]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok Dec 30 10:20:00 nginx nginx[17728]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful Dec 30 10:20:01 nginx systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument Dec 30 10:20:01 nginx systemd[1]: Started The nginx HTTP and reverse proxy server.
En este punto, Nginx se ha iniciado y se está ejecutando. Ahora puedes proceder a configurar ModSecurity.
Configurar ModSecurity
Por defecto, ModSecurity está configurado en modo sólo detección. Así que tendrás que activar el motor de reglas de ModSecurity. Puedes hacerlo editando el archivo modsecurity.conf:
nano /usr/local/nginx/conf/modsecurity.conf
Encuentra la siguiente línea:
SecRuleEngine DetectionOnly
Y, sustitúyela por la siguiente línea:
SecRuleEngine On
Encuentra también la siguiente línea:
/var/log/modsec_audit.log
Y, sustitúyela por la siguiente línea:
/var/log/nginx/modsec_audit.log
Guarda y cierra el archivo cuando hayas terminado.
A continuación, descarga la última versión de ModSecurity Core Rule Set del repositorio Git utilizando el siguiente comando:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs
Una vez descargado, cambia el nombre del archivo de configuración del CRS de ejemplo con el siguiente comando:
mv /usr/local/nginx/conf/owasp-crs/crs-setup.conf.example /usr/local/nginx/conf/owasp-crs/crs-setup.conf
A continuación, configura el ModeSecurity para que utilice estas reglas editando el archivo /usr/local/nginx/conf/modsecurity.conf:
nano /usr/local/nginx/conf/modsecurity.conf
Añade las siguientes líneas al final del archivo:
Include owasp-crs/crs-setup.conf Include owasp-crs/rules/*.conf
Guarda y cierra el archivo cuando hayas terminado. A continuación, reinicia el servicio Nginx para aplicar los cambios:
systemctl restart nginx
Probar ModSecurity
Ahora ModSecurity está instalado y configurado. Es hora de probar si funciona o no.
Para probar ModSecurity contra la inyección de comandos, abre tu navegador web y escribe la URL http://localhost/index.html?exec=/bin/bash. Deberías ver el error 403 Forbidden en la siguiente página:
Para probar ModSecurity contra un ataque CSS, abre tu terminal y ejecuta el siguiente comando:
curl http://localhost/?q="><script>alert(1)</script>"
Deberías obtener la siguiente salida:
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.17.6</center> </body> </html>
Conclusión
Enhorabuena! has descargado y compilado con éxito LibModSecurity con Nginx. Ahora tu servidor está protegido contra diversos ataques. Para más información, puedes visitar la documentación de ModSecurity en ModSecurity Doc.