LibModSecurity es un cortafuegos de aplicaciones web gratuito y de código abierto que se puede utilizar para proteger un servidor Nginx de diferentes tipos de ataques cibernéticos. Viene con un conjunto de reglas básicas que incluye inyección de SQL, secuencias de comandos entre sitios, troyanos y muchos más. Funciona al monitorear el tráfico HTTP en tiempo real y lucha contra las vulnerabilidades utilizando el conjunto de reglas básicas de OWASP ModSecurity. Se puede usar con Apache, Nginx e IIS y también es compatible con Debian, Ubuntu y CentOS.
En este tutorial, le mostraremos cómo descargar y compilar LibModSecurity con soporte Nginx en CentOS 8.
Requisitos
- Un servidor que ejecuta CentOS 8.
- Se configura una contraseña raíz en el servidor.
Cómo empezar
Antes de comenzar, actualice su servidor con la última versión usando el siguiente comando:
dnf update
Una vez que su servidor esté actualizado, reinícielo para aplicar los cambios.
Instalar dependencias y repositorios necesarios
Primero, instale el repositorio EPEL y REMI en su sistema. Puede 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
Luego, instala todas las dependencias requeridas 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 que todos los paquetes estén instalados, puede instalar otras dependencias usando el repositorio de PowerTool:
dnf --enablerepo=PowerTools install doxygen yajl-devel
Luego, instale GeoIP usando el repositorio REMI ejecutando el siguiente comando:
dnf --enablerepo=remi install GeoIP-devel
Una vez que todos los paquetes estén instalados, puede continuar con el siguiente paso.
Descargar y compilar LibModsecurity
Primero, deberá descargar la fuente de LibModsecurity y compilarla en su sistema. Para hacerlo, cambie el directorio a /opt y descargue la última versión de LibModsecurity desde el repositorio de Git:
cd /opt/
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
A continuación, cambie el directorio a ModSecurity y descargue el código libInjection con el siguiente comando:
cd ModSecurity
git submodule init
git submodule update
A continuación, configure LibModsecurity con el siguiente comando:
./build.sh
./configure
Finalmente, compile e instale LibModSecurity con el siguiente comando:
make
make install
En este punto, LibModsecurity se ha instalado en su sistema. Ahora puede proceder a instalar Nginx con soporte de LibModsecurity.
Descargar y compilar Nginx con soporte de LibModsecurity
Primero, deberá 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, deberá descargar Nginx y compilarlo con soporte de LibModsecurity.
Para hacerlo, primero descargue el conector ModSecurity-nginx del repositorio de Git con el siguiente comando:
cd /opt
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
A continuación, descargue 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, extraiga el archivo descargado usando el siguiente comando:
tar -xvzf nginx-1.17.6.tar.gz
A continuación, cambie el directorio Nginx y configúrelo 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, instale Nginx con el siguiente comando:
make
make install
En este punto, Nginx se ha instalado con soporte de LibModsecurity. Ahora puede proceder a configurar Nginx.
Configurar Nginx con ModSecurity
Primero, deberá copiar el archivo de configuración de muestra de ModSecurity del directorio de origen de Nginx al directorio de configuración de Nginx.
Puede 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, cree 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, cree el directorio de registro de Nginx con el siguiente comando:
mkdir /var/log/nginx
A continuación, abra el archivo de configuración de Nginx con el siguiente comando:
nano /usr/local/nginx/conf/nginx.conf
Realice 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; } } }
Guarde y cierre el archivo cuando haya terminado. Luego, verifique Nginx por cualquier error de sintaxis con el siguiente comando:
nginx -t
Debería ver el siguiente resultado:
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 se ha configurado. Puede proceder a crear un archivo de servicio systemd para Nginx.
Crear un archivo de servicio Systemd para Nginx
A continuación, deberá crear un archivo systemd para administrar el servicio Nginx. Puedes crearlo con el siguiente comando:
nano /etc/systemd/system/nginx.service
Agregue 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
Guarde y cierre el archivo cuando haya terminado. Luego, vuelva a cargar el demonio systemd con el siguiente comando:
systemctl daemon-reload
A continuación, inicie el servicio Nginx y habilítelo para que se inicie después de reiniciar el sistema con el siguiente comando:
systemctl start nginx
systemctl enable --now nginx
Debería ver el siguiente resultado:
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.
A continuación, verifique el servicio Nginx con el siguiente comando:
systemctl status nginx
Debería ver el siguiente resultado:
? 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 puede proceder a configurar ModSecurity.
Configurar ModeSecurity
De forma predeterminada, ModSecurity está configurado en modo de solo detección. Por lo tanto, deberá activar el motor de reglas de ModSecurity. Puedes hacerlo editando el archivo modsecurity.conf:
nano /usr/local/nginx/conf/modsecurity.conf
Busque la siguiente línea:
SecRuleEngine DetectionOnly
Y reemplácelo con la siguiente línea:
SecRuleEngine On
Busque también la siguiente línea:
/var/log/modsec_audit.log
Y reemplácelo con la siguiente línea:
/var/log/nginx/modsec_audit.log
Guarde y cierre el archivo cuando haya terminado.
A continuación, descargue la última versión de ModSecurity Core Rule Set desde el repositorio de Git usando el siguiente comando:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs
Una vez descargado, cambie el nombre del archivo de configuración de ejemplo de CRS 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, configure ModeSecurity para usar estas reglas editando el archivo /usr/local/nginx/conf/modsecurity.conf:
nano /usr/local/nginx/conf/modsecurity.conf
Agregue las siguientes líneas al final del archivo:
Include owasp-crs/crs-setup.conf Include owasp-crs/rules/*.conf
Guarde y cierre el archivo cuando haya terminado. Luego, reinicie el servicio Nginx para implementar los cambios:
systemctl restart nginx
Prueba ModSecurity
ModSecurity ahora está instalado y configurado. Es hora de probar si funciona o no.
Para probar ModSecurity contra la inyección de comandos, abra su navegador web y escriba la URL http://localhost/index.html?exec=/bin/bash. Debería ver el error 403 Prohibido en la siguiente página:
Para probar ModSecurity contra ataques CSS, abra su terminal y ejecute el siguiente comando:
curl http://localhost/?q="><script>alert(1)</script>"
Deberías obtener el siguiente resultado:
<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
¡Felicidades! ha descargado y compilado con éxito LibModSecurity con Nginx. Su servidor ahora está protegido contra varios ataques. Para obtener más información, puede visitar la documentación de ModSecurity en ModSecurity Doc.