Fail2ban
Qu'est-ce que Fail2ban?
Fail2ban lit des fichiers de log comme /var/log/pwdfail ou /var/log/apache/error_log et bannit les adresses IP qui ont obtenu un trop grand nombre d'échecs lors de l'authentification. Il met à jour les règles du pare-feu pour rejeter cette adresse IP. Ces règles peuvent êtres défines par l'utilisateur. Fail2ban peut lire plusieurs fichiers de log comme ceux de sshd ou du serveur Apache.
Installation
apt-get install fail2ban
Par défaut, le port 22 (ssh) est surveillé, vous pouvez vérifier que les règles ipatbles ont bien prises en compte fail2ban:
iptables -S | grep fail2ban
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-ssh -j RETURN
Configuration
Deux fichiers:
fail2ban.conf
Rien à faire dans ce fichier, vous pouvez laisser les options par défaut:
/etc/fail2ban/fail2ban.conf
loglevel = 3 logtarget = /var/log/fail2ban.log socket = /var/run/fail2ban/fail2ban.sock
jail.conf
Ce fichier est beaucoup plus intéressant, il contient tous les services à monitorer, et vous allez le découvrir, fail2ban ne se limite pas à SSH...
/etc/fail2ban/jail.conf
Vérifiez l'adresse d'envoi des mails d'avertissement:
[DEFAULT] destemail = root@localhost
Erreur commune pour l'envoi des mail d'alertes
N'oubliez pas de modifier la variable action = %(action_)s Et de la placer soit sur:
action = %(action_mw)s
Soit sur
action = %(action_mwl)s
Pour activer la surveillance d'un service, il suffit de placer la variable "enabled" à "true"
Par défaut la protection du servie SSH est activée, pas les autres: Si votre ssh n'écoute pas sur le port 22, pensez à le changer... (port = N° de port)
[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6
D'autres services, à activer en fonction de vos besoins:
[xinetd-fail] enabled = true filter = xinetd-fail port = all banaction = iptables-multiport-log logpath = /var/log/daemon.log maxretry = 2
[pam-generic] enabled = true filter = pam-generic port = all banaction = iptables-allports port = anyport logpath = /var/log/auth.log maxretry = 6
[ssh-ddos] enabled = true port = ssh filter = sshd-ddos logpath = /var/log/auth.log maxretry = 6
[apache] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache*/*error.log maxretry = 6
[apache-multiport] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache*/*error.log maxretry = 6
[apache-noscript] enabled = true port = http,https filter = apache-noscript logpath = /var/log/apache*/*error.log maxretry = 6
[apache-overflows] enabled = true port = http,https filter = apache-overflows logpath = /var/log/apache*/*error.log maxretry = 2
[postfix] enabled = true port = smtp,ssmtp filter = postfix logpath = /var/log/mail.log
[sasl] enabled = true port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s filter = sasl logpath = /var/log/mail.log
n'oubliez pas de redémarrer fail2ban :
# service fail2ban restart
Test
Testez les règles
L'erreur commune est de se tromper de fichier log... Vérifiez et revérifiez que le fichier donné en "logpath" est le bon. Ensuite testez vos règles avec la commande /usr/bin/fail2ban-regex
# /usr/bin/fail2ban-regex /var/www/path/logs/userlogins /etc/fail2ban/filter.d/roundcube.conf
Exemple de sortie:
Running tests
=
Use regex file : /etc/fail2ban/filter.d/roundcube.conf
Use log file : /var/www/path/logs/userlogins
Results
=
Failregex
|- Regular expressions:
| [1] FAILED login for .*. from <HOST>
|
`- Number of matches:
[1] 1 match(es)
Ignoreregex
|- Regular expressions:
|
`- Number of matches:
Summary
=
Addresses found:
[1]
41.xxx.xxx.xxx (Wed Dec 28 15:51:14 2011)
Date template hits:
0 hit(s): MONTH Day Hour:Minute:Second
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/MONTH/Year:Hour:Minute:Second
0 hit(s): Month/Day/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
2 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond]
0 hit(s): Day-Month-Year Hour:Minute:Second
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601
0 hit(s): Hour:Minute:Second
0 hit(s): <Month/Day/Year@Hour:Minute:Second>
Success, the total number of match is 1
However, look at the above section 'Running tests' which could contain important
information.
Testez l'état des jails
Avec la commande /usr/bin/fail2ban-client vous pouvez vérifier l'état de vos "jails":
# /usr/bin/fail2ban-client status apache-404
Exemple de sortie:
Status for the jail: apache-404
|- filter
| |- File list: /var/log/path/error.log /var/log/path2/error.log /var/log/path2/error.log Etc...
| |- Currently failed: 5
| `- Total failed: 32
`- action
|- Currently banned: 2
| `- IP list: 41.xxx.xxx.xxx 84.xxx.xxx.xxx
`- Total banned: 2
Testez en violant une règle
Créez par exemple un répertoire dans votre serveur apache, rendez obligatoire l'identification, puis entrez plusieurs fois de suite un mot de passe erroné. Vous devriez avoir dans vols logs ceci:
tail -f /var/log/fail2ban.log
2011-08-08 12:27:18,730 fail2ban.actions: WARNING [apache] Ban 10.9.11.150
Effectivement, iptables à bloqué votre ip:
iptables -L
Chain fail2ban-apache (1 references) target prot opt source destination DROP all -- 10.9.11.150 anywhere RETURN all -- anywhere anywhere
Au bout de 10 minutes (en fonction de ce que vous aurez précisé dans le configuration), l'IP sera de nouveau "libérée":
2011-08-08 12:37:19,585 fail2ban.actions: WARNING [apache] Unban 10.9.11.150
Erreur au démarrage de fail2ban
Si vous surveillez plusieurs services, il existe un bug gênant sur fail2ban (fail2ban: fails to load iptable rules with multiple jails) - Il existe une solution :
Lorsque vous démarrerez fail2ban, surveillez ses logs, vous devriez avoir ceci:
2011-08-08 16:44:40,564 fail2ban.jail : INFO Jail 'apache-noscript' started 2011-08-08 16:44:40,810 fail2ban.jail : INFO Jail 'pam-generic' started 2011-08-08 16:44:41,051 fail2ban.jail : INFO Jail 'xinetd-fail' started 2011-08-08 16:44:41,269 fail2ban.jail : INFO Jail 'ssh-ddos' started 2011-08-08 16:44:41,506 fail2ban.jail : INFO Jail 'apache-multiport' started 2011-08-08 16:44:41,739 fail2ban.jail : INFO Jail 'apache-overflows' started 2011-08-08 16:44:41,976 fail2ban.jail : INFO Jail 'ssh' started 2011-08-08 16:44:42,206 fail2ban.jail : INFO Jail 'postfix' started 2011-08-08 16:44:42,448 fail2ban.jail : INFO Jail 'sasl' started 2011-08-08 16:44:42,667 fail2ban.jail : INFO Jail 'apache' started
Si vous avez ce genre de message d'erreur:
2011-08-08 12:22:52,286 fail2ban.actions.action: ERROR iptables -N fail2ban-pam-generic iptables -A fail2ban-pam-generic -j RETURN iptables -I INPUT -p tcp -j fail2ban-pam-generic returned 400 2011-08-08 15:06:04,467 fail2ban.actions.action: ERROR iptables -D INPUT -p tcp -m multiport --dports 10122 -j fail2ban-ssh-ddos iptables -F fail2ban-ssh-ddos iptables -X fail2ban-ssh-ddos returned 100 2011-08-08 15:06:10,027 fail2ban.actions.action: ERROR iptables -N fail2ban-apache-overflows iptables -A fail2ban-apache-overflows -j RETURN iptables -I INPUT -p tcp -m multiport --dports http,https -j fail2ban-apache-overflows returned 200 2011-08-08 15:06:10,224 fail2ban.actions.action: ERROR iptables -N fail2ban-postfix iptables -A fail2ban-postfix -j RETURN iptables -I INPUT -p tcp -m multiport --dports smtp,ssmtp -j fail2ban-postfix returned 400 2011-08-08 15:06:10,283 fail2ban.actions.action: ERROR iptables -N fail2ban-sasl iptables -A fail2ban-sasl -j RETURN iptables -I INPUT -p tcp -m multiport --dports smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s -j fail2ban-sasl returned 200 2011-08-08 15:14:26,002 fail2ban.actions.action: ERROR iptables -D INPUT -p tcp -m multiport --dports http,https -j fail2ban-apache-overflows iptables -F fail2ban-apache-overflows iptables -X fail2ban-apache-overflows returned 100 2011-08-08 15:14:28,374 fail2ban.actions.action: ERROR iptables -D INPUT -p tcp -m multiport --dports smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s -j fail2ban-sasl iptables -F fail2ban-sasl iptables -X fail2ban-sasl returned 100 2011-08-08 15:14:45,382 fail2ban.actions.action: ERROR iptables -N fail2ban-apache-noscript iptables -A fail2ban-apache-noscript -j RETURN iptables -I INPUT -p tcp -m multiport --dports http,https -j fail2ban-apache-noscript returned 400
Il existe deux solutions:
1) Modifier le fichier /usr/bin/fail2ban-client
Faite une sauvegarde de auparavant...
Editez le fichier /usr/bin/fail2ban-client et ajoutez une temporisation (time.sleep(0.1)) à cet endroit:
def __processCmd(self, cmd, showRet = True): beautifier = Beautifier() for c in cmd: time.sleep(0.1) beautifier.setInputCmd(c)
Si la temporisation à 0.1 ne suffit pas, mettez 0.2. et redémarrez fail2ban.
2) Installer la version testing (Fixed in version fail2ban/0.8.5-2)
Liens externes
Je vous encourage à lire:
- La page de man de fail2ban
- Le Wiki de fail2ban - Très complet
Lol 8 août 2011 à 09:00 (CDT)