Come installare Fail2ban con Iptables per bloccare gli attacchi bruteforce, in una distribuzione Centos
Fail2ban è uno strumento di sicurezza nato per prevenire attacchi di tipo "brute force", cioè volti ad accedere ad un server o a causarne la saturazione delle risorse.
Fail2ban funziona in questo modo: scansiona i file di log di sistema e blocca gli indirizzi IP che presentano troppi fallimenti nell'inserimento di password o uso di exploit o che verificano certe regole che andremo a definire nei file di configurazione di Fail2ban. In presenza di queste condizioni, Fail2ban blocca l'indirizzo IP per un certo periodo di tempo, aggiungendo automaticamente al firewall una regola.
In questo articoli vediamo come installare Fail2ban su un server con installato il sistema operativo Centos 7, ed utilizzando come firewall Iptables, e non FirewallD che adesso è il firewall previsto di default da Fail2ban.
Per comprendere appieno il funzionamento di Fail2ban, dovreste avere almeno le basi di utilizzo di Iptables (su cui verranno create le regole per gli IP bannati) e di regex (utilizzato per l'analisi dei log): su questi 2 argomenti infatti non ci soffermeremo.
Installazione di Fail2ban
Tramite yum installiamo il pacchetto Fail2ban
yum install fail2ban
Al termine dell'installazioni dobbiamo procedere con la sua configurazione.
Installazione del firewall
In questo articolo vediamo come utilizzare Fail2ban con un firewall iptables. Per cui è si presuppone che questo firewall sia già installato.
Se non lo fosse installiamo adesso
yum install iptables iptables-services
Ultimata l'installazione, non lo avviamo ancora, ma ricordiamoci di fare in modo che in caso di riavvio del server, il servizio si avvii automaticamente:
systemctl enable fail2ban.service
Lasciamo a voi la creazione delle regole di Iptables, non essendo questo l'articolo dedicato.
Inoltre, se per caso fosse installato il firewall FirewallD, fermiamolo così
systemctl stop firewalld
E disabilitiamolo
systemctl disable firewalld
Non lo disinstalliamo perchè la sua disinstallazione determina la disinstallazione anche di Fail2ban, in quanto oggi questo pacchetto è legato proprio a FirewallD.
E proprio per questo, dobbiamo anche rinominare il file "00-firewalld.active" (o anche chiamato "00-firewalld.conf") , qui localizzato
/etc/fail2ban/jail.d/00-firewalld.active
in
/etc/fail2ban/jail.d/00-firewalld.disabled
In questo modo stiamo dicendo a Fail2ban di NON utilizzare FirewallD come firewall.
Configurazione di Fail2ban
Vediamo adesso come configurare Fail2ban.
Tutti i file di configurazione sono localizzati in questa directory
/etc/fail2ban
Al suo interno troviamo questi elementi
drwxr-xr-x 2 root root 4096 Dec 18 11:10 action.d
-rw-r--r-- 1 root root 2334 Nov 28 08:53 fail2ban.conf
drwxr-xr-x 3 root root 4096 Jan 13 18:13 filter.d
-rw-r----- 1 root root 5800 Jan 13 18:25 jail.conf
drwxr-xr-x 2 root root 4096 Nov 28 08:53 jail.d
-rw-r--r-- 1 root root 645 Nov 28 08:53 paths-arch.conf
-rw-r--r-- 1 root root 2827 Nov 28 08:53 paths-common.conf
-rw-r--r-- 1 root root 573 Nov 28 08:53 paths-debian.conf
-rw-r--r-- 1 root root 930 Nov 28 08:53 paths-fedora.conf
-rw-r--r-- 1 root root 982 Nov 28 08:53 paths-freebsd.conf
-rw-r--r-- 1 root root 738 Nov 28 08:53 paths-opensuse.conf
-rw-r--r-- 1 root root 286 Nov 28 08:53 paths-osx.conf
-rw-r--r-- 1 root root 398 Nov 28 08:53 README
A noi interessano i primi 5 elementi e cioè
- action.d: in questa directory sono inseriti vari files che indicano le azioni da eseguire nel caso in cui si verificano le condizioni per banner un ip
- fail2ban.conf: è un primo file di configurazione di Fail2ban, che lasceremo come è per cui non analizzeremo.
- filter.d: in questa directory sono contenuti vari files, uno per ogni regola (filtro) che va verificata per bannare un ip (ad esempio, una regola per verificare gli accessi al servizio ssh, una per verificare le sessioni di Apache, ... )
- jail.conf: è un secondo file di configurazione di Fail2ban, il più importante. Qui definiamo tutti i parametri di configurazione come, ad esempio, per quanto tempo un IP deve restare bannato, quali IP lasciare in whitelist, a quale email inviare log, ..... ma sopratutto quali regole applicare (contenute nella cartella "filter.d")
- jail.d: in questa directory possiamo spostare le regole definite nel file "jail.conf", ma nulla vieta, come facciamo noi, di configurare tutto in jail.conf e lasciare questo file vuoto.
Il file jail.d
Questo è il file di configurazione di Fail2ban più importante.
Vediamo di seguito i principali parametri da configurare.
Nella sezione "INCLUDES" del file di configurazione abbiamo solo il seguente parametro:
before = paths-fedora.conf
before | occorre indicare il file da utilizzare relativo alla distribuzione utilizzata. i files sono presenti nella root della directory "/etc/fail2ban". La nostra distribuzione è la Centos, il file da usare è il "paths-fedora.conf" |
Segue la sezione "DEFAULT", con i principali parametri che andiamo a configurare:
ignoreip = 127.0.0.1/8 ::1 91.54.9.12
bantime = 3600
findtime = 600
maxretry = 3
ignoreip | Qui possiamo indicare la lista degli IP da mettere in whitelist e quindi a cui non applicare le regole di Iptables. Gli IP o le classi di IP vanno inseriti in successione, con un spazio tra uno e il successivo. Di default è previsto "127.0.0.1/8 ::1", noi aggiungiamo l'IP statico "91.54.9.12" con cui giornalmente accediamo al server, così siamo sicuro che in caso di errore nell'inserimento della pwd non veniamo bannati |
bantime | E' il numero di secondi durante i quali l'IP viene lasciato in stato bannato. Nel nostro esempio indichiamo 3600: il parametro è espresso in secondi per cui è 1 ora. Potremmo anche eprimerlo in minuti: "bantime = 60m" |
findtime | Un IP viene bannato se ha generato un numero di tentativi, definito nel parametro successivo maxretry, durante il tempo definito in questo parametro. Nel nostro esempio abbiamo impostato 600 secondi. I |
maxretry | Indica dopo quante volte un IP viene bannato, all'interno del findtime definito. Noi abbiamo indicato 3 per cui se durante i 600 secondi definiti nel "findtime" un IP tenta di accedere 3 volte con una password errata, viene bannato. Se invece ci sono solo 2 tentativi, dopo i 600 secondi, il timing del "findtime" riparte da 0. |
Nella sezione "ACTIONS" abbiamo i seguenti parametri
destemail = postmaster@miosito.it
dest = "Fail2Ban sito"
sender = postmaster@miosito.it
sendername = "Fail2Ban sito"
banaction = iptables-multiport
banaction_allports = iptables-allports
destemail |
L'indirizzo mail a cui inviare eventuali log di Fail2ban |
dest | Il nome associato all'indirizzo email precedente |
sender | L'indirizzo email del mittente della mail di log |
sendername | Il nome associato all'indirizzo email del mittente della mail di log |
banaction | E' l'azione da eseguire di default se una regola è attiva, l'ip viene bannato, ma non ne abbiamo definito una azione specifica (lo vedremo tra poco) |
banaction_allports | Come sopra |
Infine è presente la sezione "JAILS" dove abilitiamo le regole di controllo da eseguire.
Per ogni regola è previsto un blocco di codice, iniziato con il nome della regola racchiusa tra parentesi quadre.
Possiamo indicare quante regole vogliamo, e ogni regola possiamo abilitarla, quindi renderla operativa, indicando dentro la regola "enabled = true", in assenza quella regola non verrà applicata.
In ogni regola dobbiamo anche indicare il nome dell'azione da eseguire. Se non indichiamo l'azione vale quella indicata come default nei parametri "banaction" e "banaction_allports".
Ogni azione ha un suo file specifico, in cui si configura come far "lavorare" questa azione (come ad esempio, dove leggere il file di log relativo al servizio che stiamo controllando). I file delle azioni, come detto in precedenza, sono tutti nella cartella "action.d"
Nel file possiamo trovare già una lista di regole pronte all'uso, dipende dalla versione di Fail2ban installata. Ovviamente potete indicareanche regole create da voi.
Ecco un esempio un estratto di quello che potrete trovare.
[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
enabled = true
[apache-badbots]
# Ban hosts which agent identifies spammer robots crawling the web
port = http,https
logpath = %(apache_access_log)s
bantime = 48h
maxretry = 1
Abbiamo due regole.
La prima, [sshd], verifica i tentativi di accesso al server in SSH, e si chiama [sshd]. La regola è abilitata infatti abbiamo "enabled = true".
La seconda, [apache-badbots], verifica gli accessi al server web dei "bots" che, come sappiamo, scansionano i siti web: potremmo volerli bannare, perchè alcuni sono molto insistenti e sottraggono risorse al server. La regola non è abilitata, in quando non è presente il parametro enabled.
In generale, comunque, per ogni regola indichiamo la porta da tenere sotto controllo, e il path al reativo file di log. Inoltre possiamo definire specifiche variabili "bantime", "findtime", "maxretry" differenti rispetto alle regole di default, come potete vedete nella regola "apache-badbots".
Ogni regola ha poi un suo file specifico di configurazione contenuto nella cartella "/etc/fail2ban/filter.d" che avrà, come nome, il nome indicato tra le parentesi quadre, per cui avremo "sshd.conf" e "apache-badbots.conf". A voi l'onere di aprire questi e vedere cosa c'è al loro interno. Capirete subito come lavorano queste regole: troverete dei "regex" che servono ad analizzare i log del servizio per capire se un IP va bannato.
Attenzione: il contenuto dei blocchi "jails" indicati nel file "jail.conf" cambia in base alla versione installata, per cui potreste trovare discrepanze rispetto a quanto indicato in questo articolo.
Prendiamo ad esempio la regola [sshd]: in una precedente installazione, qualche mese fa, il codice era il seguente, e come vedete è leggermente diverso.
[ssh]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
# sendmail in seconda riga di action
filter = sshd
action = iptables[name=ssh, port=ssh]
logpath = /var/log/secure
enabled = true
La regola di chiama "ssh" ed specificato il filtro da usare "filter = sshd", cioè il file di configurazione della regola da usare è "/etc/fail2ban/filter.d/sshd.conf".
E' anche indicata l'azione da eseguire nel caso in cui l'IP venga bannato, "action = iptables[name=ssh, port=ssh]", e nelle parentesi quadre indichiamo i parametri da passare all'azione, tra cui la porta su cui bloccare l'IP (nel nostro caso la porta specifica ssh cioè la porta 22).
In generale, se non viene indicata l'azione vale l'azione di default configurata nel parametro "banaction".
Se un IP viene bannato verranno applicate uno (se non indicato nulla quella di default) o più azioni.
Ogni azione ha un suo specifico file di configurazione nella directory "/etc/fail2ban/action.d". Troveremo quindi un file chiamato "iptables.conf" al cui interno possiamo capire come venga aggiunta a Iptables una nuova regola per bannare quell'IP sulla porta "port" indicata.
actionstart = <iptables> -N f2b-<name>
<iptables> -A f2b-<name> -j <returntype>
<iptables> -I <chain> -p <protocol> --dport <port> -j f2b-<name>
Non ci soffermiamo ovviamente su Iptables, non è infatti l'oggetto di questo articolo.
Se volessimo bloccare non solo la porta "ssh" ma tutte le porte, usermo l'azione "iptables-multiport" invece di "iptables". Se aprimo il file "/etc/fail2ban/action.d/iptables-multiport.conf" possiamo subito individuare la differenza rispetto alla regola di Iptables.
Come detto, potremmo applicare anche più azioni all'IP bannato, ad esempio, l'"iptables-multiport", per creare la regola in Iptables, e la regola "sendmail-whois.conf" ("/etc/fail2ban/action.d/sendmail-whois.conf") che ci invia una mail nel caso l'IP venga bannato con il whois effettuato. Se invece vogliamo solo una semplice mail usiamo la regola "sendmail.conf". Aprima quest'ultimo file di configurazione, al suo interno troviamo questo codice, al cui interno individuiamo i parametri "<sendername>", "<sender>", "<dest>", configurati all'inizio del blocco "ACTIONS" del file jail.conf
actionban = printf %%b "Subject: [Fail2Ban] <name>: banned <ip> from <fq-hostname>
Date: `LC_ALL=C date +"%%a, %%d %%h %%Y %%T %%z"`
From: <sendername> <<sender>>
To: <dest>\n
Hi,\n
The IP <ip> has just been banned by Fail2Ban after
<failures> attempts against <name>.\n
Regards,\n
Fail2Ban" | /usr/sbin/sendmail -f <sender> <dest>
... Occhio ad attivare questa regola, potreste ricevere centinaia di mail (infatti un server durante la giornata è "attaccatto" decine o centinaia di volte).
Lascio a voi "smanettare" tra tutti i file di configurazione. Forse in futuro dedicherò specifici articoli per specifiche regole... forse :-)
Avvio di Fail2ban
Dopo tutta la spiegazione fatta... ci siamo dimenticati di avviare il servizio Fail2ban. Facciamolo adesso
service fail2ban start
Conoscere le regole attive
Per sapare quali sono le regole attive, senza dovere aprire i file di configurazione, usiamo questo comando
fail2ban-client status
Il risultato sarà la lista delle regole attive, ad esempio se avessimo attive entrambe le regole del nostro esempio:
Status
|- Number of jail: 2
`- Jail list: sshd, apache-badbots
Log di Fail2ban
Tutti i log di Fail2ban relativi agli IP bannati, e "s"bannati lo troviamo qui
/var/log/fail2ban.log
Buttiamo un occhio al suo interno
..................
2020-03-08 08:16:15,507 fail2ban.filter [945]: INFO [sshd] Found 185.49.169.8 - 2020-03-08 08:16:15
2020-03-08 08:16:31,623 fail2ban.filter [945]: INFO [sshd] Found 120.237.123.242 - 2020-03-08 08:16:31
2020-03-08 08:17:35,591 fail2ban.filter [945]: INFO [sshd] Found 222.186.42.75 - 2020-03-08 08:17:35
2020-03-08 08:17:38,860 fail2ban.filter [945]: INFO [sshd] Found 222.186.42.75 - 2020-03-08 08:17:38
2020-03-08 08:17:41,960 fail2ban.filter [945]: INFO [sshd] Found 222.186.42.75 - 2020-03-08 08:17:41
2020-03-08 08:17:42,119 fail2ban.actions [945]: NOTICE [sshd] Ban 222.186.42.75
2020-03-08 08:18:57,298 fail2ban.filter [945]: INFO [sshd] Found 185.51.212.178 - 2020-03-08 08:18:57
2020-03-08 08:18:59,651 fail2ban.filter [945]: INFO [sshd] Found 185.51.212.178 - 2020-03-08 08:18:59
2020-03-08 08:20:40,476 fail2ban.filter [945]: INFO [sshd] Found 83.11.218.36 - 2020-03-08 08:20:40
2020-03-08 08:20:40,574 fail2ban.actions [945]: NOTICE [sshd] Ban 83.11.218.36
2020-03-08 08:20:43,551 fail2ban.filter [945]: INFO [sshd] Found 185.49.169.8 - 2020-03-08 08:20:43
2020-03-08 08:20:49,038 fail2ban.filter [945]: INFO [sshd] Found 119.28.225.92 - 2020-03-08 08:20:49
2020-03-08 08:21:09,771 fail2ban.filter [945]: INFO [sshd] Found 222.186.30.218 - 2020-03-08 08:21:09
2020-03-08 08:21:12,767 fail2ban.filter [945]: INFO [sshd] Found 222.186.30.218 - 2020-03-08 08:21:12
2020-03-08 08:21:14,213 fail2ban.filter [945]: INFO [sshd] Found 222.186.30.218 - 2020-03-08 08:21:14
2020-03-08 08:21:14,662 fail2ban.actions [945]: NOTICE [sshd] Ban 222.186.30.218
2020-03-08 08:22:26,634 fail2ban.filter [945]: INFO [sshd] Found 188.163.249.18 - 2020-03-08 08:22:26
2020-03-08 08:22:28,346 fail2ban.filter [945]: INFO [sshd] Found 188.163.249.18 - 2020-03-08 08:22:28
2020-03-08 08:23:53,929 fail2ban.filter [945]: INFO [sshd] Found 164.132.225.250 - 2020-03-08 08:23:53
2020-03-08 08:23:55,730 fail2ban.filter [945]: INFO [sshd] Found 46.27.140.1 - 2020-03-08 08:23:55
2020-03-08 08:24:51,966 fail2ban.filter [945]: INFO [sshd] Found 120.237.123.242 - 2020-03-08 08:24:51
2020-03-08 08:24:54,252 fail2ban.filter [945]: INFO [sshd] Found 120.237.123.242 - 2020-03-08 08:24:54
2020-03-08 08:24:57,078 fail2ban.filter [945]: INFO [sshd] Found 185.49.169.8 - 2020-03-08 08:24:57
2020-03-08 08:27:19,531 fail2ban.filter [945]: INFO [sshd] Found 119.28.225.92 - 2020-03-08 08:27:19
2020-03-08 08:27:55,214 fail2ban.actions [945]: NOTICE [sshd] Unban 177.75.159.24
......................................
"Found" significa che l'IP è "papabile" per essere bannato, relativamente alla regola [sshd]: vengono quindi verificare le regole relative al maxretry e findtime per capire se bannarlo.
"Ban" significa che l'IP è stato effettivamente bannato
"Unban" significhe che l'IP è stato tolto dalla lista dei bannati.
Come togliere un IP dallo stato bannato
Per togliere un IP dallo lista degli IP bannati, abbiamo due possibili strade
1: Agiamo su Fail2ban
Nella versione v0.8.8 o successiva, utilizziamo questo comando
fail2ban-client set yourjailname unbanip youripaddress
dove al posto di "yourjailname" il nome del "jail" creato da Fail2ban (nel log fail 2 ban è indicato tra parentesi quadre), ed al posto di "youripaddress" indichiamo l'IP da togliere dalla lista degli IP bannati.
Ad esempio
fail2ban-client set sshd unbanip 93.108.212.51
Nelle versioni precedenti di Fail2ban alla v0.8.8 dobbiamo usare questo comando
fail2ban-client get yourjailname actionunban youripaddress
Ad esempio
fail2ban-client get ssh actionunban 93.108.212.51
Per togliere un IP dalla lista degli ip bannati, possiamo, in alternativa, agire direttamente su Iptables.
2: Agiamo su Iptables
Per prima cosa dobbiamo individuare la regole che ha bloccato l'IP. Cerchiamo tra tutte le regole attive quella da rimuovere:
iptables -n -L --line-numbers
Verrà presentato l'elenco delle regole con il relativo numero di linea.
Poi cancelliamo la regola, basandoci sul numero di linea e sul nome dellla catena ("chain name")
iptables -D fail2ban-jailname <linenumber>
Come detto, non ci sofferimiamo su Iptables in quanto non è l'oggetto di questo articolo.
Abbiamo concluso, spero di esservi stato utile!