Configurer Fail2Ban sur Raspbian

Sans vous en rendre nécessairement compte, vous pouvez être sujet à des tas de tentatives de login parasite sur votre Raspberry Pi, surtout si vous lui faites tourner un serveur Web, visible donc depuis l’extérieur.
De nombreux bots sont à l’affût et vont tenter de rentrer chez vous en sondant constamment vos ports vulnérables et rentrer, au hasard, des login et mots de passe jusqu’à ce que “ça passe”.

Bien que les box internet soient normalement destinées à ne laisser passer que le trafic sur les ports précis (le port forwarding), je me retrouve dans un cas plutôt incompréhensible où mon Raspberry Pi reçoit des demandes de login sur des ports qui ne sont pas forwardés, et qui ne devraient donc jamais être visibles… Sauf que si. La preuve dans /var/log/auth.log :

Fail2Ban est un programme qui permet de bannir des adresses IP en fonction de règles que l’on aura établies.
Voici un exemple de règles que nous allons tenter d’appliquer : “après 3 tentatives de login sur un port qui n’est pas dans ma liste, bannis l’adresse IP”.

En avant.

sudo apt update && sudo apt full-upgrade -y
sudo apt install fail2ban

Création de la règle et du filtre

Ceci étant fait, nous allons créer la règle (appelée “jail”) en elle-même :

sudo nano /etc/fail2ban/jail.d/myjail_wrongport.local

Puis copiez le contenu suivant :

[custom-port]
enabled = true
filter = myban_wrongports
action = iptables-allports
logpath = /var/log/fail2ban.log
maxretry = 3
findtime = 3600
bantime = -1

Ceci indique à Fail2Ban que : “la règle custom-port est activée, requiert le filtre (pas encore créé) myban_wrongports, si ce filtre est déclenché 3 fois sur un temps de 3600 secondes, bannis l’IP pour toujours (-1 à bantime)”.

Maintenant, nous allons créer le filtre en question :

sudo nano /etc/fail2ban/filter.f/myban_wrongports.conf

Et copiez-y le contenu :

[Definition]
failregex = ^ -.*\b(80|443)\b
ignoreregex =

Dans l’expression regex ci-dessus, entre parenthèses se trouve la liste des ports en-dehors desquels un ban est déclenché. Ci-dessus, seuls 80 et 443 sont autorisés, mais vous pouvez ajouter les ports de votre choix entre symboles OU (|), soit AltGr-6 .

Gestion de la persistance des bannissements

Ceci étant fait, il faut maintenant gérer les persistance des bannissements, car si jamais vous redémarrez Fail2Ban, ou votre machine tout court, celui-ci oubliera tout.
A noter que F2B utilise déjà une database locale, mais son usage ne sera pas détaillé ici (nous allons utiliser une méthode assez sale… Mais qui marche). Merci à cet article pour la source!

sudo nano /etc/fail2ban/action.d/iptables-multiport.conf

Et éditez très précisément comme décrit dans ce super article les lignes en gras :

[Definition]# Option:  actionstart# Notes.:  command executed once at the start of Fail2Ban.# Values:  CMD#
actionstart = iptables -N fail2ban-<name>              iptables -A fail2ban-<name> -j RETURN              iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>          cat /etc/fail2ban/persistent.bans | awk '/^fail2ban-<name>/ {print $2}' \          | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j <blocktype>; done# Option:  actionstop# Notes.:  command executed once at the end of Fail2Ban# Values:  CMD#
actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>             iptables -F fail2ban-<name>             iptables -X fail2ban-<name># Option:  actioncheck# Notes.:  command executed once before each actionban command# Values:  CMD#
actioncheck = iptables -n -L <chain> | grep -q 'fail2ban-<name>[ \t]'# Option:  actionban# Notes.:  command executed when banning an IP. Take care that the#          command is executed with Fail2Ban user rights.# Tags:    See jail.conf(5) man page
# Values:  CMD#
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>
        echo "fail2ban-<name> <ip>" >> /etc/fail2ban/persistent.bans

Puis, ne pas oublier de redémarrer fail2ban :

sudo service fail2ban restart

Leave a Reply

Your email address will not be published. Required fields are marked *