Fail2ban

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

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:

Lol 8 août 2011 à 09:00 (CDT)