Apache mod_evasive – installazione e configurazione

Oggi parliamo di Apache mod_evasive ovvero di un modulo di Apache webserver (httpd) utile a proteggere i nostri siti da attacchi DoS e DDoS. Abbiamo già affrontato il tema mod_evasive in un precedente articolo in cui spiegavo come proteggere un sito web senza spendere soldi.

In questo nuovo post invece, parleremo dettagliatamente di come installare e configurare il modulo di Apache mod_evasive per Apache, su diversi sistemi operativi Linux , tra cui Debian, Ubuntu e Cent/OS.

Indice dei contenuti

Let’s go!

Cos’è il mod_evasive per Apache

Il modulo mod_evasive è un modulo del WebServer Apache che aiuta il nostro server a rimanere in esecuzione in caso di attacchi di tipo Denial of Service (DoS), Distributed Denial of Service (DDoS) o tentativo di forza bruta. Questa tipologia di attacchi ha lo scopo di sopraffare la sicurezza della tua macchina utilizzando diversi computer per effettuare richieste ripetute contro il nostro server. Ciò fa sì che il server esaurisca la potenza di elaborazione, la memoria o la larghezza di banda e smetta di rispondere.

Questa guida ti guiderà attraverso la configurazione e l’installazione di mod_evasive per proteggere il tuo webserver Apache da attacchi DoS e DDoS.

Come funziona il Apache mod_evasive

L’utility Apache mod_evasive funziona monitorando le richieste in ingresso verso il nostro server, controllando le attività sospette da un determinato IP, come:

  • Le richieste per la stessa pagina in un determinato arco temporale.
  • Le richieste per pagine diverse in un determinato arco temporale.
  • Richieste effettuate mentre l’IP è in blacklist.

Il modulo, nel caso dovesse verificarsi una delle casistiche sopra elencate invia un errore 403 al client. Quindi, il mod_evasive ti aiuta a difenderti attraverso il rilevamento e la gestione della chiamate in ingresso.

Installare il mod_evasive per Apache

In questa guida vedremo come installare mod_evasive su diversi sistemi operativi linux come Debian, Ubuntu, CentOS e Redhat Linux. Vedremo inoltre quali sono i prerequisiti da rispettare affinché tutto vada al posto giusto.

Prerequisiti

Affinchè si possa procedere con l’installazione e la configurazione, è necessario rispettare alcuni prerequisiti che vi riporto di seguito:

  • Un Webserver Apache installato, configurato e funzionante
  • Un utente che abbia privilegi di root e un utente applicativo proprietario dei files di configurazione di Apache
  • Un mail server funzionante per inviare email di alert (Opzionale)

Installare mod_evasive su Debian e Ubuntu

Prima di procedere con l’istallazione è importante eseguire un aggiornamento dei pacchetti di sistema:

sudo apt update
ShellScript

Quindi, procediamo a installare le helper utility di apache:

sudo apt install apache2-utils
ShellScript

Procediamo quindi all’installazione vera e propria tramite il comando:

sudo apt install libapache2-mod-evasive
ShellScript

La cui conseguenza avrà un output simile a:

sudo apt install libapache2-mod-evasive
sudo apt install libapache2-mod-evasive

Ora il nostro mod_evasive è pronto all’uso, non ci resta che abilitarlo con i comandi:

# Andiamo nel path dove ci sono tutti i moduli
cd /etc/apache2/mods-available

# Abilitatiamo evasive.load tramite:
/usr/sbin/a2enmod evasive.load 
ShellScript

Installare mod_evasive su CentOS / RedHat Linux

Per installare Evasive su Cents / RedHat Linux è necessario prima di tutto aggiungere il repository che contiene il modulo che ci interessa. Pertanto lanciamo il comando:

sudo yum install epel-release
ShellScript

Al termine del quale provvediamo all’installazione vera e propria tramite:

sudo yum install mod_evasive
ShellScript

L’installazione è completata e possiamo procedere alla configurazione.

Configurare mod_evasive per Apache httpd server

Come la maggior parte dei pacchetti software Linux, mod_evasive è controllato da un file di configurazione. Vediamo dove trovare il file di configurazione e quali modifiche apportare per attivare la protezione. Editiamo il file di configurazione con il vi

Debian / Ubuntu:

sudo vi /etc/apache2/mods-enabled/evasive.conf
ShellScript

RedHat / CentOS:

sudo vi /etc/httpd/conf.d/mod_evasive.conf
ShellScript

Vediamo, per tutte le versioni Linux elencate, come si presenta i file di configurazione:

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

    #DOSEmailNotify      [email protected]
    #DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
    #DOSLogDir           "/var/log/mod_evasive"
</IfModule>
ShellScript

Togliamo i commenti (#) dalla riga 2 alla riga 7 in modo che il file diventi così:

Esempio di file di configurazione del mod_evasive

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

    #DOSEmailNotify      [email protected]
    #DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
    #DOSLogDir           "/var/log/mod_evasive"
</IfModule>
ShellScript

Per quanto riguarda le righe ancora commentate, affronteremo il tema più avanti nell’articolo.

Per quanto riguarda l’attivazione vera e propria non ci resta che riavviare i servizi Apache httpd. Iniziamo con Debian / Ubuntu:

Debian / Ubuntu:

sudo systemctl reload apache2
ShellScript

Allo stesso modo, per CentOS / RedHat:

RedHat / CentOS:

sudo systemctl restart httpd.service
ShellScript

Per quanto riguarda la configurazione generale, possiamo dire di aver concluso. Non ci resta che eseguire i primi test per verificare che il tutto stia funzionando. Da un punto di vista di tuning invece abbiamo ancora qualcosina da sistemare.

Come testare mod_evasive

Il fatto che lo abbiamo installato, non significa che il modulo di protezione stia effettivamente funzionando. Infatti, per avere certezza che tutto sia configurato a dovere, bisogno essere sicuri che i pacchetti malevoli vengano bloccati. A tal riguardo, lo sviluppatore del software ci mette a disposizione uno script per il test del mod_evasive.

Il file di test potete scaricarlo dal link precedente, ma dovreste già averlo sulla vostra macchina. Per verificarlo baciate il seguente comando:

ls /usr/share/doc/libapache2-mod-evasive/examples/test.pl
ShellScript

Il file ha il seguente contenuto configurabile:

#!/usr/bin/perl
# test.pl: small script to test mod_dosevasive's effectiveness

use IO::Socket;
use strict;

for(0..100) {
  my($response);
  my($SOCKET) = new IO::Socket::INET( Proto   => "tcp", PeerAddr=> "127.0.0.1:80");
  if (! defined $SOCKET) { die $!; }
  print $SOCKET "GET /?$_ HTTP/1.0\n\n";
  $response = <$SOCKET>;
  print $response;
  close($SOCKET);
}
Perl

Alla riga 4 inizia il ciclo. Al posto di 100 potete scegliere quante chiamate eseguire. Mentre alla riga 9, nella sezione PeerAddr potete inserire l’indirizzo IP e la porta su cui eseguire il test. Il test può essere eseguito sia localmente che da remoto.

Lanciando lo script, così com’è, quindi localmente, se la configurazione finora apportata è corretta, dovreste ricevere un output del tipo:

apache@webserver:-$ perl /usr/share/doc/libapachez-mod-evasive/examples/test.pl
HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
ShellScript

Impostazioni e parametri di configurazione

Come abbiamo visto nell’esempio del file di configurazione, ci sono diversi parametri che possiamo impostare per fare il tuning della nostra protezione.

Vediamo quindi nel dettaglio cosa rappresentano quei parametri:

  • DOSBlockingPeriod è il periodo di tempo per il quale un IP verrà bloccato nel caso vengano superate le soglie sotto elencate. La configurazione prevede come valore un numero intero che rappresenta i secondi di blocco. Es. DOSBlockingPeriod 3600. Quando un IP supera le soglie verrà inserito in blacklist e riceverà un errore http 403 (access denied) per la durata dei secondi impostati in questa metrica.
  • DOSPageCount invece è il numero di volte che un IP può visitare una singola pagina in un determinato arco temporale (DOSPageInterval). Anche questo parametro si configura con un numero intero (es. 200, che rappresenta il numero di volte che una pagina può essere visitata).
  • DOSPageInterval E’ l’intervallo di tempo entro il quale viene contato il numero di visite a una singola pagina (DOSPageCount) da parte di un singolo IP. Anche qui il parametro è un intero ed è espresso in secondi
  • DOSSiteCount è il numero di pagine dell’intero sito che un IP può visitare in un determinato arco temporale (DOSSiteInterval). Il parametro si configura con un numero intero (es. 200 pagine del sito).
  • DOSSiteInterval E’ l’intervallo di tempo entro il quale vengono contate le pagine del sito (DOSSiteCount) che un IP può visitare. Anche qui il parametro è un intero ed è espresso in secondi

Tornando alle configurazioni, ne esistono anche altre opzionali:

    DOSEmailNotify	[email protected]
    DOSSystemCommand	"su - someuser -c '/sbin/... %s ...'"
    DOSLogDir		"/var/lock/mod_evasive"
    DOSWhitelist="10.60.0.7,10.65.0.10" 
ShellScript

Per approfondirle, vi consiglio di leggere la documentazione ufficiale.

Whitelist IP addresses

Particolare attenzione va però data alla riga 4, ovvero a DOSWhitelist che rappresenta la lista degli IP che NON verranno MAI bloccati dal mod_evasive. La Whitelist può essere configurata su una sola riga, oppure su più righe. Come per esempio:

DOSWhitelist=10.60.0.7
DOSWhitelist=10.60.0.8
DOSWhitelist=10.60.1.*
DOSWhitelist=10.50.*.*
ShellScript

Come potete notare, è anche possibile impostare delle wildcard (*) che prendono in considerazione le intere subnet.

Contributo video

How to prevent DoS and DDoS attacks against Apache with mod_evasive

Conclusioni su Apache mod_evasive – installazione e configurazione

Spero di essere riuscito a coprire l’argomento in modo esaustivo. il mod_evasive per Apache è uno strumento molto semplice ma abbastanza potente. Ovviamente questo non bloccherà il traffico prima che arrivi sui vostri server; per fare questo sarebbe meglio utilizzare un WAF. Ma calcolando che è uno strumento completamente gratuito, direi che è meglio di nulla :).

Se avete dei dubbi o se volete condividere il vostro punto di vista, scrivete nei commenti e cercherò di rispondere al più presto.

Detto ciò , vi auguro una buona lettura.

Se volete restare in contatto, vi lascio anche il link della mia newsletter di LinkedIn.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *