Ricerca nel sito web

Proteggi Apache dagli attacchi Brute Force o DDoS utilizzando i moduli Mod_Security e Mod_evasive


Per quelli di voi che lavorano nel settore dell'hosting, o se ospitate i vostri server e li esponete a Internet, proteggere i vostri sistemi dagli aggressori deve essere una priorità assoluta.

mod_security (motore open source di rilevamento e prevenzione delle intrusioni per applicazioni web che si integra perfettamente con il server web) e mod_evasive sono due strumenti molto importanti che possono essere utilizzati per proteggere un server web contro la forza bruta o gli attacchi (D)DoS.

mod_evasive, come suggerisce il nome, fornisce funzionalità evasive durante un attacco, agendo come un ombrello che protegge i server Web da tali minacce.

In questo articolo discuteremo come installarli, configurarli e metterli in gioco insieme ad Apache su RHEL/CentOS 8 e 7 come così come Fedora. Inoltre, simuleremo gli attacchi per verificare che il server reagisca di conseguenza.

Ciò presuppone che sul tuo sistema sia installato un server LAMP. In caso contrario, consulta questo articolo prima di procedere ulteriormente.

  • Come installare LAMP Server su CentOS 8
  • Come installare lo stack LAMP in RHEL/CentOS 7

Dovrai inoltre impostare iptables come front-end firewall predefinito anziché firewalld se utilizzi RHEL/CentOS 8/7 o Fedora forte>. Lo facciamo per utilizzare lo stesso strumento sia in RHEL/CentOS 8/7 che in Fedora.

Passaggio 1: installazione del firewall Iptables su RHEL/CentOS 8/7 e Fedora

Per iniziare, ferma e disabilita firewalld:

systemctl stop firewalld
systemctl disable firewalld

Quindi installa il pacchetto iptables-services prima di abilitare iptables:

yum update && yum install iptables-services
systemctl enable iptables
systemctl start iptables
systemctl status iptables

Passaggio 2: installazione di Mod_Security e Mod_evasive

Oltre ad avere già una configurazione LAMP, dovrai anche abilitare il repository EPEL in RHEL/CentOS 8/7 in ordine per installare entrambi i pacchetti. Gli utenti Fedora non hanno bisogno di abilitare alcun repository, perché epel è già parte del progetto Fedora.

yum update && yum install mod_security mod_evasive

--------------- CentOS/RHEL 8 --------------- 
dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
dnf --enablerepo=raven-extras install mod_evasive

Una volta completata l'installazione, troverai i file di configurazione per entrambi gli strumenti in /etc/httpd/conf.d.

ls -l /etc/httpd/conf.d

Ora, per integrare questi due moduli con Apache e caricarli all'avvio, assicurati che le seguenti righe appaiano nella sezione di livello superiore di mod_evasive.conf e mod_security.conf, rispettivamente:

LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so

Tieni presente che modules/mod_security2.so e modules/mod_evasive24.so sono i percorsi relativi, dalla directory /etc/httpd al file sorgente del modulo. Puoi verificarlo (e modificarlo, se necessario) elencando il contenuto della directory /etc/httpd/modules:

cd /etc/httpd/modules
pwd
ls -l | grep -Ei '(evasive|security)'

Quindi riavvia Apache e verifica che carichi mod_evasive e mod_security:

systemctl restart httpd 	

Scarica un elenco dei moduli statici e condivisi caricati.

httpd -M | grep -Ei '(evasive|security)'				

Passaggio 3: installazione di un set di regole principali e configurazione di Mod_Security

In poche parole, un Core Rule Set (aka CRS) fornisce al server web istruzioni su come comportarsi in determinate condizioni. L'azienda sviluppatrice di mod_security fornisce un CRS gratuito chiamato OWASP (Open Web Application Security Project) ModSecurity CRS che può essere scaricato e installato come segue.

1. Scarica il OWASP CRS in una directory creata a tale scopo.

mkdir /etc/httpd/crs-tecmint
cd /etc/httpd/crs-tecmint
wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master

2. Decomprimi il file CRS e modifica il nome della directory per nostra comodità.

tar xzf master
mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs

3. Ora è il momento di configurare mod_security. Copia il file di esempio con le regole (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) in un altro file senza l'estensione .example:

cd owasp-modsecurity-crs/
cp crs-setup.conf.example crs-setup.conf

e chiedi ad Apache di utilizzare questo file insieme al modulo inserendo le seguenti righe nel file di configurazione principale del server web /etc/httpd/conf/httpd.conf. Se scegli di decomprimere il tarball in un'altra directory dovrai modificare i percorsi seguendo le direttive Include:

<IfModule security2_module>
        Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
        Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>

Infine, si consiglia di creare il nostro file di configurazione all'interno della directory /etc/httpd/modsecurity.d dove inseriremo le nostre direttive personalizzate (lo chiameremo tecmint.conf nell'esempio seguente) invece di modificare direttamente i file CRS. Ciò consentirà un aggiornamento più semplice dei CRS man mano che verranno rilasciate nuove versioni.

<IfModule mod_security2.c>
	SecRuleEngine On
	SecRequestBodyAccess On
	SecResponseBodyAccess On 
	SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream 
	SecDataDir /tmp
</IfModule>

Puoi fare riferimento al repository ModSecurity GitHub di SpiderLabs per una guida esplicativa completa delle direttive di configurazione mod_security.

Passaggio 4: configurazione di Mod_Evasive

mod_evasive è configurato utilizzando le direttive in /etc/httpd/conf.d/mod_evasive.conf. Poiché non ci sono regole da aggiornare durante l'aggiornamento di un pacchetto, non abbiamo bisogno di un file separato per aggiungere direttive personalizzate, a differenza di mod_security.

Il file mod_evasive.conf predefinito ha le seguenti direttive abilitate (nota che questo file è molto commentato, quindi abbiamo eliminato i commenti per evidenziare le direttive di configurazione di seguito):

<IfModule mod_evasive24.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
</IfModule>

Spiegazione delle direttive:

  • DOSHashTableSize: questa direttiva specifica la dimensione della tabella hash utilizzata per tenere traccia dell'attività in base all'indirizzo IP. L'aumento di questo numero consentirà una ricerca più rapida dei siti che il client ha visitato in passato, ma potrebbe influire sulle prestazioni complessive se è impostato su un valore troppo alto.
  • DOSPageCount: numero legittimo di richieste identiche a un URI specifico (ad esempio, qualsiasi file servito da Apache) che può essere effettuato da un visitatore nell'intervallo DOSPageInterval.
  • DOSSiteCount: simile a DOSPageCount, ma si riferisce al numero di richieste complessive che possono essere effettuate all'intero sito nell'intervallo DOSSiteInterval.
  • DOSBlockingPeriod: se un visitatore supera i limiti impostati da DOSSPageCount o DOSSiteCount, il suo indirizzo IP di origine verrà inserito nella lista nera durante il periodo di tempo DOSBlockingPeriod. Durante DOSBlockingPeriod, qualsiasi richiesta proveniente da quell'indirizzo IP incontrerà un errore 403 Forbidden.

Sentiti libero di sperimentare questi valori in modo che il tuo server web sia in grado di gestire la quantità e il tipo di traffico richiesti.

Solo un piccolo avvertimento: se questi valori non sono impostati correttamente, corri il rischio di finire per bloccare i visitatori legittimi.

Potresti anche prendere in considerazione altre direttive utili:

DOSEmailNotify

Se hai un server di posta attivo e funzionante, puoi inviare messaggi di avviso tramite Apache. Tieni presente che dovrai concedere all'utente Apache SELinux l'autorizzazione per inviare e-mail se SELinux è impostato su Enforcing. Puoi farlo correndo

setsebool -P httpd_can_sendmail 1

Successivamente, aggiungi questa direttiva nel file mod_evasive.conf con il resto delle altre direttive:

DOSEmailNotify [email 

Se questo valore è impostato e il server di posta funziona correttamente, verrà inviata un'e-mail all'indirizzo specificato ogni volta che un indirizzo IP viene inserito nella lista nera.

DOSSystemCommand

Ciò richiede un comando di sistema valido come argomento,

DOSSystemCommand </command>

Questa direttiva specifica un comando da eseguire ogni volta che un indirizzo IP viene inserito nella lista nera. Viene spesso utilizzato insieme a uno script di shell che aggiunge una regola firewall per bloccare ulteriori connessioni provenienti da quell'indirizzo IP.

Scrivi uno script di shell che gestisca la blacklist degli IP a livello di firewall

Quando un indirizzo IP viene inserito nella lista nera, dobbiamo bloccare le connessioni future provenienti da esso. Utilizzeremo il seguente script di shell che esegue questo lavoro. Crea una directory denominata scripts-tecmint (o qualunque nome tu scelga) in /usr/local/bin e un file chiamato ban_ip.sh in quella directory.

#!/bin/sh
IP that will be blocked, as detected by mod_evasive
IP=$1
Full path to iptables
IPTABLES="/sbin/iptables"
mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"

La nostra direttiva DOSSystemCommand dovrebbe essere la seguente:

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

Nella riga sopra, %s rappresenta l'IP incriminato rilevato da mod_evasive.

Aggiungi l'utente Apache al file sudoers

Tieni presente che tutto questo non funzionerà a meno che tu non conceda le autorizzazioni all'utente apache per eseguire il nostro script (e solo quello script!) senza terminale e password. Come al solito, puoi semplicemente digitare visudo come root per accedere al file /etc/sudoers e quindi aggiungere le seguenti 2 righe come mostrato nell'immagine seguente:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

IMPORTANTE: come politica di sicurezza predefinita, puoi eseguire sudo solo in un terminale. Poiché in questo caso dobbiamo utilizzare sudo senza tty, dobbiamo commentare la riga evidenziata nell'immagine seguente:

#Defaults requiretty

Infine, riavvia il server web:

systemctl restart httpd

Passaggio 4: simulazione di attacchi DDoS su Apache

Esistono diversi strumenti che puoi utilizzare per simulare un attacco esterno al tuo server. Puoi semplicemente cercare su Google "strumenti per simulare attacchi DDOS" per trovarne diversi.

Tieni presente che tu, e solo tu, sarai ritenuto responsabile dei risultati della tua simulazione. Non pensare nemmeno di lanciare un attacco simulato su un server che non ospiti nella tua rete.

Se vuoi fare lo stesso con un VPS ospitato da qualcun altro, devi avvisare adeguatamente il tuo provider di hosting o chiedere il permesso affinché un tale flusso di traffico passi attraverso le loro reti. linux-console.net non è, in alcun modo, responsabile delle tue azioni!

Inoltre, il lancio di un attacco DoS simulato da un solo host non rappresenta un attacco nella vita reale. Per simularlo, dovresti indirizzare il tuo server da più client contemporaneamente.

Il nostro ambiente di test è composto da un server CentOS 7 [IP 192.168.0.17] e un host Windows da cui lanceremo l'attacco [IP 192.168.0.103]:

Riproduci il video qui sotto e segui i passaggi delineati nell'ordine indicato per simulare un semplice attacco DoS:

Quindi l'IP incriminato viene bloccato da iptables:

Conclusione

Con mod_security e mod_evasive abilitati, l'attacco simulato fa sì che la CPU e la RAM sperimentino un picco di utilizzo temporaneo per solo un paio di secondi prima che gli IP di origine vengano inseriti nella lista nera e bloccati dal firewall. Senza questi strumenti, la simulazione sicuramente distruggerà il server molto velocemente e lo renderà inutilizzabile per tutta la durata dell’attacco.

Ci piacerebbe sapere se hai intenzione di utilizzare (o hai utilizzato in passato) questi strumenti. Siamo sempre ansiosi di sentire la tua opinione, quindi non esitare a lasciare i tuoi commenti e le tue domande, se presenti, utilizzando il modulo sottostante.

Collegamenti di riferimento

https://www.modsecurity.org/