Chaque serveur connecté à internet est une cible. Des robots automatisés scannent des plages d’adresses IP 24 heures sur 24, tentant des milliers de combinaisons d’identifiants et de mots de passe contre SSH, les pages de connexion web et les serveurs de messagerie. Un seul service non protégé peut être compromis en quelques heures. Fail2Ban est un framework de prévention d’intrusions qui surveille les fichiers de log à la recherche de signes d’activité malveillante et bloque automatiquement les adresses IP offensantes à l’aide de règles de pare-feu. Ce guide vous accompagne dans l’installation, la configuration et l’ajustement de Fail2Ban sur Ubuntu, couvrant la protection SSH, les jails personnalisés pour Nginx, l’intégration avec UFW, les notifications par e-mail et les commandes essentielles de gestion.
Prérequis
Avant de commencer, assurez-vous d’avoir :
- Ubuntu Server 20.04, 22.04 ou 24.04
- Accès au terminal avec des privilèges sudo
- Accès SSH au serveur
- Un pare-feu configuré et actif (UFW recommandé — consultez notre guide UFW)
- Familiarité de base avec les fichiers de log et les services systemd
Qu’est-ce que Fail2Ban ?
Fail2Ban est un outil de prévention d’intrusions open source écrit en Python. Il s’exécute en tant que daemon en arrière-plan qui surveille en continu les fichiers de log (tels que /var/log/auth.log ou /var/log/nginx/error.log) à la recherche de modèles indiquant un comportement malveillant. Lorsqu’un modèle correspond un nombre configurable de fois dans une fenêtre de temps définie, Fail2Ban crée une règle de pare-feu pour bloquer l’adresse IP offensante pendant une durée spécifiée.
Caractéristiques principales :
- Basé sur les logs — réagit aux tentatives échouées réelles enregistrées dans les fichiers de log, pas seulement aux taux de connexion
- Jails configurables — chaque service (SSH, Nginx, Postfix) a son propre ensemble de règles appelé « jail »
- Actions de blocage multiples — peut utiliser iptables, UFW, firewalld, ou même envoyer des notifications
- Déblocage automatique — les IP bloquées sont automatiquement libérées à l’expiration de la période de blocage
- Léger — utilisation minimale des ressources même sur les serveurs chargés
Comment Fonctionne Fail2Ban
Fail2Ban fonctionne à travers quatre composants interconnectés :
- Fichiers de log — la source de vérité. Les services enregistrent les échecs d’authentification et les erreurs dans les fichiers de log
- Filtres — des expressions régulières qui correspondent à des modèles spécifiques dans les fichiers de log (par exemple, « Failed password for » dans auth.log)
- Jails — des unités de configuration qui combinent un filtre avec un chemin de fichier de log, des seuils (maxretry, findtime) et une action
- Actions — ce qui se passe lorsque le seuil est dépassé (créer une règle de pare-feu, envoyer un e-mail, exécuter un script)
Le flux de travail est simple :
Entrée dans le log → Le filtre correspond au modèle → Le compteur du jail s'incrémente
→ Le compteur dépasse maxretry dans findtime → L'action s'exécute (bloquer l'IP)
→ Le bantime expire → L'action est inversée (débloquer l'IP)
Cette architecture rend Fail2Ban hautement extensible. Vous pouvez écrire des filtres personnalisés pour toute application qui produit une sortie de log.
Installation de Fail2Ban
Installez Fail2Ban depuis les dépôts Ubuntu :
sudo apt update
sudo apt install fail2ban -y
Vérifiez l’installation :
fail2ban-client --version
Vérifiez l’état du service :
sudo systemctl status fail2ban
Fail2Ban démarre automatiquement après l’installation, mais il est livré avec une configuration par défaut minimale. L’étape suivante consiste à créer une configuration appropriée.
Comprendre les Fichiers de Configuration
Fail2Ban utilise un système de configuration en couches :
| Fichier | Objectif | Modifiable ? |
|---|---|---|
/etc/fail2ban/fail2ban.conf | Paramètres du daemon (niveau de log, socket) | Non — utiliser fail2ban.local |
/etc/fail2ban/jail.conf | Définitions des jails par défaut | Non — utiliser jail.local |
/etc/fail2ban/jail.local | Vos surcharges personnalisées des jails | Oui — c’est votre config principale |
/etc/fail2ban/jail.d/*.conf | Configurations supplémentaires des jails | Oui |
/etc/fail2ban/filter.d/*.conf | Définitions des filtres (modèles regex) | Oui — pour les filtres personnalisés |
/etc/fail2ban/action.d/*.conf | Définitions des actions (commandes ban/unban) | Oui — pour les actions personnalisées |
Important : Ne modifiez jamais
jail.confoufail2ban.confdirectement. Ces fichiers sont écrasés lors des mises à jour du paquet. Créez toujours des fichiers.localqui surchargent des paramètres spécifiques.
Créez votre configuration locale :
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Alternativement, créez un jail.local minimal à partir de zéro avec uniquement les paramètres que vous souhaitez surcharger :
sudo nano /etc/fail2ban/jail.local
Configuration de la Protection SSH
La protection SSH est le cas d’utilisation le plus courant et le plus critique de Fail2Ban. Ajoutez ce qui suit à votre jail.local :
[DEFAULT]
# Durée du blocage : 1 heure
bantime = 3600
# Fenêtre de temps pour compter les échecs : 10 minutes
findtime = 600
# Nombre d'échecs avant le blocage
maxretry = 3
# Utiliser UFW pour les actions de blocage (recommandé sur Ubuntu)
banaction = ufw
# Vos adresses IP (séparées par des espaces) à ne jamais bloquer
ignoreip = 127.0.0.1/8 ::1 VOTRE_IP_DOMICILE
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
findtime = 600
Cette configuration :
- Définit une valeur par défaut globale de 3 tentatives dans 10 minutes, entraînant un blocage d’1 heure
- Surcharge le jail SSH pour bloquer pendant 24 heures (86400 secondes)
- Utilise UFW comme mécanisme de blocage
- Ajoute localhost et votre IP personnelle à la liste blanche
Si vous exécutez SSH sur un port non standard (recommandé — consultez notre guide de durcissement SSH), mettez à jour le paramètre du port :
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
Redémarrez Fail2Ban pour appliquer :
sudo systemctl restart fail2ban
Vérifiez que le jail SSH est actif :
sudo fail2ban-client status sshd
Sortie attendue :
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:
Configuration de Jails Personnalisés
Au-delà de SSH, vous pouvez créer des jails pour pratiquement n’importe quel service. Voici des exemples pratiques :
Protection SSH Agressive
Pour les serveurs sous attaque intense, utilisez des blocages progressifs avec bantime.increment :
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 604800
Avec cette configuration, le premier blocage dure 1 heure, le deuxième 2 heures, le troisième 4 heures, et ainsi de suite, jusqu’à un maximum de 7 jours (604800 secondes). Les récidivistes sont pénalisés plus sévèrement à chaque fois.
Jail Recidive (Bloquer les Récidivistes sur Tous les Jails)
Le jail recidive surveille le propre log de Fail2Ban et bloque les IP qui sont bloquées de façon répétée dans n’importe quel jail :
[recidive]
enabled = true
filter = recidive
logpath = /var/log/fail2ban.log
bantime = 604800
findtime = 86400
maxretry = 3
banaction = ufw
Cela bloque une IP pendant 7 jours si elle est bloquée 3 fois dans les 24 heures depuis n’importe quel jail.
Intégration avec UFW
Pour les serveurs Ubuntu utilisant UFW comme pare-feu, configurez Fail2Ban pour utiliser UFW dans les blocages :
[DEFAULT]
banaction = ufw
Vérifiez l’intégration en consultant les règles UFW après un blocage :
sudo ufw status numbered
Les IP bloquées apparaissent comme des règles de refus :
[ 1] Anywhere DENY IN 203.0.113.100
[ 2] 22/tcp ALLOW IN Anywhere
Si vous préférez iptables (par exemple, sur des systèmes sans UFW), utilisez la valeur par défaut :
[DEFAULT]
banaction = iptables-multiport
Pour vérifier les blocages iptables :
sudo iptables -L f2b-sshd -n
Protection de Nginx
Fail2Ban peut protéger les serveurs web contre divers schémas d’attaque. Voici deux jails courants pour Nginx :
Authentification HTTP de Nginx
Protégez les pages derrière une authentification basique HTTP contre les attaques par force brute :
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
findtime = 600
Le filtre intégré nginx-http-auth correspond à des lignes comme :
no user/password was provided for basic authentication
Protection Contre les Inondations de 404 sur Nginx
Bloquez les IP qui génèrent des erreurs 404 excessives (un schéma courant des scanners de vulnérabilités) :
Créez un filtre personnalisé :
sudo nano /etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex = ^<HOST> - .* "(GET|POST|HEAD).*HTTP.*" 404
ignoreregex =
Ajoutez le jail :
[nginx-404]
enabled = true
port = http,https
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 30
findtime = 600
bantime = 3600
Cela bloque une IP après 30 erreurs 404 dans les 10 minutes. Définissez le seuil suffisamment haut pour éviter de bloquer les utilisateurs légitimes qui rencontrent des liens cassés.
Protection Contre les Bots et Scanners sur Nginx
Créez un filtre pour les agents utilisateurs malveillants connus et le balayage de chemins :
sudo nano /etc/fail2ban/filter.d/nginx-badbots.conf
[Definition]
failregex = ^<HOST> - .* "(GET|POST).*HTTP.*" .* ".*(?:sqlmap|nikto|nmap|masscan|ZmEu|w3af).*"
ignoreregex =
[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 1
findtime = 86400
bantime = 604800
Notifications par E-mail
Configurez Fail2Ban pour envoyer des alertes par e-mail lorsque des IP sont bloquées ou lorsque des jails démarrent/s’arrêtent. Tout d’abord, installez un agent de transfert de courrier :
sudo apt install sendmail -y
Ajoutez les paramètres de notification à jail.local :
[DEFAULT]
destemail = admin@votredomaine.com
sender = fail2ban@votredomaine.com
mta = sendmail
action = %(action_mwl)s
Les raccourcis d’action disponibles sont :
| Action | Comportement |
|---|---|
%(action_)s | Blocage uniquement (sans notification) |
%(action_mw)s | Blocage + e-mail avec informations WHOIS |
%(action_mwl)s | Blocage + e-mail avec informations WHOIS + lignes de log pertinentes |
Pour un jail spécifique, surchargez l’action :
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
action = %(action_mwl)s
Note : Sur les serveurs à fort trafic sous attaque constante, les notifications par e-mail peuvent générer un grand volume de messages. Envisagez d’utiliser
%(action_)s(blocage uniquement) pour les jails chargés et de réserver les notifications par e-mail pour les jails critiques ou le jail recidive.
Liste Blanche d’IP
Empêchez les blocages accidentels d’adresses IP de confiance en utilisant la directive ignoreip :
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 192.168.1.0/24 VOTRE_IP_PUBLIQUE
Vous pouvez lister des IP individuelles, des plages CIDR ou des noms d’hôte (résolus au démarrage) :
ignoreip = 127.0.0.1/8 ::1 bureau.votredomaine.com 203.0.113.50
Pour ajouter à la liste blanche une IP uniquement pour un jail spécifique :
[sshd]
enabled = true
ignoreip = 127.0.0.1/8 ::1 10.0.1.50
Vous pouvez également ajouter à la liste blanche en temps réel sans redémarrer Fail2Ban :
# Vérifier la liste blanche actuelle
sudo fail2ban-client get sshd ignoreip
# Ajouter une IP à la liste blanche temporairement (jusqu'au redémarrage)
sudo fail2ban-client set sshd addignoreip 203.0.113.50
Référence des Commandes Essentielles
| Commande | Description |
|---|---|
sudo systemctl start fail2ban | Démarrer le service Fail2Ban |
sudo systemctl stop fail2ban | Arrêter le service Fail2Ban |
sudo systemctl restart fail2ban | Redémarrer le service Fail2Ban |
sudo systemctl status fail2ban | Vérifier l’état du service |
sudo fail2ban-client status | Lister tous les jails actifs |
sudo fail2ban-client status sshd | Afficher l’état et les IP bloquées du jail sshd |
sudo fail2ban-client set sshd banip 203.0.113.100 | Bloquer manuellement une IP dans le jail sshd |
sudo fail2ban-client set sshd unbanip 203.0.113.100 | Débloquer une IP spécifique du jail sshd |
sudo fail2ban-client unban --all | Débloquer toutes les IP dans tous les jails |
sudo fail2ban-client get sshd bantime | Afficher la durée actuelle du blocage pour un jail |
sudo fail2ban-client get sshd maxretry | Afficher la limite actuelle de tentatives pour un jail |
sudo fail2ban-client get sshd ignoreip | Afficher les IP en liste blanche pour un jail |
sudo fail2ban-client reload | Recharger la configuration sans redémarrer |
sudo fail2ban-client reload sshd | Recharger un jail spécifique |
sudo tail -100 /var/log/fail2ban.log | Voir les entrées récentes du log Fail2Ban |
sudo zgrep "Ban" /var/log/fail2ban.log* | Rechercher les événements de blocage dans tous les fichiers de log |
Dépannage
Fail2Ban Ne Démarre Pas
Vérifiez les logs pour les erreurs de configuration :
sudo fail2ban-client -t
sudo journalctl -u fail2ban --since "10 minutes ago"
Causes courantes :
- Erreurs de syntaxe dans
jail.local(crochets manquants, indentation incorrecte) - Fichiers de log référencés qui n’existent pas (par exemple,
/var/log/nginx/error.logquand Nginx n’est pas installé) - Erreurs de regex dans les filtres personnalisés
Les IP Ne Sont Pas Bloquées
Vérifiez que le jail est activé et surveille le bon fichier de log :
sudo fail2ban-client status sshd
Vérifiez que le filtre correspond aux entrées dans le log :
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Cette commande teste le filtre contre le fichier de log réel et indique combien de correspondances elle trouve. Si le nombre est zéro, le filtre ne détecte pas les modèles attendus.
Des Utilisateurs Légitimes Sont Bloqués
Si des utilisateurs signalent être bloqués :
- Débloquez-les immédiatement :
sudo fail2ban-client set sshd unbanip IP_UTILISATEUR
- Ajoutez leur IP ou réseau à la liste blanche :
sudo fail2ban-client set sshd addignoreip IP_UTILISATEUR
- Pour une correction permanente, ajoutez l’IP à
ignoreipdansjail.localet rechargez.
Les Blocages de Fail2Ban Ne Persistent Pas Après Redémarrage
Par défaut, Fail2Ban ne persiste pas les blocages entre les redémarrages du service. Pour activer la persistance, configurez une base de données de blocages :
[DEFAULT]
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400
Le paramètre dbpurgeage contrôle combien de temps (en secondes) les anciennes entrées sont conservées dans la base de données.
Utilisation Élevée de Mémoire avec Beaucoup de Jails
Si Fail2Ban utilise trop de mémoire :
- Réduisez le nombre de jails actifs à ce dont vous avez besoin
- Définissez
dbpurgeageà une valeur plus basse pour réduire la taille de la base de données - Assurez-vous que les fichiers de log sont correctement rotés avec logrotate
Résumé
Fail2Ban est un outil de sécurité essentiel pour tout serveur Linux exposé à internet. En surveillant les fichiers de log et en bloquant automatiquement les IP qui présentent un comportement malveillant, il fournit une couche de défense proactive qui fonctionne aux côtés de votre pare-feu. Les configurations clés couvertes dans ce guide — protection SSH, jails Nginx, intégration UFW et notifications par e-mail — couvrent les vecteurs d’attaque les plus courants pour les serveurs de production.
Points clés :
- Créez toujours un fichier
jail.localau lieu de modifierjail.confdirectement - Ajoutez vos propres adresses IP à la liste blanche pour empêcher les blocages accidentels
- Utilisez des durées de blocage progressives pour pénaliser les récidivistes
- Combinez Fail2Ban avec UFW pour une gestion cohérente du pare-feu
- Testez les filtres personnalisés avec
fail2ban-regexavant de les déployer - Surveillez régulièrement le log de Fail2Ban pour comprendre le paysage des menaces de votre serveur
Pour une configuration de sécurité complète, combinez Fail2Ban avec les techniques décrites dans nos guides sur le Durcissement SSH, la Configuration du Pare-feu UFW et la Liste de Vérification de Sécurité pour Serveurs Linux.