Fail2ban
Qu’est-ce que Fail2ban ?
Fail2ban est un logiciel de sécurité destiné à prévenir les attaques par force brute en bloquant temporairement les adresses IP suspectes. Il analyse les journaux des services pour détecter des motifs d’échecs d’authentification répétés et autres comportements suspects, puis utilise des règles iptables pour bannir temporairement ces adresses IP.
Fonctionnalités principales de Fail2ban
- Surveillance des journaux : Fail2ban surveille les fichiers de journaux de divers services (SSH, FTP, HTTP, etc.) pour détecter des tentatives de connexion échouées répétées
- Bannissement temporaire : lorsque Fail2ban détecte un nombre prédéfini de tentatives échouées depuis une même IP, il bannit cette IP pour une période déterminée
- Flexibilité et extensibilité : Fail2ban est hautement configurable et peut être étendu pour surveiller presque n’importe quel service à travers des fichiers de configuration personnalisés et des filtres regex
- Actions de bannissement : Fail2ban peut utiliser différentes actions de bannissement, telles que la mise à jour des règles iptables, la modification des règles hosts.deny, ou l’envoi de notifications par email
Installation de Fail2ban
Méthode N°1
Installation de Fail2ban via les paquets officiels :
sudo apt install fail2ban
Méthode N°2 : via les sources
Installation de Fail2ban via les sources du dépôt GitHub :
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
sudo python setup.py install
On vérifie que Fail2ban s’est correctement installé :
fail2ban-client -h
Configuration de Fail2ban pour les services actifs
On démarre le service :
systemctl start fail2ban
On active le démarrage automatique :
systemctl enable fail2ban
On vérifie que le service fonctionne :
systemctl status fail2ban
Par défaut, Fail2ban utilise le fichier /etc/fail2ban/jail.conf qui contient les réglages globaux et les définitions des prisons (jails). Ce fichier ne doit jamais être modifié car il serait écrasé lors d’une mise à jour de Fail2ban.
La méthode standard consiste à créer un fichier de configuration local qui surchargera uniquement les paramètres qu’on souhaite modifier :
sudo nano /etc/fail2ban/jail.local
On va configurer le fichier jail.local et utiliser paramètres par défaut les plus importants pour définir la politique de bannissement pour toutes les prisons qui seront activées :
[DEFAULT]
bantime = 24h
findtime = 10m
maxretry = 3
# Remplacez 192.168.1.0/24 par la plage d'IP de votre réseau local, si applicable.
ignoreip = 127.0.0.1/8 192.168.1.0/24 ::1
action = %(action_)s
| Paramètres | Description |
|---|---|
| bantime | durée du bannissement qui s’applique à une IP une fois qu’elle a atteint le seuil maxretry |
| findtime | fenêtre de temps pendant laquelle Fail2Ban compte les tentatives de connexion échouée |
| maxretry | nombre maximal d’échecs (tentatives) qu’une IP peut faire avant d’être bannie. |
| ignoreip | liste des adresses IP (IPv4 et IPv6) ignorées plages IP ; exemples : ignoreip = 192.168.1.0/24 ou ignoreip = 192.168.1.0/24 10.0.0.1 172.16.0.0/16 |
| action | action par défaut : utilise iptables (ou nftables) pour bannir l’IP |
Autres paramètres
| Paramètres | Description |
|---|---|
| logrotate | utilitaire système conçu pour gérer automatiquement les fichiers journaux (logs). |
| enabled | simple booléen (true/false ou 1/0) qui active ou désactive une jail (une règle de protection pour un service donné) |
| destemail | adresse e-mail à laquelle Fail2Ban enverra les notifications ou les rapports |
Activer la prison SSH (sshd)
Maintenant que les valeurs par défaut sont définies, nous allons créer (ou surcharger) la section spécifique au service SSH (nommé sshd dans Fail2ban).
On modifie le fichier jail.local :
sudo nano /etc/fail2ban/jail.local
On cherche la partie [sshd] :
[sshd]
enabled = true
port = ssh
filter = sshd
maxretry = 3
bantime = 48h
Le paramètre filter = sshd indique à Fail2ban d’utiliser le fichier de filtre pré-écrit /etc/fail2ban/filter.d/sshd.conf. Ce fichier contient les expressions régulières (failregex) nécessaires pour identifier les lignes de tentatives de connexion échouées dans le fichier de journal (auth.log).
On applique les modifications :
sudo systemctl restart fail2ban
On vérifie que Fail2ban fonctionne :
sudo systemctl status fail2ban
Doit renvoyer :
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
Active: active (running) since Thu 2025-11-20 13:47:43 CET; 1s ago
Invocation: 1ff45edcd8eb4238bbaec105c3c9cf2c
Docs: man:fail2ban(1)
Main PID: 72339 (fail2ban-server)
Tasks: 7 (limit: 4596)
Memory: 14.4M (peak: 16.8M)
CPU: 1.627s
CGroup: /system.slice/fail2ban.service
├─72339 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
└─72448 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
nov. 20 13:47:43 sd-117585 systemd[1]: Started fail2ban.service - Fail2Ban Service.
nov. 20 13:47:43 sd-117585 fail2ban-server[72339]: Server ready
Pour vérifier l’état de la prison [sshd] :
sudo fail2ban-client status sshd
Vous devriez voir une sortie similaire à ceci, confirmant que le filtre surveille le bon journal :
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
La Prison spéciale
On va créer une prison pour bannir des adresses IP manuellement et éviter de rentrer en conflit avec d¹autres filtres.
Voici comment la mettre en place :
On va ajouter cette nouvelle section dans votre fichier de configuration local, soit /etc/fail2ban/jail.local, soit dans un nouveau fichier de la structure /etc/fail2ban/jail.d/.
On ouvre jail.local :
sudo nano /etc/fail2ban/jail.local
On ajoute à la fin du fichier :
[manual-jail]
enabled = true
logpath = /dev/null
filter =
bantime = 1y
maxretry = 1
| Paramètres | Description |
|---|---|
| enabled | on active la prison |
| logpath | pas de chemin de journal (on ne surveille rien) |
| filter | pas de filtre associé (on ne cherche pas de tentatives d’échec) |
| bantime | on va lui donner un temps de bannissement très long, 1 année |
| maxretry |
Note : En utilisant logpath = /dev/null, on indique à Fail2ban de ne lire aucun fichier pour cette prison, ce qui réduit la charge inutile.
On active la prison :
sudo systemctl restart fail2ban
On vérifie qu’elle est active :
sudo fail2ban-client status manual-jail
Vous devriez voir une sortie similaire à ceci, confirmant que la prison est active :
Status for the jail: manual-jail
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /dev/null
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
Une fois le service Fail2ban redémarré et la prison activée, on va pouvoir l’utiliser à tout moment pour bannir / dé-bannir une IP spécifique.
Bannissement manuel
sudo fail2ban-client set manual-jail banip IP_À_BANNIR
Dé-bannissement manuel
sudo fail2ban-client set manual-jail unbanip IP_À_DÉBANNIR
Avantages de cette méthode
- Séparation des tâches : cela vous permet de séparer clairement les bannissements automatiques (basés sur les logs) des bannissements que vous décidez d’appliquer vous-même.
- Politique de temps dédiée : vous pouvez donner à cette prison manuelle une durée de bannissement (
bantime) très différente des autres (par exemple, 1 an ou même permanent si vous configurez les actions appropriées), sans affecter les autres prisons.
