LibModSecurity è un firewall per applicazioni Web gratuito e open source che può essere utilizzato per proteggere un server Nginx da diversi tipi di attacchi informatici. Viene fornito con un set di regole di base che include SQL injection, cross-site scripting, Trojan e molti altri. Funziona monitorando il traffico HTTP in tempo reale e combattendo le vulnerabilità utilizzando il set di regole di base ModSecurity OWASP. Può essere utilizzato con Apache, Nginx e IIS e compatibile anche con Debian, Ubuntu e CentOS.
In questo tutorial, ti mostreremo come scaricare e compilare LibModSecurity con supporto Nginx su CentOS 8.
Requisiti
- Un server che esegue CentOS 8.
- Sul server è configurata una password di root.
Per iniziare
Prima di iniziare, aggiorna il tuo server con l'ultima versione utilizzando il seguente comando:
dnf update
Una volta che il tuo server è aggiornato, riavvialo per applicare le modifiche.
Installa i repository e le dipendenze richiesti
Innanzitutto, installa il repository EPEL e REMI sul tuo sistema. Puoi installarli con il seguente 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
Quindi, installa tutte le dipendenze richieste con il seguente 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 volta installati tutti i pacchetti, puoi installare altre dipendenze utilizzando il repository di PowerTool:
dnf --enablerepo=PowerTools install doxygen yajl-devel
Quindi, installa GeoIP utilizzando il repository REMI eseguendo il comando seguente:
dnf --enablerepo=remi install GeoIP-devel
Una volta installati tutti i pacchetti, puoi procedere al passaggio successivo.
Scarica e compila LibModsecurity
Innanzitutto, dovrai scaricare il sorgente LibModsecurity e compilarlo sul tuo sistema. Per farlo, cambia la directory in /opt e scarica l'ultima versione di LibModsecurity dal repository Git:
cd /opt/
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity
Quindi, cambia la directory in ModSecurity e scarica il codice libInjection con il seguente comando:
cd ModSecurity
git submodule init
git submodule update
Quindi, configura LibModsecurity usando il seguente comando:
./build.sh
./configure
Infine, compila e installa LibModSecurity con il seguente comando:
make
make install
A questo punto, LibModsecurity è stato installato sul tuo sistema. Ora puoi procedere all'installazione di Nginx con il supporto di LibModsecurity.
Scarica e compila Nginx con il supporto di LibModsecurity
Innanzitutto, dovrai creare un utente di sistema e un gruppo per Nginx. Puoi crearlo con il seguente comando:
useradd -r -M -s /sbin/nologin -d /usr/local/nginx nginx
Successivamente, dovrai scaricare Nginx e compilarlo con il supporto di LibModsecurity.
Per farlo, prima scarica il connettore ModSecurity-nginx dal repository Git con il seguente comando:
cd /opt
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.17.6.tar.gz
Una volta scaricato, estrai il file scaricato utilizzando il seguente comando:
tar -xvzf nginx-1.17.6.tar.gz
Quindi, cambia la directory Nginx e configurala con il seguente 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
Quindi, installa Nginx con il seguente comando:
make
make install
A questo punto, Nginx è stato installato con il supporto di LibModsecurity. Ora puoi procedere con la configurazione di Nginx.
Confgure Nginx con ModSecurity
Innanzitutto, dovrai copiare il file di configurazione ModSecurity di esempio dalla directory di origine di Nginx alla directory di configurazione di Nginx.
Puoi copiarli con il seguente comando:
cp /opt/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp /opt/ModSecurity/unicode.mapping /usr/local/nginx/conf/
Quindi, crea un collegamento simbolico del binario Nginx al percorso /usr/sbin/ con il seguente comando:
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
Quindi, crea la directory di registro Nginx con il seguente comando:
mkdir /var/log/nginx
Quindi, apri il file di configurazione di Nginx con il seguente comando:
nano /usr/local/nginx/conf/nginx.conf
Apporta le seguenti modifiche:
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; } } }
Salva e chiudi il file quando hai finito. Quindi, controlla Nginx per eventuali errori di sintassi con il seguente comando:
nginx -t
Dovresti vedere il seguente output:
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
A questo punto, Nginx è stato configurato. Puoi procedere con la creazione di un file di servizio systemd per Nginx.
Crea un file di servizio Systemd per Nginx
Successivamente, dovrai creare un file systemd per gestire il servizio Nginx. Puoi crearlo con il seguente comando:
nano /etc/systemd/system/nginx.service
Aggiungi le seguenti righe:
[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
Salva e chiudi il file quando hai finito. Quindi, ricarica il demone systemd con il seguente comando:
systemctl daemon-reload
Quindi, avvia il servizio Nginx e abilitalo all'avvio dopo il riavvio del sistema con il seguente comando:
systemctl start nginx
systemctl enable --now nginx
Dovresti vedere il seguente output:
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.
Quindi, verifica il servizio Nginx con il seguente comando:
systemctl status nginx
Dovresti vedere 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 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.
A questo punto, Nginx è stato avviato e funzionante. Ora puoi procedere con la configurazione di ModSecurity.
Configura ModeSecurity
Per impostazione predefinita, ModSecurity è impostato sulla modalità di solo rilevamento. Quindi dovrai attivare il motore delle regole ModSecurity. Puoi farlo modificando il file modsecurity.conf:
nano /usr/local/nginx/conf/modsecurity.conf
Trova la riga seguente:
SecRuleEngine DetectionOnly
E sostituiscilo con la seguente riga:
SecRuleEngine On
Trova anche la seguente riga:
/var/log/modsec_audit.log
E sostituiscilo con la seguente riga:
/var/log/nginx/modsec_audit.log
Salva e chiudi il file quando hai finito.
Quindi, scarica l'ultima versione di ModSecurity Core Rule Set dal repository Git usando il seguente comando:
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/local/nginx/conf/owasp-crs
Una volta scaricato, rinomina il file di configurazione di esempio CRS con il seguente comando:
mv /usr/local/nginx/conf/owasp-crs/crs-setup.conf.example /usr/local/nginx/conf/owasp-crs/crs-setup.conf
Quindi, configura ModeSecurity per utilizzare queste regole modificando il file /usr/local/nginx/conf/modsecurity.conf:
nano /usr/local/nginx/conf/modsecurity.conf
Aggiungi le seguenti righe alla fine del file:
Include owasp-crs/crs-setup.conf Include owasp-crs/rules/*.conf
Salva e chiudi il file quando hai finito. Quindi, riavvia il servizio Nginx per implementare le modifiche:
systemctl restart nginx
Test ModSecurity
ModSecurity è ora installato e configurato. È ora di verificare se funziona o meno.
Per testare ModSecurity contro l'iniezione di comandi, apri il tuo browser web e digita l'URL http://localhost/index.html?exec=/bin/bash. Dovresti vedere l'errore 403 Forbidden nella pagina seguente:
Per testare ModSecurity contro l'attacco CSS, apri il tuo terminale ed esegui il seguente comando:
curl http://localhost/?q="><script>alert(1)</script>"
Dovresti ottenere il seguente output:
<html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.17.6</center> </body> </html>
Conclusione
Congratulazioni! hai scaricato e compilato con successo LibModSecurity con Nginx. Il tuo server è ora protetto da vari attacchi. Per ulteriori informazioni, puoi visitare la documentazione di ModSecurity su ModSecurity Doc.