534
contributi
m (Tag non chiuso) |
|||
(44 versioni intermedie di 11 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili| | {{Versioni compatibili|Squeeze|Wheezy|Jessie|Stretch}} | ||
== Introduzione == | == Introduzione == | ||
'''Fail2ban''' ([http://www.fail2ban.org Sito ufficiale]) è un software che è nato per permettere di bloccare gli host che stanno tentando di effettuare un attacco di [[brute force]] via [[SSH]]. | '''Fail2ban''' ([http://www.fail2ban.org Sito ufficiale]) è un software che è nato per permettere di bloccare gli host che stanno tentando di effettuare un attacco di [[brute force]] via [[SSH]]. | ||
Riga 9: | Riga 9: | ||
== Il funzionamento == | == Il funzionamento == | ||
Il funzionamento è semplice: il software si occupa di effettuare il parsing di alcuni file di log (nel caso di ssh, <code>/var/log/auth.log</code>) che contengono le informazioni relative agli accessi falliti. Se vengono contati un numero di tentativi maggiori ad una soglia, l'indirizzo IP viene bloccato, attraverso una regola di iptables, per un tempo impostato e non potrà più accedere al servizio in ascolto su quella porta (ma potrà ancora accedere a quelli sulle altre, cosa molto importante nel caso di indirizzi IP condivisi, come avviene per Fastweb o all'interno delle reti aziendali). | Il funzionamento è semplice: il software si occupa di effettuare il parsing di alcuni file di log (nel caso di ssh, <code>/var/log/auth.log</code>) che contengono le informazioni relative agli accessi falliti. Se vengono contati un numero di tentativi maggiori ad una soglia, l'indirizzo IP viene bloccato, attraverso una regola di iptables, per un tempo impostato e non potrà più accedere al servizio in ascolto su quella porta (ma potrà ancora accedere a quelli sulle altre, cosa molto importante nel caso di indirizzi IP condivisi, come avviene per Fastweb o all'interno delle reti aziendali). | ||
{{Warningbox|Quando si dice che l'IP viene bloccato su un determinato servizio, la macchina resta aperta sugli altri. | |||
'''esempio''' : se fail2ban blocca un attacco su FTP, blocca all'IP l'accesso alla porta 21 lasciando aperte le altre sessioni possibili come SSH, HTTP o altre porte aperte alla comunicazione.}} | |||
== Installazione == | == Installazione == | ||
Riga 23: | Riga 26: | ||
== Configurazione == | == Configurazione == | ||
Fail2ban è già configurato e pronto all'uso, ma alcuni punti hanno bisogno di piccole modifiche. I file di configurazione sono <code>/etc/fail2ban/fail2ban.conf</code> e <code>/etc/fail2ban/jail. | Fail2ban è già configurato e pronto all'uso, ma alcuni punti hanno bisogno di piccole modifiche. I file di configurazione sono <code>/etc/fail2ban/fail2ban.conf</code> e <code>/etc/fail2ban/jail.conf</code>: il primo contiene i parametri di configurazione globali (ad esempio potrete specificare in quale file di log verranno registrati gli avvisi di fail2ban), mentre il secondo contiene i parametri necessari al funzionamento del software. | ||
Il file di configurazione <code>/etc/fail2ban/jail. | Il file di configurazione <code>/etc/fail2ban/jail.conf</code> è diviso per sezioni; ogni sezione inizia ha una struttura simile a: | ||
<pre> | <pre> | ||
[nomesezione] | [nomesezione] | ||
Riga 33: | Riga 36: | ||
</pre> | </pre> | ||
Ogni sezione, quindi, identificherà un controllo da eseguire. Fa eccezione la prima: <code>[DEFAULT]</code>, in quanto contiene i valori di default che verranno usati nelle sezioni successive; ovviamente potranno essere ridefiniti per adattarli ai propri gusti. | Ogni sezione, quindi, identificherà un controllo da eseguire. Fa eccezione la prima: <code>[DEFAULT]</code>, in quanto contiene i valori di default che verranno usati nelle sezioni successive; ovviamente potranno essere ridefiniti per adattarli ai propri gusti.<br/> | ||
Per attivare un filtro è quindi necessario solamente portarsi nella sezione del filtro da attivare e variare il valore della direttiva di abilitazione da: | |||
<pre> | |||
enabled = false | |||
</pre> | |||
a | |||
<pre> | |||
enabled = true | |||
</pre> | |||
== Attivazione di nuovi filtri (Da Debian Stretch) == | |||
Fail2ban utilizza una directory apposita per l'attivazione e la gestione di filtri personalizzati. Tutti i file inseriti in questa directory e aventi estensione <tt>.conf</tt> vengono letti e processati all'avvio del demone. | |||
<br/> | |||
Per attivare dei filtri su demoni diversi da SSH è sufficiente quindi creare un nuovo file di configurazione, inserendolo nella directory <tt>/etc/fail2ban/jail.d</tt>: | |||
<pre> | |||
# nano /etc/fail2ban/jail.d/custom.conf | |||
</pre> | |||
Un contenuto per il file, che ci garantisca un buon numero di filtri attivi può essere il seguente: | |||
<pre> | |||
[DEFAULT] | |||
bantime = 14400 | |||
ignoreip = 127.0.0.1/8 | |||
maxretry = 5 | |||
[sshd] | |||
enabled = true | |||
port = 2293 | |||
logpath = %(sshd_log)s | |||
backend = %(sshd_backend)s | |||
[dropbear] | |||
enabled = true | |||
port = 2293 | |||
logpath = %(dropbear_log)s | |||
backend = %(dropbear_backend)s | |||
[apache-auth] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_error_log)s | |||
[apache-badbots] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_access_log)s | |||
bantime = 172800 | |||
maxretry = 1 | |||
[apache-noscript] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_error_log)s | |||
[apache-overflows] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_error_log)s | |||
maxretry = 2 | |||
[apache-nohome] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_error_log)s | |||
maxretry = 2 | |||
[apache-botsearch] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_error_log)s | |||
maxretry = 2 | |||
[apache-fakegooglebot] | |||
port = http,https | |||
logpath = %(apache_access_log)s | |||
maxretry = 1 | |||
ignorecommand = %(ignorecommands_dir)s/apache-fakegooglebot <ip> | |||
[apache-modsecurity] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_error_log)s | |||
maxretry = 2 | |||
[apache-shellshock] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_error_log)s | |||
maxretry = 1 | |||
[php-url-fopen] | |||
enabled = true | |||
port = http,https | |||
logpath = %(apache_access_log)s | |||
[suhosin] | |||
enabled = true | |||
port = http,https | |||
logpath = %(suhosin_log)s | |||
[roundcube-auth] | |||
[roundcube-auth] | |||
#enabled = true | |||
port = http,https | |||
logpath = %(roundcube_errors_log)s | |||
[drupal-auth] | |||
enabled = true | |||
port = http,https | |||
logpath = %(syslog_daemon)s | |||
backend = %(syslog_backend)s | |||
[monit] | |||
#enabled = true | |||
port = 2812 | |||
logpath = /var/log/monit | |||
[webmin-auth] | |||
enabled = true | |||
port = 10000 | |||
logpath = %(syslog_authpriv)s | |||
backend = %(syslog_backend)s | |||
[froxlor-auth] | |||
enabled = true | |||
port = http,https | |||
logpath = %(syslog_authpriv)s | |||
backend = %(syslog_backend)s | |||
[vsftpd] | |||
enabled = true | |||
port = ftp,ftp-data,ftps,ftps-data | |||
logpath = %(vsftpd_log)s | |||
[postfix] | |||
#enabled = true | |||
port = smtp,465,submission | |||
logpath = %(postfix_log)s | |||
backend = %(postfix_backend)s | |||
[postfix-rbl] | |||
#enabled = true | |||
port = smtp,465,submission | |||
logpath = %(postfix_log)s | |||
backend = %(postfix_backend)s | |||
maxretry = 1 | |||
[postfix-sasl] | |||
#enabled = true | |||
port = smtp,465,submission,imap3,imaps,pop3,pop3s | |||
logpath = %(postfix_log)s | |||
backend = %(postfix_backend)s | |||
[squirrelmail] | |||
#enabled = true | |||
port = smtp,465,submission,imap2,imap3,imaps,pop3,pop3s,http,https,socks | |||
logpath = /var/lib/squirrelmail/prefs/squirrelmail_access_log | |||
[recidive] | |||
enabled = true | |||
logpath = /var/log/fail2ban.log | |||
banaction = %(banaction_allports)s | |||
bantime = 604800 ; 1 week | |||
findtime = 86400 ; 1 day | |||
[pam-generic] | |||
enabled = true | |||
banaction = %(banaction_allports)s | |||
logpath = %(syslog_authpriv)s | |||
backend = %(syslog_backend)s | |||
[xinetd-fail] | |||
enabled = true | |||
banaction = iptables-multiport-log | |||
logpath = %(syslog_daemon)s | |||
backend = %(syslog_backend)s | |||
maxretry = 2 | |||
</pre> | |||
== Attivazione di nuovi filtri (Fino a Debian Jessie) == | |||
=== Server di posta Dovecot === | |||
Creare il file di filtro <code>/etc/fail2ban/filter.d/dovecot-pop3imap.conf</code>: | |||
<pre> | |||
[Definition] | |||
failregex = (?: pop3-login|imap-login): (?:Authentication failure|Aborted login \(auth failed|Disconnected \(auth failed).*rip=(?P<host>\S*),.* | |||
ignoreregex = | |||
</pre> | |||
Aggiungere questa sezione al file <code>/etc/fail2ban/jail.conf</code>: | |||
<pre> | |||
[dovecot-pop3imap] | |||
enabled = true | |||
filter = dovecot-pop3imap | |||
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,imap", protocol=tcp] | |||
logpath = /var/log/maillog | |||
maxretry = 10 | |||
findtime = 1200 | |||
bantime = 1200 | |||
</pre> | |||
=== Server di Posta Postfix === | |||
Creare il file di filtro <code>/etc/fail2ban/filter.d/postfix-auth.conf</code>: | |||
<pre> | |||
[Definition] | |||
failregex = (?i): warning: [-._\w]+\[\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD$ | |||
ignoreregex = | |||
</pre> | |||
Aggiungere questa sezione al file <code>/etc/fail2ban/jail.conf</code>: | |||
<pre> | |||
[postfix-auth] | |||
enabled = true | |||
port = smtp,ssmtp | |||
filter = postfix-auth | |||
logpath = /var/log/syslog | |||
</pre> | |||
Creare il file di filtro <code>/etc/fail2ban/filter.d/postfix-sasl.conf</code>: | |||
<pre> | |||
[Definition] | |||
failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGE$ | |||
ignoreregex = | |||
</pre> | |||
Aggiungere questa sezione al file <code>/etc/fail2ban/jail.conf</code>: | |||
<pre> | |||
[postfix-sasl] | |||
enabled = true | |||
port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s | |||
filter = postfix-sasl | |||
logpath = /var/log/mail.log | |||
</pre> | |||
=== Apache === | |||
Aggiungere in <code>/etc/fail2ban/jail.d/jail.local</code> i seguenti filtri: | |||
<pre> | |||
##To block failed login attempts use the below jail. | |||
[apache] | |||
enabled = true | |||
port = http,https | |||
filter = apache-auth | |||
logpath = /var/log/apache2/*error.log | |||
maxretry = 3 | |||
bantime = 600 | |||
##To block the remote host that is trying to request suspicious URLs, use the below jail. | |||
[apache-overflows] | |||
enabled = true | |||
port = http,https | |||
filter = apache-overflows | |||
logpath = /var/log/apache2/*error.log | |||
maxretry = 3 | |||
bantime = 600 | |||
##To block the remote host that is trying to search for scripts on the website to execute, use the below jail. | |||
[apache-noscript] | |||
enabled = true | |||
port = http,https | |||
filter = apache-noscript | |||
logpath = /var/log/apache2/*error.log | |||
maxretry = 3 | |||
bantime = 600 | |||
##To block the remote host that is trying to request malicious bot, use below jail. | |||
[apache-badbots] | |||
enabled = true | |||
port = http,https | |||
filter = apache-badbots | |||
logpath = /var/log/apache2/*error.log | |||
maxretry = 3 | |||
bantime = 600 | |||
##To stop DOS attack from remote host. | |||
[http-get-dos] | |||
enabled = true | |||
port = http,https | |||
filter = http-get-dos | |||
logpath = /var/log/apache*/access.log | |||
maxretry = 400 | |||
findtime = 400 | |||
bantime = 600 | |||
action = iptables[name=HTTP, port=http, protocol=tcp] | |||
</pre> | |||
Dovremo quindi creare la regola dell'unico filtro mancante nel pacchetto installato dai repository: | |||
<pre> | |||
# nano /etc/fail2ban/filter.d/http-get-dos.conf | |||
</pre> | |||
con questo contenuto: | |||
<pre> | |||
# Fail2Ban configuration file | |||
[Definition] | |||
# Option: failregex | |||
# Note: This regex will match any GET entry in your logs, so basically all valid and not valid entries are a match. | |||
# You should set up in the jail.conf file, the maxretry and findtime carefully in order to avoid false positives. | |||
failregex = ^<HOST> -.*"(GET|POST).* | |||
# Option: ignoreregex | |||
ignoreregex = | |||
</pre> | |||
Salviamo e riavviamo: | |||
<pre> | |||
# systemctl restart fail2ban | |||
</pre> | |||
=== Server FTP=== | |||
All'interno del file /etc/fail2ban/jail.conf è presente una sezione FTP in cui basta abilitare quello che si desidera. | |||
<pre> | |||
# FTP servers | |||
# | |||
[vsftpd] | |||
enabled = false | |||
port = ftp,ftp-data,ftps,ftps-data | |||
filter = vsftpd | |||
logpath = /var/log/vsftpd.log | |||
# or overwrite it in jails.local to be | |||
# logpath = /var/log/auth.log | |||
# if you want to rely on PAM failed login attempts | |||
# vsftpd's failregex should match both of those formats | |||
maxretry = 6 | |||
[proftpd] | |||
enabled = true | |||
port = ftp,ftp-data,ftps,ftps-data | |||
filter = proftpd | |||
logpath = /var/log/secure.log | |||
maxretry = 3 | |||
[wuftpd] | |||
enabled = false | |||
port = ftp,ftp-data,ftps,ftps-data | |||
filter = wuftpd | |||
logpath = /var/log/auth.log | |||
maxretry = 6</pre> | |||
Nel caso di proftpd e wuftpd sono già presenti i filtri in <code>/etc/fail2ban/filter.d</code> | |||
Si può aggiungere al filtro di proftpd questa stringa in caso di ban non effettuati su tentativi di accesso non consentito: | |||
<pre>USER S+: no such user found from S* ?[] to S+s*$</pre> | |||
=== SSH === | |||
All'interno del file <code>/etc/fail2ban/jail.conf</code> è presente una sezione SSH in cui basta abilitare quello che si desidera. | |||
<pre> | |||
[ssh] | |||
enabled = true | |||
port = ssh | |||
filter = sshd | |||
logpath = /var/log/auth.log | |||
maxretry = 3 | |||
[ssh-ddos] | |||
enabled = true | |||
port = ssh | |||
filter = sshd-ddos | |||
logpath = /var/log/auth.log | |||
maxretry = 3 | |||
</pre> | |||
Per ciò che riguarda la riga: | |||
<pre> | |||
port = ssh | |||
</pre> | |||
"ssh" va sostituito con la porta effettivamente usata dall'utente. Nel caso si lasci "ssh", il ban avverrà sulla porta di default di SSH (porta 22). | |||
=== Altri filtri consigliati === | |||
Alcuni filtri utili da inserire in <code>jail.local</code>: | |||
<pre> | |||
[pam-generic] | |||
enabled = true | |||
banaction = iptables-allports | |||
[apache-nohome] | |||
enabled = true | |||
port = http,https | |||
filter = apache-nohome | |||
banaction = iptables-multiport | |||
action = %(action_mwl)s | |||
logpath = /var/log/apache*/*access.log | |||
maxretry = 1 | |||
[php-url-fopen] | |||
enabled = true | |||
port = http,https | |||
filter = php-url-fopen | |||
logpath = /var/log/apache*/*access.log | |||
maxretry = 1 | |||
</pre> | |||
=== Attivazione dei nuovi filtri === | |||
Dopo ogni modifica del file di configurazione <code>/etc/fail2ban/jail.conf</code> occorre riavviare il demone di fail2ban: | |||
<pre> | |||
# /etc/init.d/fail2ban reload | |||
</pre> | |||
== I Parametri == | == I Parametri == | ||
Riga 48: | Riga 447: | ||
; <code>logpath = /var/log/auth.log</code> : il file contenente il log da controllare; | ; <code>logpath = /var/log/auth.log</code> : il file contenente il log da controllare; | ||
== Gestione di Fail2ban == | |||
Esistono due comandi accessori che permettono la programmazione del servizio o la visualizzazione dello status di jailing (monitoraggio) dei servizi: | |||
<pre> | |||
# fail2ban-client status | |||
Status | |||
|- Number of jail: 3 | |||
`- Jail list: proftpd, ssh, apache-multiport | |||
</pre> | |||
ci elenca il numero di Jail attive. | |||
<br/> | |||
Per listare lo stato di una JAIL specifica si utilizzi il comando: | |||
<pre> | |||
# fail2ban-client status ssh | |||
Status for the jail: ssh | |||
|- filter | |||
| |- Currently failed: 0 | |||
| `- Total failed: 8 | |||
`- action | |||
|- Currently banned: 0 | |||
| `- IP list: [] | |||
`- Total banned: 1 | |||
</pre> | |||
Per disabilitare dinamicamente una JAIL, ad esempio ssh, si usi il comando: | |||
<pre> | |||
# fail2ban-client set ssh idle off | |||
False | |||
</pre> | |||
Per attivare una nuova jail: | |||
<pre> | |||
# fail2ban-client add apache | |||
Added jail apache | |||
# fail2ban-client start apache | |||
Jail started | |||
</pre> | |||
== Esempi di Azioni == | == Esempi di Azioni == | ||
=== Filtraggio semplice === | === Filtraggio semplice === | ||
Riga 72: | Riga 505: | ||
# /etc/init.d/fail2ban restart | # /etc/init.d/fail2ban restart | ||
</pre> | </pre> | ||
== Analisi dei file di log == | |||
Per verificare se il nostro host è sottoposto ad attacchi sulle password, ad esempio sulla porta di ssh, possiamo usare questo comodo comando: | |||
<pre> | |||
# cat /var/log/auth.log* | grep 'Authentication failure' | grep sshd | awk '{print $1,$2}' | | |||
sort | uniq -c | |||
2 Mar 6 | |||
21 Mar 8 | |||
</pre> | |||
Se si vuole invece tenere sottocontrollo il sistema di banning si possono usare un paio di comandi che opportunamente redirezionati possono generarci una mail: | |||
<pre> | |||
# grep "Ban " /var/log/fail2ban.log | awk -F[\ \:] '{print $10,"("$7")"}' | sort | uniq -c | sort | |||
10 Set (INFO) | |||
5 192.168.0.10 (WARNING) | |||
</pre> | |||
Questo comando elenca IP attaccante e numero di tentativi falliti. | |||
== Sbloccare IP bloccati == | == Sbloccare IP bloccati == | ||
Riga 111: | Riga 560: | ||
== Prova di funzionamento == | == Prova di funzionamento == | ||
=== Prova 1 === | === Prova 1 === | ||
Per iniziare possiamo semplicemente provare a collegarci via SSH alla nostra macchina protetta da Fail2ban, sbagliando apposta a digitare nome utente e password. Supponendo che l'indirizzo IP della macchina da proteggere sia <code>192.168.1.10</code> eseguiamo: | |||
<pre> | |||
$ ssh ferdyy@192.168.1.10 | |||
</pre> | |||
per un numero di volte sufficiente a far scattare Fail2ban.<br/> | |||
Controlliamo poi di aver ricevuto l'email di avvertimento: | |||
<pre> | |||
From fail2ban@ITSecurity Thu Jul 16 04:59:24 2009 | |||
Subject: [Fail2Ban] ssh: banned 192.168.1.13 | |||
Hi, | |||
The ip 1192.168.1.13 has just been banned by Fail2Ban after | |||
5 attempts against ssh. | |||
Here are more information about 192.168.1.13: | |||
{whois info} | |||
Lines containing IP:192.168.1.13 in /var/log/auth.log | |||
Jul 16 04:59:16 example.com sshd[10390]: Failed password for root from 192.168.1.13 port 46023 ssh2 | |||
Jul 16 04:59:18 example.com sshd[10390]: Failed password for root from 192.168.1.13 port 46023 ssh2 | |||
Jul 16 04:59:20 example.com sshd[10390]: Failed password for root from 192.168.1.13 port 46023 ssh2 | |||
Jul 16 04:59:21 example.comsshd[10394]: reverse mapping checking getaddrinfo for 192.168.1.13.example.com [192.168.1.13] failed - POSSIBLE BREAK-IN ATTEMPT! | |||
Jul 16 04:59:22 example.com sshd[10394]: Failed password for root from 192.168.1.13 port 46024 ssh2 | |||
Regards, | |||
Fail2Ban | |||
</pre> | |||
Ottimo! Fail2ban funziona.<br/> | |||
Se ora controlliamo la coda di iptables, dovremmo trovare una nuova regola: | |||
<pre> | |||
# iptables -L | |||
Chain fail2ban-ssh (1 references) | |||
target prot opt source destination | |||
DROP all -- 192.168.1.13.example.com anywhere | |||
</pre> | |||
In alternativa è possibile controllare che fail2ban riesca a leggere dal file di log, con il comando | |||
<pre># fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf</pre> | |||
=== Prova 2 === | === Prova 2 === | ||
Riga 235: | Riga 727: | ||
Fail2Ban | Fail2Ban | ||
</pre> | </pre> | ||
== Sitografia == | |||
[http://www.sistemistiindipendenti.org Sistemisti Indipendenti] | |||
{{Autori | |||
|Autore = [[User:Maxer|Maxer]] | |||
|Verificata_da= | |||
:[[Utente:porkyhttp|porkyhttp]] 17:04, 06 mag 2012 (CEST) | |||
: lula 12 gen 2017 (CET) | |||
|Estesa_da = | |||
: [[Utente : mm-barabba|mm-barabba]] 06-04-2013 | |||
}} | |||
[[Categoria:SSH server e amministrazione remota]] | [[Categoria:SSH server e amministrazione remota]] | ||
[[Categoria:Firewall]] | [[Categoria:Firewall]] | ||
[[Categoria:Monitoraggio]] | [[Categoria:Monitoraggio]] |