La première chose à faire est de créer un filtre, qu'on placera dans /etc/fail2ban/filter.d/fail2ban-recidivist.conf . En voici le contenu :

[Definition]
failregex = fail2ban.actions: WARNING \[(.*)\] Ban <HOST>
ignoreregex = fail2ban.actions: WARNING \[fail2ban-recidivist\] Ban <HOST>

La ligne du failregex indique la regex qui permettra de repérer les lignes de ban dans le fichier de log de fail2ban. La dernière ligne permet d'ignorer les bans ajoutés par notre nouvelle règle. Cela évitera de les comptabiliser et donc de fausser le nombre de bans à prendre en compte pour une IP. Notez ici que nous ignorons les bans pour le jail fail2ban-recidivist. Si vous changez le nom du jail, pensez aussi à modifier le filtre pour que l'ignoreregex soit correcte.

Il faut ensuite ajouter un jail dans le fichier /etc/fail2ban/jail.conf, dont voici la définition :

[fail2ban-recidivist]
enabled  = true
filter   = fail2ban-recidivist
action   = iptables-allports[name=recidivist]
logpath  = /var/log/messages
maxretry = 5
# 1 semaine
findtime = 604800
# 1 semaine
bantime  = 604800

Comme pour les autres jails, on indique ici le nom du filtre utilisé (et dont nous avons donné la définition précédemment), l'action à effectuer (je choisis ici de bannir sur tous les ports l'attaquant, et de passer le nom "recidivist" à iptables pour la règle. Il serait aussi possible, voir même judicieux, d'envoyer un e-mail pour vous prévenir de ce ban particulier grâce à l'action sendmail-whois), le fichier de log à scruter, qui est pour ce jail celui de fail2ban (qui utilise SYSLOG dans mon cas), le nombre de tentatives infructueuses, la plage de temps sur laquelle on fait le décompte, et enfin le temps de banissement.

Pour ce cas précis, je bannis pendant une semaine une personne qui a déja été bannie 5 fois durant la dernière semaine par d'autres règles. Sachant que chaque règle a elle aussi un nombre de tentatives d'essais (3 par défaut), cela donne tout de même une bonne tolérance.

Il faut noter que si vous utilisez une action qui ne prend pas en compte de nom (ici recidivist), et qui enregistre simplement l'adresse IP, ce système ne fonctionnera pas. En effet, si une personne est bannie parce qu'elle a essayé de s'authentifier sans succès plusieurs fois, pour une durée d'un jour, et qu'ensuite ce jail bannit l'IP pour une semaine, au bout d'une journée, le premier ban sera retiré, l'IP donc retirée, et le ban d'une semaine annulé. Ce problème n'apparait pas avec iptables car il prend en compte le nom de l'action, et ne confond donc pas les bans. En revanche, cela semble pouvoir se produire avec ipfw, hostsdeny et shorewall.

Voilà grâce à cette règle un serveur un peu plus autonome, qui sévira de façon plus dure s'il est attaqué trop souvent par la même personne.


Fabien (eponyme)