Gli attacchi bruteforce rappresentano ormai una vera rogna per tutti i sys/net admin, in quanto, oltre a riempire i file di log di robaccia inutile, c'è sempre la remota possibilità che vadano a buon fine, compromettendo in todo o in parte la sicurezza dei vari dispositivi. Cosa fare dunque? La risposta è semplice: utilizzare Fail2ban.
Questo semplice applicativo (scritto in Python), esamina i file di log relativi ai servizi pubblicati sul nostro sistema (ad esempio SSH, FTP, HTTP, ecc.), riuscendo a riconoscere eventuali attacchi bruteforce (quando i tentativi di login da parte di un determinato IP sorgente superano la soglia massima consentita).
Ora, di documentazione su Fail2ban se ne trova davvero parecchia. Questo post, però, vuole concentrarsi non solo sulla corretta installazione/configurazione di tale applicativo, ma anche sulla creazione di un server SMTP locale, il quale, appaggiandosi ad un SMTP esterno (altrimenti detto smarthost), ci permetterà di ricevere le notifiche di ban direttamente sulla nostra casella e-mail pubblica.
Per prima cosa, ovviamente, dobbiamo procedere con l'installazione di Fail2ban, digitando:
nightfly@nightbox:~$ sudo apt-get install fail2ban
Ad installazione completa procederemo con la configurazione dello stesso, editando il file jail.conf presente nella directory /etc/fail2ban:
nightfly@nightbox:~$ sudo nano /etc/fail2ban/jail.conf
Le modifiche da apportare sono le seguenti:
1) Nella sezione [DEFAULT] possiamo definire gli IP che non dovranno essere MAI bannati (per non rischiare di buttare fuori uno o più host della nostra LAN), mediante il parametro ignoreip. Ad esempio:
ignoreip = 127.0.0.1 192.168.1.0/24
Il parametro bantime, invece, specifica la durata del ban (in secondi):
bantime = 600
Il parametro maxretry indica il numero massimo di tentativi di login (per default) prima di effettuare il ban. Esso verrà ingorato nel caso in cui sia indicato un maxretry specifico per uno o più servizi in ascolto sulla nostra macchina.
Infine, il parametro destmail consente di specificare l'indirizzo e-mail pubblico sul quale inoltrare le notifiche generate da Fail2ban.
destmail = vostro.indirizzo@email.it
2) nella sottosezione ACTION dobbiamo definire l'azione di default che Fail2ban dovrà intraprendere, nel nostro caso il ban dell'IP che ha generato l'attacco ed il successivo invio di una notifica via e-mail direttamente sulla nostra casella di posta. Per fare ciò associamo al parametro action il valore %(action_mw)s:
action = %(action_mw)s
Passiamo ora alla creazione delle jail (prigioni). In particolare, proprio grazie alle jail, fail2ban capirà quali servizi monitorare e proteggere dagli attacchi bruteforce. Occorre dunque abilitare una jail per ciascun servizio in ascolto sulla nostra macchina, ad esempio:
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
come potete notare, il parametro enabled è stato impostato su true, per fare in modo che la jail venga attivata per SSH.
Possiamo eseguire la stessa procedura per gli altri servizi:
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 6
[vsftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
filter = vsftpd
logpath = /var/log/vsftpd.log
e così via.
Riavviamo dunque Fail2ban per rendere effettive le modifiche:
nightfly@nightbox:~$ sudo /etc/init.d/fail2ban restart
Passiamo ora alla configurazione di un server SMTP locale. Personalmente uso exim4 in quanto è abbastanza sicuro, performante ed allo stesso tempo user-friendly.
Per installarlo basta digitare:
nightfly@nightbox:~$ sudo apt-get install exim4
Una volta completata l'installazione del nostro MTA (Message Transfer Agent) dobbiamo configurarlo correttamente. Per fare ciò occorre lanciare il comando:
nightfly@nightbox:~$ sudo dpkg-reconfigure exim4-config
Ecco gli screenshot di configurazione:
Verifichiamo che il nostro MTA funzioni correttamente, utilizzando il comando mail:
mail vostro.indirizzo@email.it
CC:
Subject: prova
prova.
Il punto finale serve a far capire all'applicativo mail che abbiamo completato la stesura del messaggio di posta e che quindi può inviarlo al destinatario.
Se non vi sono errori di sorta (in output o nel file /var/log/exim4/mainlog), vuol dire che il nostro MTA è configurato correttamente.
Non ci resta che riavviare Fail2ban ed alla riattivazione automatica delle jail dovremo ricevere sul nostro indirizzo di posta un'apposita email di notifica.
Come comportarsi in caso di attacco
Ma, una volta individuati gli indirizzi IP dai quali è scaturito l'attacco, quali sono le azioni che possiamo intraprendere?
Bhè, se gli attacchi sono molti e gli IP sempre gli stessi, si potrebbe inviare un'e-mail al servizio abuse relativo all'ISP usato dall'attaccante (magari allegando i file di log). Occorre precisare, però, che nel 99% dei casi l'attacker non si espone direttamente, ma usa dei proxy anonimi come front-end, quindi è molto probabile che la segnalazione all'ISP non rappresenti un'azione risolutiva.
Troubleshooting
Potrebbe sempre verificarsi il caso in cui venga bannato un host della nostra LAN. In tal caso la prima cosa da fare è listare le regole attive su IPTABLES ed identificare quelle relative a Fail2ban:
nightfly@nightbox:~$ sudo iptables -L
otterremo un output simile al seguente:
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-ssh (1 references)
target prot opt source destination
DROP 0 -- nightlocal.mylittlelan.org anywhere
RETURN 0 -- anywhere anywhere
Da quanto riportato sopra si può facilmente notare che l'host della LAN bannato è nightlocal.mylittlelan.org. Possiamo dunque rimuovere il ban in questione mediante utilizzando la sintassi:
iptables -D <nome della catena> <numero che identifica la regola della catena>
Ad esempio:
nightfly@nightbox:~$ sudo iptables -D fail2ban-ssh 1
Infine, possiamo verificare l'avvenuto sblocco dell'host locale digitando nuovamente:
nightfly@nightbox:~$ sudo iptables -L
Enjoy!