Come installare ModSecurity per Nginx su Debian/Ubuntu
È desiderio di ogni sviluppatore implementare applicazioni Web sicure che siano al riparo dalle minacce. Nella maggior parte dei casi, questo è facile a dirsi che a farsi. La frequenza dei siti web vittime di attacchi continua ad aumentare poiché gli hacker continuano a sfruttare tutti i vettori di attacco a loro disposizione.
La sicurezza delle WebApp può rappresentare una sfida enorme, soprattutto a causa della prevalenza di strumenti dannosi come rootkit, scanner, bot e altri malware. Anche se venire violati può sembrare una questione di quando se non se, è prudente implementare alcune misure di sicurezza adeguate per salvaguardare le tue applicazioni web.
Uno degli strumenti in grado di fornire un discreto livello di sicurezza contro gli attacchi si chiama ModSecurity. Si tratta di un Web Application Firewall (WAF) gratuito e open source che protegge le tue applicazioni web da una vasta gamma di attacchi di livello 7 come lo scripting cross-site (XSS), SQL injection, session hijacking e molto altro.
In questa guida ti mostreremo come installare e configurare ModSecurity per funzionare con Nginx su distribuzioni Linux basate su Debian come Ubuntu.
Passaggio 1: installare le dipendenze
Per iniziare l'installazione, sono necessarie alcune dipendenze software affinché l'installazione abbia esito positivo. Ma prima aggiorna gli elenchi dei pacchetti e aggiorna i repository come segue.
sudo apt update
Successivamente, installa le dipendenze come segue.
sudo apt install make gcc build-essential autoconf automake libtool libfuzzy-dev ssdeep gettext pkg-config libcurl4-openssl-dev liblua5.3-dev libpcre3 libpcre3-dev libxml2 libxml2-dev libyajl-dev doxygen libcurl4 libgeoip-dev libssl-dev zlib1g-dev libxslt-dev liblmdb-dev libpcre++-dev libgd-dev
Passaggio 2: installa l'ultima versione di Nginx
Il prossimo passo sarà installare il browser web Nginx. Per installare la versione più recente, la installeremo dal ondrej/nginx-mainline PPA w che è attualmente gestito da uno sviluppatore Debian dal 2000.
Per aggiungere il PPA al tuo sistema Ubuntu locale esegui il comando:
sudo add-apt-repository ppa:ondrej/nginx-mainline -y
Successivamente, aggiorna gli elenchi dei pacchetti e installa l'ultima versione di Nginx come segue
sudo apt update
sudo apt install nginx-core nginx-common nginx nginx-full
In genere, è abilitato solo il repository predefinito. È prudente abilitare il repository del codice sorgente in modo da poter, in seguito, scaricare il codice sorgente Nginx nel passaggio successivo.
Per raggiungere questo obiettivo, modifica il file del repository Nginx.
sudo vim /etc/apt/sources.list.d/ondrej-ubuntu-nginx-mainline-*.list
Individua e decommenta questa riga per abilitare il repository del codice sorgente:
deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main
Il file dovrebbe ora apparire come mostrato.
Salva le modifiche ed esci.
Quindi aggiorna l'indice del pacchetto.
sudo apt update
Passaggio 3: scarica il pacchetto sorgente Nginx
Per compilare il modulo dinamico ModSecurity, dobbiamo scaricare il pacchetto del codice sorgente Nginx. Per fare ciò, creeremo innanzitutto una directory Nginx nel percorso /usr/local/src/ per ospitare il file del pacchetto del codice sorgente Nginx.
sudo mkdir -p /usr/local/src/nginx
Successivamente, assegna le autorizzazioni alla directory come mostrato. Assicurati di sostituire il nome utente con il tuo nome utente sudo effettivo.
sudo chown username:username -R /usr/local/src/
Successivamente, accedi alla directory dei sorgenti Nginx:
cd /usr/local/src/nginx
Procedi e scarica i pacchetti di file sorgente Nginx:
sudo apt source nginx
Molto probabilmente ti verrà visualizzato il seguente errore:
W: Download is performed unsandboxed as root as file 'nginx_1.19.5.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
Questo non è niente che ti faccia agitare. Quindi, ignora semplicemente l'errore.
Puoi dare un'occhiata al file sorgente usando il comando ls.
ls -l
Assicurati che la versione del codice sorgente coincida con la versione di Nginx installata.
nginx -v
Passaggio 4: installare la libreria Libmodsecurity3
Libmodesecurity è una libreria Modsecurity che gestisce il filtraggio HTTP per le tue applicazioni. Esistono due modi per installarlo. Puoi utilizzare il gestore pacchetti apt come mostrato
sudo apt install libmodsecurity3
L'altro approccio è installarlo da una fonte preferibile poiché fornisce la versione più recente. Per avviare l'installazione di Libmodsecurity dal sorgente, clonare il repository git come mostrato:
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/
Passare alla directory clonata:
cd /usr/local/src/ModSecurity/
Impegnarsi a installare i sottomoduli
sudo git submodule init
sudo git submodule update
Successivamente, crea l'ambiente utilizzando i comandi seguenti.
sudo ./build.sh
sudo ./configure
Ancora una volta, ignora l'errore visualizzato di seguito.
fatal: No names found, cannot describe anything.
Quindi compila il codice sorgente e installa altre utilità utilizzando il seguente comando make. L'operazione richiede circa 25 minuti ed è necessaria un po' di pazienza.
sudo make -j4
Una volta completato, installa le librerie.
sudo make install
Passaggio 5: scarica e compila il connettore Nginx ModSecurity v3
Il passaggio successivo è scaricare e compilare il connettore ModSecurity Nginx. Il connettore, come suggerisce il nome, collega la libreria Libmodsecurity al server web Nginx. Per scaricare il connettore Modsecurity, clonalo dal repository GitHub come segue.
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/
Passare alla directory clonata.
cd /usr/local/src/nginx/nginx-1.21.3/
Procedi e installa le dipendenze di build
sudo apt build-dep nginx
sudo apt install uuid-dev
Successivamente, compila il modulo ModSecurity Nginx Connector con il flag --with-compat
. L'opzione --with-compat
rende il modulo ModSecurity Nginx Connector compatibile a livello binario con la libreria Nginx corrente.
sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx
Fatto ciò, crea il modulo ModSecurity Nginx Connector utilizzando il comando make.
sudo make modules
Il modulo viene salvato come objs/ngx_http_modsecurity_module.so. È necessario copiare questo modulo nella directory /usr/share/nginx/modules/ come segue.
sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/
Passaggio 6: caricare il modulo connettore ModSecurity Nginx
Per caricare il modulo connettore Nginx, accedi innanzitutto al file di configurazione principale di Nginx.
sudo vim /etc/nginx/nginx.conf
Aggiungi la riga seguente appena sotto le prime righe
load_module modules/ngx_http_modsecurity_module.so;
Inoltre, aggiungi le seguenti righe nella sezione http {...}
. Ciò abilita ModSecurity per tutti gli host virtuali Nginx.
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;
Salvare le modifiche ed uscire dal file.
Successivamente, crea la directory /etc/nginx/modsec/ che memorizzerà la configurazione ModSecurity.
sudo mkdir /etc/nginx/modsec/
Successivamente, copia il file di configurazione di ModSecurity come segue.
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
Quindi aprire il file di configurazione.
sudo vim /etc/nginx/modsec/modsecurity.conf
Individua la riga che inizia con la direttiva SecRuleEngine.
SecRuleEngine DetectionOnly
Questa riga indica a ModSecurity di registrare solo le transazioni HTTP ma non intraprende alcuna azione di fronte a un attacco a un'app Web. È necessario modificarlo in modo che Modsecurity non solo rilevi ma blocchi anche gli attacchi web.
Cambia la riga nella riga sottostante
SecRuleEngine On
Salvare le modifiche ed uscire dal file.
Successivamente, crea il file /etc/nginx/modsec/main.conf.
sudo vim /etc/nginx/modsec/main.conf
Aggiungi questa riga per fare riferimento al file di configurazione /etc/nginx/modsec/modsecurity.conf.
Include /etc/nginx/modsec/modsecurity.conf
Salvare le modifiche ed uscire dal file.
Inoltre, copiare il file di mapping Unicode.
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
Quindi testa la configurazione di Nginx.
sudo nginx -t
Il test dovrebbe avere successo. In caso contrario, torna indietro e controlla se tutte le modifiche apportate sono corrette.
Quindi, infine, riavvia Nginx per applicare tutte le modifiche apportate.
sudo systemctl restart nginx
E verifica che Nginx funzioni come previsto.
sudo systemctl status nginx
Passaggio 7: Scarica il set di regole OWASP
Affinché ModSecurity possa proteggere le tue applicazioni web, devi specificare le regole che rileveranno le attività sospette e le bloccheranno. Per iniziare, è preferibile installare i set di regole esistenti che ti aiuteranno ad imparare i fondamenti.
L'OWASP Core Rule Set (CRS) è un set di regole gratuito, open source e gestito dalla comunità che fornisce regole per scongiurare vettori di attacco comuni come SQL injection, Scripting cross-site (XSS).
Scarica il set di regole principali OWASP da Github come mostrato utilizzando il comando wget.
wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz
Estrai il file compresso.
tar xvf v3.3.0.tar.gz
Assicurati di spostare la directory non compressa nel percorso /etc/nginx/modsec/.
sudo mv coreruleset-3.3.0/ /etc/nginx/modsec/
Quindi rinomina il file crs-setup.conf.example in crs-setup.conf.
sudo mv /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Ancora una volta, torna al file di configurazione di ModSecurity.
sudo vim /etc/nginx/modsec/main.conf
E aggiungi le seguenti righe.
Include /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf
Il file ora dovrebbe avere 3 righe:
Salva il file e, ancora una volta, riavvia Nginx.
sudo systemctl restart nginx
Passaggio 8: testare ModSecurity
Infine, effettueremo un test ModSecurity e confermeremo che è in grado di rilevare e bloccare il traffico HTTP sospetto.
Modificheremo il file di configurazione di ModSecurity e creeremo una regola di blocco che bloccherà l'accesso a un determinato URL quando si accede da un browser web.
sudo vim /etc/nginx/modsec/modsecurity.conf
Aggiungi questa riga appena sotto la direttiva SecRuleEngine On
SecRule ARGS:testparam "@contains test" "id:254,deny,status:403,msg:'Test Successful'"
Puoi impostare i tag 'id' e 'msg' sui tuoi valori preferiti.
Salva le modifiche e riavvia Nginx.
sudo systemctl restart nginx
Ora avvia il browser e visita l'URL seguente con il suffisso ?testparam=test
http://server-ip/?testparam=test
Dovresti ricevere un errore 403 "Non consentito". Ciò indica che stai tentando di accedere a una risorsa vietata sul server web.
Inoltre, puoi controllare i log degli errori di Nginx per confermare che il client è stato bloccato
cat /var/log/nginx/error.log | grep "Test Successful"
Questa era una panoramica di come impostare Modsecurity con Nginx su Debian e Ubuntu. Ci auguriamo che questo sia stato utile.