Cómo instalar ModSecurity 3 con Nginx en Ubuntu 22.04

La seguridad de los sitios y aplicaciones web puede ser una tarea difícil para cualquier administrador de sistemas. Hay muchas herramientas de código abierto disponibles para proteger tu sitio web de ataques DDoS. ModSecurity es un cortafuegos de aplicaciones web (WAF) gratuito y de código abierto que protege tu sitio web de varios tipos de ataques, como los de secuencia de comandos en sitios cruzados (XSS), inyección SQL, secuestro de sesión y muchos más.

En este tutorial, te mostraré cómo instalar ModSecurity con Nginx en Ubuntu 22.04.

Requisitos previos

  • Un servidor que ejecute Ubuntu 22.04.
  • Una contraseña de root configurada en el servidor.

Cómo empezar

En primer lugar, se recomienda actualizar y poner al día todos tus paquetes de software a la última versión. Puedes actualizarlos todos ejecutando el siguiente comando:

apt update -y
apt upgrade -y

Una vez actualizados todos los paquetes, instala otros paquetes necesarios con el siguiente comando:

apt install g++ flex bison curl apache2-dev doxygen libyajl-dev ssdeep liblua5.2-dev libgeoip-dev libtool dh-autoreconf libcurl4-gnutls-dev libxml2 libpcre++-dev libxml2-dev git liblmdb-dev libpkgconf3 lmdb-doc pkgconf zlib1g-dev libssl-dev -y

Una vez que hayas terminado, puedes continuar con el siguiente paso.

Instalar ModSecurity en Ubuntu 22.04

Por defecto, el paquete ModSecurity no está incluido en el repositorio por defecto de Ubuntu. Así que tendrás que compilarlo desde el código fuente.

Primero, descarga la última versión de ModSecurity con el siguiente comando:

wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.8/modsecurity-v3.0.8.tar.gz

Una vez finalizada la descarga, extrae el archivo descargado con el siguiente comando:

tar -xvzf modsecurity-v3.0.8.tar.gz

A continuación, navega hasta el directorio extraído y configúralo con el siguiente comando:

cd modsecurity-v3.0.8
./build.sh
./configure

A continuación, instálalo con el siguiente comando:

make
make install

Instalar Nginx con soporte ModSecurity 3

A continuación, tendrás que instalar Nginx con soporte ModSecurity. Primero, descarga el conector ModSecurity-nginx con el siguiente comando:

cd ~
git clone https://github.com/SpiderLabs/ModSecurity-nginx.git

A continuación, descarga el código fuente de Nginx con el siguiente comando:

wget https://nginx.org/download/nginx-1.20.2.tar.gz

A continuación, extrae el código fuente de Nginx con el siguiente comando:

tar xzf nginx-1.20.2.tar.gz

A continuación, crea un usuario para Nginx con el siguiente comando:

useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx

A continuación, cambia el directorio al código fuente de Nginx y configúralo con el siguiente comando:

cd nginx-1.20.2
./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-compat --with-http_ssl_module --with-http_realip_module --add-dynamic-module=/root/ModSecurity-nginx --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

A continuación, instálalo con el siguiente comando

make
make modules
make install

A continuación, crea un enlace simbólico de Nginx con el siguiente comando:

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

A continuación, verifica la versión de Nginx con el siguiente comando:

nginx -V

Obtendrás la versión de Nginx en la siguiente salida:

nginx version: nginx/1.20.2
built by gcc 11.2.0 (Ubuntu 11.2.0-19ubuntu1) 
built with OpenSSL 3.0.2 15 Mar 2022
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --with-pcre-jit --with-debug --with-compat --with-http_ssl_module --with-http_realip_module --add-dynamic-module=/root/ModSecurity-nginx --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log

Una vez que hayas terminado, puedes proceder a configurar Nginx con ModSecurity.

Configurar Nginx con ModSecurity

A continuación, copia los archivos de configuración de ejemplo con el siguiente comando:

cp ~/modsecurity-v3.0.8/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp ~/modsecurity-v3.0.8/unicode.mapping /usr/local/nginx/conf/

A continuación, haz una copia de seguridad del archivo de configuración de Nginx:

cp /usr/local/nginx/conf/nginx.conf{,.bak}

A continuación, edita el archivo de configuración de Nginx:

nano /usr/local/nginx/conf/nginx.conf

Elimina las líneas por defecto y añade las siguientes

load_module modules/ngx_http_modsecurity_module.so;
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  nginx.example.com;
        modsecurity  on;
        modsecurity_rules_file  /usr/local/nginx/conf/modsecurity.conf;
        access_log  /var/log/nginx/access_example.log;
        error_log  /var/log/nginx/error_example.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, luego habilita el ModSecurity con el siguiente comando:

sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsecurity.conf

Una vez que hayas terminado, puedes pasar al siguiente paso.

Instalar el Conjunto de Reglas Básicas de ModSecurity

El ModSecurity Core Rule Set de OWASP proporciona un conjunto de reglas para detectar y proteger una amplia gama de ataques, incluidos los Top Ten de OWASP, con un mínimo de falsas alertas.

Primero, descarga el conjunto de reglas OWASP con el siguiente comando:

cd
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs

A continuación, cambia el nombre del archivo crs-setup.conf.example por crs-setup.conf:

cp /usr/local/nginx/conf/owasp-crs/crs-setup.conf{.example,}

A continuación, define las reglas con el siguiente comando:

echo -e "Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf" >> /usr/local/nginx/conf/modsecurity.conf

A continuación, comprueba si Nginx tiene algún error de configuración con el siguiente comando:

nginx -t

Si todo va bien, obtendrás 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

Una vez que hayas terminado, puedes continuar con el siguiente paso.

Crear un archivo de servicio Systemd para Nginx

A continuación, tendrás que crear un archivo de servicio systemd para gestionar el servicio Nginx. Así podrás iniciar y detener el servicio Nginx a través de systemd. Puedes crearlo con el siguiente comando:

nano /etc/systemd/system/nginx.service

Añade las siguientes líneas:

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/local/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

Guarda y cierra el archivo, luego vuelve a cargar el demonio systemd para aplicar los cambios:

systemctl daemon-reload

A continuación, inicia y habilita Nginx con el siguiente comando:

systemctl start nginx
systemctl enable nginx

Puedes comprobar el estado de Nginx con el siguiente comando:

systemctl status nginx

Deberías ver la siguiente salida:

? nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/etc/systemd/system/nginx.service; disabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-10-11 15:40:39 UTC; 6s ago
       Docs: man:nginx(8)
    Process: 68438 ExecStartPre=/usr/local/nginx/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 68439 ExecStart=/usr/local/nginx/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 68440 (nginx)
      Tasks: 2 (limit: 4579)
     Memory: 20.0M
        CPU: 293ms
     CGroup: /system.slice/nginx.service
             ??68440 "nginx: master process /usr/local/nginx/sbin/nginx -g daemon on; master_process on;"
             ??68441 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >

Oct 11 15:40:38 ubuntu2204 systemd[1]: Starting A high performance web server and a reverse proxy server...
Oct 11 15:40:39 ubuntu2204 systemd[1]: Started A high performance web server and a reverse proxy server.

Una vez que hayas terminado, puedes continuar con el siguiente paso.

Verificar ModSecurity

Después de instalar y configurar Modsecurity con Nginx. Es hora de probarlo. Ejecuta el siguiente comando para probar Modsecurity contra la inyección de comandos:

curl localhost?doc=/bin/ls

Si todo va bien, obtendrás el mensaje «403 Prohibido».

<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.2</center>
</body>
</html>

También puedes comprobar el registro de Modsecurity con el siguiente comando:

tail /var/log/modsec_audit.log

Deberías ver el log de ModSecurity en la siguiente salida:

ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:doc' (Value: `/bin/ls' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/ls found within ARGS:doc: /bin/ls"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION"] [tag "WASCTC/WASC-31"] [tag "OWASP_TOP_10/A1"] [tag "PCI/6.5.2"] [hostname "127.0.0.1"] [uri "/"] [unique_id "166550286018.572845"] [ref "o1,6v10,7t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]
ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `5' ) [file "/usr/local/nginx/conf/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "80"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [data ""] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "127.0.0.1"] [uri "/"] [unique_id "166550286018.572845"] [ref ""]

---IcTYGSZl---I--

---IcTYGSZl---J--

---IcTYGSZl---Z--

Conclusión

Enhorabuena! has instalado con éxito ModSecurity con Nginx en Ubuntu 22.04. Ahora puedes implementar ModSecurity en tu entorno de producción para defenderte de los ataques DDoS. No dudes en preguntarme si tienes alguna duda.

Scroll al inicio