ModSecurity es un cortafuegos de aplicaciones web popular, gratuito y de código abierto que se utiliza para proteger las aplicaciones web contra varios tipos de ataques, incluidos la inyección de SQL, las secuencias de comandos entre sitios y la inclusión de archivos locales. Se emplea con frecuencia para proteger sitios web, cPanel y otros paneles de control de alojamiento. Si bien ModSecurity se diseñó principalmente para el servidor web Apache, también puede funcionar con el servidor web Nginx.
En esta publicación, le mostraremos cómo instalar ModSecurity con Nginx en Rocky Linux 8.
Requisitos
- Un servidor que ejecuta Rocky Linux 8 en Atlantic.Net Cloud Platform
- Una contraseña de root configurada en su servidor
Paso 1:crear el servidor en la nube de Atlantic.Net
Primero, inicie sesión en su servidor en la nube de Atlantic.Net. Cree un nuevo servidor, eligiendo Rocky Linux 8 como sistema operativo con al menos 2 GB de RAM. Conéctese a su servidor en la nube a través de SSH e inicie sesión con las credenciales resaltadas en la parte superior de la página.
Una vez que haya iniciado sesión en su servidor, ejecute el siguiente comando para actualizar su sistema base con los últimos paquetes disponibles.
dnf update -y
Paso 2:instalar las dependencias requeridas
Primero, deberá instalar todas las dependencias requeridas en su servidor. Puede instalarlos todos con el siguiente comando:
dnf install gcc-c++ flex bison yajl curl-devel curl zlib-devel pcre-devel autoconf automake git curl make libxml2-devel pkgconfig libtool httpd-devel redhat-rpm-config git wget openssl openssl-devel vim
dnf --enablerepo=powertools install doxygen yajl-devel -y
Luego, instale los repositorios EPEL y Remi usando el siguiente comando:
dnf install epel-release https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
Luego, instale GeoIP usando el siguiente comando:
dnf --enablerepo=remi install GeoIP-devel -y
Paso 3:instalar ModSecurity
Primero, descargue la última versión de ModSecurity usando el siguiente comando:
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
A continuación, cambie el directorio a ModSecurity e instale los otros módulos con el siguiente comando:
cd ModSecurity git submodule init git submodule update
A continuación, compila e instala ModSecurity con el siguiente comando:
./build.sh ./configure make make install
Paso 4:instale Nginx con compatibilidad con LibModsecurity
Para habilitar la compatibilidad con LibModsecurity en Nginx, deberá compilar Nginx con compatibilidad con LibModsecurity.
Primero, descargue el conector ModSecurity-nginx usando el siguiente comando:
cd ../ 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.19.10.tar.gz
A continuación, extraiga el archivo descargado con el siguiente comando:
tar xzf nginx-1.19.10.tar.gz
A continuación, cree un usuario para Nginx con el siguiente comando:
useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx
A continuación, cambie el directorio a la fuente de Nginx y compílelo con el siguiente comando:
cd nginx-1.19.10 ./configure --user=nginx --group=nginx --with-pcre-jit --with-debug --with-http_ssl_module --with-http_realip_module --add-module=/root/ModSecurity-nginx
Luego, instálalo usando el siguiente comando:
make make install
A continuación, copie el archivo de configuración de ModSecurity de muestra y el archivo de asignación de Unicode con el siguiente comando:
cp /root/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf cp /root/ModSecurity/unicode.mapping /usr/local/nginx/conf/
A continuación, haga una copia de seguridad del archivo de configuración de Nginx:
cp /usr/local/nginx/conf/nginx.conf{,.bak}
A continuación, edite el archivo de configuración de Nginx con el siguiente comando:
nano /usr/local/nginx/conf/nginx.conf
Elimine todas las líneas y agregue las siguientes líneas:
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_kifarunix-demo.log; error_log /var/log/nginx/error_kifarunix-demo.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, luego cree un directorio de registro de Nginx:
mkdir /var/log/nginx
Paso 5:cree un archivo de servicio de Systemd para Nginx
A continuación, deberá crear un archivo de servicio systemd para administrar el servicio Nginx. Puedes crearlo usando el siguiente comando:
nano /etc/systemd/system/nginx.service
Agregue las siguientes líneas:
[Unit] Description=The nginx HTTP and reverse proxy 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, luego cree un enlace simbólico del binario Nginx usando el siguiente comando:
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
A continuación, vuelva a cargar el demonio systemd para aplicar los cambios:
systemctl daemon-reload
A continuación, inicie el servicio Nginx y habilítelo para que se inicie al reiniciar el sistema:
systemctl enable --now nginx
Puede comprobar el estado de Nginx con el siguiente comando:
systemctl status nginx
Obtendrá 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 2021-11-08 09:59:48 UTC; 5s ago Process: 73046 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 73044 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Process: 73043 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 73048 (nginx) Tasks: 2 (limit: 11411) Memory: 3.2M CGroup: /system.slice/nginx.service ├─73048 nginx: master process /usr/sbin/nginx └─73049 nginx: worker process Nov 08 09:59:48 rockylinux systemd[1]: Starting The nginx HTTP and reverse proxy server... Nov 08 09:59:48 rockylinux nginx[73044]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok Nov 08 09:59:48 rockylinux nginx[73044]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful Nov 08 09:59:48 rockylinux systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argument Nov 08 09:59:48 rockylinux systemd[1]: Started The nginx HTTP and reverse proxy server.
Paso 6:habilite la regla ModSecurity
Puede habilitarlo con el siguiente comando:
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsecurity.conf
Además, habilite el registro de auditoría con el siguiente comando:
sed -i 's#/var/log/modsec_audit.log#/var/log/nginx/modsec_audit.log#' /usr/local/nginx/conf/modsecurity.conf
Paso 7:instale el conjunto de reglas básicas de OWASP ModSecurity
OWASP proporciona reglas genéricas de detección de ataques para ModSecurity. Puedes descargarlo con el siguiente comando:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs
A continuación, cambie el nombre del archivo de configuración de la regla OWASP con el siguiente comando:
cp /usr/local/nginx/conf/owasp-crs/crs-setup.conf{.example,}
A continuación, defina la regla OWASP en el archivo de configuración de ModSecurity:
echo -e "Include owasp-crs/crs-setup.conf\nInclude owasp-crs/rules/*.conf" >> /usr/local/nginx/conf/modsecurity.conf
A continuación, reinicie el servicio Nginx para aplicar los cambios:
systemctl restart nginx
Paso 8:Verificar ModSecurity
En este punto, Nginx está instalado y configurado con soporte ModSecurity. Ahora es el momento de probarlo.
Ejecute la siguiente inyección de comando usando el comando curl:
curl localhost/index.html?exec=/bin/bash
Si todo está bien, debería recibir el error "403 Prohibido" como se muestra a continuación:
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.19.10</center> </body> </html>
También puede verificar el registro de ModSecurity para obtener más información:
tail -100 /var/log/nginx/modsec_audit.log
Debería ver el siguiente resultado:
---imefFQJy---D-- ---imefFQJy---E-- <html>\x0d\x0a<head><title>403 Forbidden</title></head>\x0d\x0a<body>\x0d\x0a<center><h1>403 Forbidden</h1></center>\x0d\x0a<hr><center>nginx/1.19.10</center>\x0d\x0a</body>\x0d\x0a</html>\x0d\x0a ---imefFQJy---F-- HTTP/1.1 403 Server: nginx/1.19.10 Date: Mon, 08 Nov 2021 10:00:55 GMT Content-Length: 154 Content-Type: text/html Connection: keep-alive ---imefFQJy---H-- ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:exec' (Value: `/bin/bash' ) [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/bash found within ARGS:exec: /bin/bash"] [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 "/index.html"] [unique_id "1636365655"] [ref "o1,8v21,9t: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 "/index.html"] [unique_id "1636365655"] [ref ""]
Conclusión
En la guía anterior, explicamos cómo instalar ModSecurity con Nginx en Rocky Linux 8. Su servidor web Nginx ahora está protegido con ModSecurity WAF. ModSecurity puede proteger su servidor de una amplia gama de ataques. ¡Empiece hoy mismo con el alojamiento VPS de Atlantic.Net!