Un serveur exposé sur internet est une cible permanente. Bots, scanners automatisés, tentatives de force brute. Le rapport Logwatch du premier jour après mise en production peut être édifiant : des milliers de tentatives de connexion SSH en quelques heures, des centaines de scans de fichiers sensibles sur le serveur web. Fail2ban est la première ligne de défense active contre ces attaques.
Qu’est-ce que Fail2ban ?
Fail2ban est un outil open-source qui analyse en temps réel les logs du système et bannit automatiquement les adresses IP présentant un comportement suspect — trop de tentatives de connexion échouées, scans de fichiers sensibles, tentatives d’authentification HTTP répétées.
Son fonctionnement repose sur des jails — des règles qui définissent pour chaque service surveillé :
- Le fichier de log à analyser
- Le nombre de tentatives autorisées avant bannissement (
maxretry) - La fenêtre de temps d’observation (
findtime) - La durée du bannissement (
bantime)
Lorsqu’une IP dépasse le seuil, Fail2ban ajoute une règle dans le pare-feu (UFW/iptables) pour bloquer toutes ses connexions pendant la durée définie.
Installation
sudo apt install fail2ban -y
Vérifions que le service est bien démarré :
sudo systemctl status fail2ban --no-pager
Configuration
Fail2ban dispose d’un fichier de configuration par défaut /etc/fail2ban/jail.conf qu’il ne faut jamais modifier directement — il sera écrasé lors des mises à jour. On crée à la place un fichier jail.local qui surcharge les valeurs par défaut :
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# Durée de bannissement — 24h dissuade bien plus qu'1h
bantime = 24h
# Fenêtre d'observation des tentatives
findtime = 10m
# Nombre de tentatives avant bannissement
maxretry = 3
# IPs à ne jamais bannir (localhost + réseau local)
ignoreip = 127.0.0.1/8 192.168.1.0/24
# Protection SSH
[sshd]
enabled = true
port = 22
logpath = %(sshd_log)s
backend = %(sshd_backend)s
# Protection authentification nginx
[nginx-http-auth]
enabled = true
# Protection contre les requêtes abusives nginx
[nginx-limit-req]
enabled = true
Démarrage et activation au boot
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
Vérification du fonctionnement
sudo fail2ban-client status
On doit voir les trois jails actives :
Status
|- Number of jail: 3
`- Jail list: nginx-http-auth, nginx-limit-req, sshd
Vérifions le détail de la jail SSH :
sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 188
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 2
|- Total banned: 16
`- Banned IP list: 91.224.92.17 2.57.121.112
Quelques minutes après le démarrage, les premières IP sont déjà bannies, la preuve que les attaques sont permanentes et automatisées.
Comprendre les jails nginx
nginx-http-auth surveille les échecs d’authentification HTTP Basic, utile si certaines zones de ton site sont protégées par mot de passe.
nginx-limit-req surveille les erreurs 429 (Too Many Requests) générées par le module limit_req de nginx. Pour l’activer complètement, il faut ajouter une directive de limitation de débit dans la configuration nginx :
sudo nano /etc/nginx/nginx.conf
Dans le bloc http {}, ajoute :
# Limiter à 10 requêtes/seconde par IP
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
Puis dans chaque virtual host, dans le bloc location / :
limit_req zone=one burst=20 nodelay;
Commandes utiles
Voir les IPs actuellement bannies :
sudo fail2ban-client status sshd
Débannir manuellement une IP (si tu t’es banni toi-même) :
sudo fail2ban-client set sshd unbanip <IP>
Tester si une IP est bannie :
sudo fail2ban-client get sshd banip <IP>
Consulter les logs Fail2ban :
sudo tail -f /var/log/fail2ban.log
Ce que Fail2ban ne fait pas
Fail2ban n’est pas un pare-feu et ne remplace pas UFW. Il est complémentaire, UFW définit quels ports sont accessibles, Fail2ban bannit dynamiquement les IP abusives sur ces ports ouverts.
Il ne protège pas non plus contre les attaques distribuées (botnets) où chaque IP n’essaie qu’une ou deux fois. Pour ça, des solutions comme CrowdSec (qui partage les listes de réputation entre serveurs) sont plus adaptées, mais c’est un sujet pour un autre article.
Conclusion
Fail2ban est un outil simple à installer et redoutablement efficace contre les attaques automatisées qui représentent l’immense majorité des tentatives d’intrusion sur un serveur Linux. Quelques minutes après son activation, il commence déjà à travailler, les rapports Logwatch quotidiens confirmeront son efficacité avec les listes d’IP bannies qui s’allongent au fil des jours.
Laisser un commentaire