Un serveur exposé sur Internet reçoit des tentatives de connexion automatisées quelques minutes à peine après sa mise en ligne. Des robots essaient des milliers de combinaisons d'identifiants sur SSH, sur la page de connexion de WordPress ou sur n'importe quel formulaire d'authentification. Fail2ban est l'outil de référence pour couper court à ces attaques : il surveille les journaux et bannit automatiquement les adresses IP trop insistantes. Voici comment l'installer et le configurer proprement.
Comment fonctionne Fail2ban
Le principe tient en trois éléments :
- Un filtre : une expression régulière qui reconnaît une tentative échouée dans un journal (mot de passe refusé, page de connexion en erreur…) ;
- Une prison (jail) : elle associe un filtre à un journal et fixe les règles, par exemple « 5 échecs en 10 minutes » ;
- Une action : ce qui se passe quand la limite est atteinte, le plus souvent l'ajout d'une règle de pare-feu qui bloque l'adresse IP pendant une durée donnée.
Fail2ban ne remplace pas une bonne configuration : il réduit le bruit et le risque, mais un mot de passe faible reste un mot de passe faible. Il complète les mesures décrites dans mon article sur la sécurisation de SSH.
Installer Fail2ban sur Debian ou Ubuntu
sudo apt update
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
Ne modifiez jamais le fichier /etc/fail2ban/jail.conf : il est remplacé à chaque mise à jour. Toute votre configuration va dans /etc/fail2ban/jail.local ou dans des fichiers séparés sous /etc/fail2ban/jail.d/.
Une configuration de base solide
# /etc/fail2ban/jail.local
[DEFAULT]
# Durée du bannissement, fenêtre d'observation et nombre d'échecs tolérés
bantime = 1h
findtime = 10m
maxretry = 5
# Bannissements progressifs pour les récidivistes
bantime.increment = true
bantime.maxtime = 1w
# Vos propres adresses ne doivent jamais être bannies
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
backend = systemd
Sur les versions récentes de Debian, les journaux d'authentification ne sont plus écrits dans /var/log/auth.log mais dans le journal systemd. La ligne backend = systemd indique à Fail2ban d'y lire les événements ; sans elle, la prison SSH peut refuser de démarrer faute de fichier à surveiller.
Après chaque modification, vérifiez la configuration puis rechargez :
sudo fail2ban-client -t
sudo systemctl reload fail2ban
sudo fail2ban-client status sshd
La dernière commande affiche le nombre d'échecs détectés et la liste des adresses actuellement bannies.
Protéger les sites web hébergés
Les pages de connexion WordPress
Les robots ciblent massivement wp-login.php et xmlrpc.php. Un filtre simple sur le journal d'accès de nginx suffit à les repérer :
# /etc/fail2ban/filter.d/nginx-wplogin.conf
[Definition]
failregex = ^<HOST> .* "POST /(wp-login\.php|xmlrpc\.php)
ignoreregex =
# /etc/fail2ban/jail.d/nginx-wplogin.local
[nginx-wplogin]
enabled = true
port = http,https
filter = nginx-wplogin
logpath = /var/log/nginx/*access.log
maxretry = 10
findtime = 5m
Ce filtre compte toutes les requêtes POST, réussies ou non : gardez un seuil assez haut pour ne pas bannir un administrateur qui se trompe deux fois de mot de passe. Ce n'est qu'une couche parmi d'autres : la sécurisation de WordPress et l'authentification à deux facteurs restent indispensables.
Les robots qui cherchent des failles
D'autres robots enchaînent les requêtes vers /.env, /phpmyadmin ou /.git/config à la recherche de fichiers oubliés. Fail2ban fournit des filtres prêts à l'emploi, comme nginx-botsearch, qu'il suffit d'activer dans une prison. Testez toujours un filtre sur un vrai journal avant de l'activer :
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-botsearch.conf
L'outil indique combien de lignes correspondent : un résultat nul signale une expression mal écrite, un résultat énorme un filtre trop large.
Les erreurs à éviter
- Se bannir soi-même : ajoutez votre adresse IP fixe dans
ignoreipet gardez un accès de secours (console de l'hébergeur). Pour débloquer une adresse :sudo fail2ban-client set sshd unbanip 203.0.113.10; - Oublier IPv6 : les versions actuelles de Fail2ban le gèrent, à condition que l'action de pare-feu choisie le prenne aussi en charge ;
- Bannir trop longtemps du premier coup : une adresse IP peut être partagée (opérateur mobile, entreprise). Les bannissements progressifs (
bantime.increment) sont un meilleur compromis qu'un bannissement définitif ; - Négliger la surveillance : un pic soudain de bannissements peut annoncer une attaque ciblée. Je recommande d'intégrer ces chiffres à votre monitoring.
Fail2ban dans une stratégie de sécurité complète
Fail2ban est efficace contre les attaques automatisées les plus courantes, mais il ne protège pas contre une faille applicative ou un mot de passe volé. Sur les serveurs que j'administre pour mes clients, il s'ajoute à un pare-feu restrictif, à des connexions SSH par clé uniquement, aux mises à jour de sécurité automatiques et à des sauvegardes régulières. La documentation complète des options est disponible sur le dépôt officiel du projet.
Si vous gérez vous-même un VPS et que vous voulez faire vérifier sa configuration, je propose des prestations d'hébergement et d'infogérance adaptées aux petites structures.