Gli attacchi brute force, o attacchi di forza bruta in italiano, sono attacchi che mirano a provare tutte le combinazioni di username e password possibili al fine di trovare quella corretta e garantirsi l’accesso al server vittima.

Data la latenza di un attacco brute force remoto, molte volte gli hackers preferiscono avviare attacchi wordlist, ovvero attacchi che si limitano a testare una lista di parole contenute in un file di testo anziché generare tutte le combinazioni possibili.

Chi gestisce un server è continuamente sotto attacco da parte di software che tentano di craccare la password di amministratore ed a volte ci riescono, in quanto purtroppo sono ancora in molti a non utilizzare autenticazioni con password robuste o con chiave asimmetrica.

Chi effettua un attacco di questo tipo genera moltissime richieste di accesso non riuscito. Lo scopo è dunque bannare gli indirizzi IP che effettuano continui tentativi di accesso fallito. Uno dei software più appropriati per farlo è fail2ban.

Funzionamento di fail2ban

Il software non fa altro che effettuare una scansione dei file di log dei servizi configurati, ad esempio ssh, proftpd, apache, ecc.., e quando trova un numero di tentativi di accesso falliti superiore a quelli configurati, banna l’indirizzo IP inserendo una semplice regola sul firewall iptables per un periodo di tempo prestabilito.

Installazione di Fail2ban su Ubuntu e Debian

Installare fail2ban su un server linux Ubuntu o Debian è semplice come bere un bicchier d’acqua. Prima di tutto aggiornate l’indice dei pacchetti in modo da essere sicuri di installare l’ultima versione di fail2ban disponibile, dopodiché procedete con l’installazione di fail2ban:

$ sudo apt-get update && sudo apt-get install fail2ban

Ad installazione terminata occorre passare alla configurazione.

Configurazione di Fail2ban

Le regole di fail2ban si chiamano jail e si trovano all’interno del file /etc/fail2ban/jail.conf. Il file è suddiviso in sezioni di cui una di default globale le cui regole generiche possono essere sovrascritte dalle sezioni più specifiche.

Il nome di ogni sezione è racchiuso tra parentesi quadre e contiene alcuni parametri, esempio:

[ssh]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

Di seguito la spiegazione dei vari parametri:

  • enabled: può essere truefalse e serve per stabilire se la jail è da considerarsi attiva o non attiva.
  • port: specifica l’insieme di porte di rete separate da virgola sulle quali è in ascolto il servizio da monitorare.
  • filter: indica il filtro da usare contenuto all’interno della directory /etc/fail2ban/filter.d
  • logpath: path al file di log del servizio da analizzare.
  • maxretry: numero massimo di tentativi di accesso non riusciti da tollerare, oltre i quali scatta il ban.

Oltre a questi parametri ve ne sono di altri che possono essere specificati e che di solito si trovano nella regola di default:

  • ignoreip: permette di indicare l’IP o una classe di indirizzi IP da ignorare.
  • bantime: tempo del ban espresso in secondi.
  • findtime: un host viene bannato se supera maxretry tentativi di accesso non riusciti in findtime secondi di tempo.
  • destemail: indirizzo email a cui inviare una email in caso di ban di un nuovo host.
  • action: l’azione da eseguire quando si verifica la condizione di ban. L’azione di default è quella di bannare l’indirizzo IP con una regola di iptables.
  • sendername: nome mittente della email.
  • chain: catena di iptables da usare per l’inserimento della regola del ban (di default è INPUT).
  • protocol: il protocollo di rete (di default è tcp).
  • banaction: software di default per effettuare il ban. Può essere iptables, iptables-new, iptables-multiport, shorewall, ecc..

Dopo ogni modifica al file jail.conf, occorre riavviare il servizio:

$ sudo service fail2ban restart

Esempio di azioni

Vi sono principalmente tre tipi di azioni: ban semplice, ban con notifica e ban con notifica avanzata

Ban semplice

La seguente azione si limita a bannare semplicemente l’indirizzo IP sul protocollo e sulla porta specificata nella chain di default.

action = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

Ban con notifica

Oltre a bannare come nella regola precedente, invia il whois dell’indirizzo IP bannato all’indirizzo email specificato in destemail.

action = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
 %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s", sendername="%(sendername)s"]

Ban con notifica avanzata

Come la regola precedente ma oltre al whois invia anche le linee di file di log interessate che hanno fatto scattare il ban.

action = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
 %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]

Monitoraggio

Per monitorare lo status dei servizi analizzati, esiste il comando fail2ban-client. Per visualizzare le jail attive basta lanciare il seguente comando:

$ sudo fail2ban-client status
Status
|- Number of jail: 3
`- Jail list: vsftpd, ssh, ssh-ddos

Se volessimo monitorare una jail nello specifico, basta far seguire il nome della regola a status:

$ sudo fail2ban-client status ssh
Status for the jail: ssh
|- filter
| |- File list: /var/log/auth.log 
| |- Currently failed: 0
| `- Total failed: 5
`- action
 |- Currently banned: 0
 | `- IP list:
 `- Total banned: 1

Una volta configurate tutte le jail del caso ed eseguito i vari test, il server può ritenersi al sicuro da attacchi brute force e wordlist da parte di utenti malintenzionati.

Fail2ban Notifica