Obiettivo: realizzare una jail personalizzata per Fail2Ban su Ubuntu, per banner gli IP che tentano più di 3 accessi errati su un nostro portale in PHP
Fail2Ban funziona sotto linux e permette di banner mediante il firewall elenchi di indirizzi IP, basandosi sui log dei programmi a cui si vuole applicare.
Vediamo anzitutto come installarlo (per una guida dettagliata rimando alla guida ufficiale, oppure a questa guida qua).
Dal terminale digitiamo:
1 |
sudo apt-get update && sudo apt-get install fail2ban |
Ricordo che il connettore && concatena due comandi successivi (per esempio A && B), per cui se il comando A ha successo, allora viene eseguito il comando B.
Una volta installato modifichiamo il file jail.conf digitando sempre sul terminale:
1 |
sudo nano /etc/fail2ban/jail.conf |
Da qui possiamo fare una prima configurazione modificando i seguenti parametri (non si trovano in questo ordine):
1 2 3 4 |
ignoreip = 127.0.0.1/8 bantime = 600 findtime = 600 maxretry = 3 |
Questo significa che verranno ignorati gli IP interni della macchina, che il tempo di ban sarà di 600 secondi (10 minuti), per ogni 3 errori riscontrati nell’arco di 600 secondi.
Per esempio se volessimo abilitare il controllo degli accessi sul SSH allora cerchiamo la jail relativa e impostiamo true ad enabled.
Adesso creiamo il nostro meccanismo di ban personalizzato.
Per farlo, e testarlo, creiamo anzitutto un file apposito in PHP sotto apache. Da terminale digitiamo:
1 2 |
cd /var/www/html sudo nano test.php |
A questo punto scriviamo nel file PHP il codice necessario per registrare un errore in un file log.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php function logError( $msg ) { if(!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $client_ip = $_SERVER['REMOTE_ADDR']; } else { $client_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } error_log("[" . $_SERVER['HTTP_HOST'] . "]" . $client_ip . " - " . date("c") . " - " . $msg . "\n",3,"/var/log/paginatest.log"); } if( $_POST["errore"] ) { logError("LoginError"); } ?> <form action="" method="post"> <input type="submit" name="errore" value="invia" /> </form> |
Faccio notare che questo genererà una pagina con un pulsante che ad ogni pressione registrerà un “LoginError” nel file in /var/log/paginatest.log.
Quello che è importante, di tutto lo script, è il modo in cui viene scritto il file di log degli errori con error_log.
Fatto questo creiamo il file log vuoto e diamo i permessi a www-data per poterlo modificare dal PHP. Senza questa modifica il file non risulterà modificabile dal PHP.
1 2 |
sudo nano/var/log/paginatest.log sudo chown www-data:www-data /var/log/paginatest.log |
Adesso creiamo il nostro filtro personalizzato dentro per Fail2Ban. Dal terminale digitiamo:
1 2 |
cd /etc/fail2ban/filter.d sudo nano paginatest.conf |
Dentro il file paginatest.conf, aperto con nano, inseriamo le seguenti righe di codice:
1 2 3 4 |
[INCLUDES] [Definition] failregex = <HOST> .*LoginError.*$ ignoreregex = |
Salviamo il file. Faccio notare che si userà il riconoscimento di stringa sulle righe contenenti “LoginError” il $msg del file PHP che abbiamo creato in precedenza.
Di nuovo dal terminale digitiamo:
1 |
sudo nano /etc/fail2ban/jail.conf |
A questo punto ci spostiamo in fondo al file, dove si trovano le altre jail ed inseriamo il seguente codice:
1 2 3 4 5 6 7 |
[paginatest] enabled = true port = http,https filter = paginatest logpath = /var/log/paginatest.log maxretry = 3 |
In questo modo impostiamo il ban su tutte le connessioni HTTP e HTTPS alla data pagina, leggendo il file log che abbiamo creato, con un massimo numero di tentativi uguale a 3.
Facciamo ripartire Fail2Ban:
1 |
sudo service fail2ban restart |
Immaginiamo di testare adesso il nostro programma da un altro computer della rete, per esempio un computer all’indirizzo IP 192.168.0.19
Dopo 3 tentativi di errore dovremmo poter verificare qualcosa di simile:
Faccio notare che per visualizzare tutti gli IP bannati è sufficiente interrogare iptables:
1 |
sudo iptables -L -v | grep REJECT |
Se andiamo a verificare il file di log vedremo che i nostri “errori”, ovvero le pressioni sul suddetto tasto, in questo caso, hanno generato le seguenti righe:
Per sbannare un indirizzo IP ricordiamoci di utilizzare il seguente commando:
1 |
sudo fail2ban-client set paginatest unbanip 192.168.0.19 |
In questo caso rimuoviamo dalla blacklist l’indirizzo 192.168.0.19