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:

Prueba ModSecurity

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.

También te podría gustar...