ModSecurity è un popolare firewall per applicazioni Web gratuito e open source utilizzato per proteggere le applicazioni Web da diversi tipi di attacchi, tra cui SQL injection, cross-site scripting e inclusione di file locali. Viene spesso utilizzato per proteggere siti Web, cPanel e altri pannelli di controllo di hosting. Sebbene ModSecurity sia stato progettato principalmente per il server Web Apache, può funzionare anche con il server Web Nginx.
In questo post, ti mostreremo come installare ModSecurity con Nginx su Rocky Linux 8.
Prerequisiti
- Un server che esegue Rocky Linux 8 sulla piattaforma Atlantic.Net Cloud
- Una password di root configurata sul tuo server
Fase 1:crea un server cloud Atlantic.Net
Per prima cosa, accedi al tuo server Atlantic.Net Cloud. Crea un nuovo server, scegliendo Rocky Linux 8 come sistema operativo con almeno 2 GB di RAM. Collegati al tuo Cloud Server tramite SSH e accedi utilizzando le credenziali evidenziate in alto nella pagina.
Una volta effettuato l'accesso al server, eseguire il comando seguente per aggiornare il sistema di base con gli ultimi pacchetti disponibili.
dnf update -y
Passaggio 2:installazione delle dipendenze richieste
Innanzitutto, dovrai installare tutte le dipendenze richieste sul tuo server. Puoi installarli tutti con il seguente 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
Quindi, installa i repository EPEL e Remi usando il seguente comando:
dnf install epel-release https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
Quindi, installa GeoIP usando il seguente comando:
dnf --enablerepo=remi install GeoIP-devel -y
Fase 3 – Installa ModSecurity
Innanzitutto, scarica l'ultima versione di ModSecurity utilizzando il seguente comando:
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
Quindi, cambia la directory in ModSecurity e installa gli altri moduli con il seguente comando:
cd ModSecurity git submodule init git submodule update
Quindi, compila e installa ModSecurity con il seguente comando:
./build.sh ./configure make make install
Fase 4 – Installa Nginx con il supporto di LibModsecurity
Per abilitare il supporto di LibModsecurity in Nginx, dovrai compilare Nginx con il supporto per LibModsecurity.
Innanzitutto, scarica il connettore ModSecurity-nginx utilizzando il comando seguente:
cd ../ git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
Quindi, scarica l'ultima versione stabile di Nginx con il seguente comando:
wget http://nginx.org/download/nginx-1.19.10.tar.gz
Quindi, estrai il file scaricato usando il seguente comando:
tar xzf nginx-1.19.10.tar.gz
Quindi, crea un utente per Nginx con il seguente comando:
useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx
Quindi, cambia la directory nel sorgente Nginx e compilalo usando il seguente 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
Quindi, installalo usando il seguente comando:
make make install
Quindi, copia il file di configurazione ModSecurity di esempio e il file di mappatura Unicode con il comando seguente:
cp /root/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf cp /root/ModSecurity/unicode.mapping /usr/local/nginx/conf/
Quindi, esegui il backup del file di configurazione di Nginx:
cp /usr/local/nginx/conf/nginx.conf{,.bak}
Quindi, modifica il file di configurazione di Nginx con il seguente comando:
nano /usr/local/nginx/conf/nginx.conf
Rimuovi tutte le righe e aggiungi le seguenti righe:
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; } } }
Salva e chiudi il file, quindi crea una directory di registro Nginx:
mkdir /var/log/nginx
Passaggio 5:crea un file di servizio Systemd per Nginx
Successivamente, dovrai creare un file di servizio systemd per gestire il servizio Nginx. Puoi crearlo usando il seguente comando:
nano /etc/systemd/system/nginx.service
Aggiungi le seguenti righe:
[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
Salva e chiudi il file, quindi crea un collegamento simbolico del binario Nginx usando il seguente comando:
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
Quindi, ricarica il demone systemd per applicare le modifiche:
systemctl daemon-reload
Quindi, avvia il servizio Nginx e abilitalo per l'avvio al riavvio del sistema:
systemctl enable --now nginx
Puoi controllare lo stato di Nginx con il seguente comando:
systemctl status nginx
Otterrai il seguente output:
● 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.
Passaggio 6:abilita la regola ModSecurity
Puoi abilitarlo con il seguente comando:
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /usr/local/nginx/conf/modsecurity.conf
Inoltre, abilita il registro di controllo con il seguente comando:
sed -i 's#/var/log/modsec_audit.log#/var/log/nginx/modsec_audit.log#' /usr/local/nginx/conf/modsecurity.conf
Passaggio 7:installazione del set di regole principali OWASP ModSecurity
OWASP fornisce regole generiche di rilevamento degli attacchi per ModSecurity. Puoi scaricarlo con il seguente comando:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs
Quindi, rinomina il file di configurazione della regola OWASP utilizzando il comando seguente:
cp /usr/local/nginx/conf/owasp-crs/crs-setup.conf{.example,}
Quindi, definisci la regola OWASP nel file di configurazione di ModSecurity:
echo -e "Include owasp-crs/crs-setup.conf\nInclude owasp-crs/rules/*.conf" >> /usr/local/nginx/conf/modsecurity.conf
Quindi, riavvia il servizio Nginx per applicare le modifiche:
systemctl restart nginx
Fase 8:verifica ModSecurity
A questo punto Nginx è installato e configurato con il supporto di ModSecurity. Ora è il momento di testarlo.
Esegui il seguente comando injection usando il comando curl:
curl localhost/index.html?exec=/bin/bash
Se tutto va bene, dovresti ricevere l'errore "403 Proibito" come mostrato di seguito:
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.19.10</center> </body> </html>
Puoi anche verificare il registro di ModSecurity per ulteriori informazioni:
tail -100 /var/log/nginx/modsec_audit.log
Dovresti vedere il seguente output:
---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 ""]
Conclusione
Nella guida sopra, abbiamo spiegato come installare ModSecurity con Nginx su Rocky Linux 8. Il tuo server web Nginx è ora protetto con ModSecurity WAF. ModSecurity può proteggere il tuo server da un'ampia gamma di attacchi. Inizia oggi stesso con l'hosting VPS da Atlantic.Net!