Magazine

Fail2ban,Ferma gli attacchi brute force

Creato il 20 aprile 2011 da Linuxaria

fail2ban

Come commento dell’articolo “Knockd, per garantire la sicurezza delle porte”, ho ricevuto:
“Usare knockd è una cattiva idea: una pessima idea.

“Knockd è, alla fine, una password. Un’unica password sniffable che è soggetta ad attacchi di tipo man-in-the-middle e quindi non si possono usare nemmeno one-time-password ed essere sicuri.

Coppie di chiavi Pubbliche/private  e/o one-time-password (Opie, skey e simili) sono le soluzioni reali, insieme al monitoraggio dinamico per prevenire attacchi DOS che portino all’esaurimento delle risorse CPU. (OpenBSD PF incorpora una bella soluzione, così come iptables con fail2ban/denyhosts/etc. Anche swatch può fare miracoli.) ”

Ebbene, a mio parere knockd è un livello di sicurezza, forse sottile ma comunque può salvare da alcuni script che tentano attacchi del tipo forza bruta e quindi aggiunge un po’ di sicurezza alla vostra soluzione, in questo articolo vi mostrerò fail2ban che aggiunge un altro strato di sicurezza ai nostri servizi esposti in rete.
Fail2ban è un software per la prevenzione alle intrusioni scritto nel linguaggio di programmazione Python. E’ in grado di girare su sistemi POSIX che hanno un interfaccia ad un sistema di pacchetti di controllo o firewall installato localmente (per esempio, iptables o TCP Wrapper).
La funzione principale di Fail2ban è quella di bloccare gli indirizzi IP selezionati che possono appartenere a host che sta tentando di violare la sicurezza del sistema. Determina i server che devono essere bloccati da un controllo dei file di log (per esempio /var/log/pwdfail, /var/log/auth.log, ecc) e proibisce l’accesso ad ogni host IP che ha troppi tentativi di accesso o esegue altre azioni indesiderate in un arco di tempo definito dall’amministratore.

Installazione

fail2ban è disponibile su Debian, Ubuntu, Gentoo, Arch, Suse e Fedora quindi su queste distro potete usare il gestore di pacchetti standard per installarlo (con le sue dipendenze), i.g. aptitude install fail2ban, emerge net-analyzer/fail2ban.

Uso

fail2ban è composto da due programmi, il server (fail2ban-server) che monitorizza i log e usa un socket unix per parlare con il client e passargli le informazioni in tempo reale. Il server non sa nulla del file di configurazione. Così, allo start-up, il server è in uno stato di “default” in cui non ci sono “jail” (prigioni) definite.

fail2ban-client è il frontend di fail2ban. Si connette al file di socket del server ed invia comandi al fine di configurare e gestire il server. Il client può leggere i file di configurazione o può semplicemente essere utilizzato per inviare un unico comando al server utilizzando la riga di comando o la modalità interattiva (che si attiva con l’opzione -i).

Configurazione

Una configurazione tipica si presenta così:

/etc/fail2ban/
├── action.d
│   ├── dummy.conf
│   ├── hostsdeny.conf
│   ├── iptables.conf
│   ├── mail-whois.conf
│   ├── mail.conf
│   └── shorewall.conf
├── fail2ban.conf
├── fail2ban.local
├── filter.d
│   ├── apache-auth.conf
│   ├── apache-noscript.conf
│   ├── couriersmtp.conf
│   ├── postfix.conf
│   ├── proftpd.conf
│   ├── qmail.conf
│   ├── sasl.conf
│   ├── sshd.conf
│   └── vsftpd.conf
├── jail.conf
└── jail.local

Ogni file .conf può essere sovrascritto con un file chiamato .local . Il file .conf viene letto prima, poi il .local, con le impostazioni lette dopo che sovrascrivono le precedenti. Così, un file .local non deve necessariamente includere tutto ciò che è presente nel file corrispondente .conf, solo le impostazioni che si desidera configurare in maniera diversa. Le modifiche devono avvenire nel file .local e non nel .conf. Questo evita problemi durante l’aggiornamento.

Configurazione generale

Il file fail2ban.conf contiene le impostazioni generali per il demone fail2ban-server, come ad esempio il livello di log e la sua destinazione. È inoltre possibile specificare qual’è il percorso del socket utilizzato per la comunicazione tra il client e il server.

jails

Il più importante file è probabilmente jail.conf, che contiene la dichiarazione delle vostro jails.
I parametri più importanti sono:

PARAMETRO	DESCRIZIONE
ignoreip	Lista di IP da ignorare, IP possono essere inseriti con il netmask /24 per esempio
bantime	        Tempo in secondi per il quale non accettiamo piu connessioni dal HOST
findtime	Tempo di reset dei tentativi, dopo X secondi il contatore del retry è resettato
maxretry	Numero di tentativi massimo in un intervallo findtime
action	        Cosa fare quando si raggiunge il maxretry, normalmente si blocca la porta a quel IP
port	        Il servizio o meglio la porta che usa quel servizio che vogliamo controllare
filter	        La regola di filtro che applichiamo ai log in /etc/fail2ban/filter.d
logpath	        Naturalmente il log da monitorare e ricordiamoci di attivare il daemon per scrivere le info necessarie

Esempi:

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

Questo è l’esempio classico per ssh, verifica il log /var/log/auth.log utilizzando il filtro che si chiama sshd e se trova 6 tentativi di attacco chiude la porta 22 (azione di default)

[apache-multiport]
enabled   = true
port      = http,https
filter    = apache-auth
logpath   = /var/log/apache*/*error.log
maxretry  = 6

Questo esempio per Apache è molto simile, ma ha come differenza che blocca 2 porte (http ed https) e verifica più file di log.

Filtri

La directory filter.d contiene principalmente le espressioni regolari che vengono utilizzate per individuare tentativi di intrusione, fallimenti password, ecc Questo è un esempio per filter.d/sshd.conf con alcune possibili espressioni regolari per verificare le linee del file di log:

failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from \s*$
            ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from \s*$
            ^%(__prefix_line)sFailed (?:password|publickey) for .* from (?: port \d*)?(?: ssh\d*)?$
            ^%(__prefix_line)sROOT LOGIN REFUSED.* FROM \s*$
            ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from \s*$
            ^%(__prefix_line)sUser .+ from  not allowed because not listed in AllowUsers$
            ^%(__prefix_line)sauthentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=(?:\s+user=.*)?\s*$
            ^%(__prefix_line)srefused connect from \S+ \(\)\s*$
            ^%(__prefix_line)sAddress  .* POSSIBLE BREAK-IN ATTEMPT!*\s*$
            ^%(__prefix_line)sUser .+ from  not allowed because none of user's groups are listed in AllowGroups\s*$

Far partire il server

Dopo aver configurato tutti i filtri ed i servizi che si desidera monitorare è possibile avviare il server con il comando:

sudo /etc/init.d/fail2ban start

Comandi utili

per vedere tutta la configurazione con eventuali warning usiamo il comando

fail2ban-client -d

Possiamo testare le espressioni regolari di un filtro

fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Per vedere chi è stato bannato

iptables -L

Riferimenti:

Esempi di configurazioni
Fail2ban guida all’uso

Dal minuto 7.00 per una guida a fail2ban


Ritornare alla prima pagina di Logo Paperblog