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 :

  1. Fichiers de log — la source de vérité. Les services enregistrent les échecs d’authentification et les erreurs dans les fichiers de log
  2. 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)
  3. Jails — des unités de configuration qui combinent un filtre avec un chemin de fichier de log, des seuils (maxretry, findtime) et une action
  4. 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 :

FichierObjectifModifiable ?
/etc/fail2ban/fail2ban.confParamètres du daemon (niveau de log, socket)Non — utiliser fail2ban.local
/etc/fail2ban/jail.confDéfinitions des jails par défautNon — utiliser jail.local
/etc/fail2ban/jail.localVos surcharges personnalisées des jailsOui — c’est votre config principale
/etc/fail2ban/jail.d/*.confConfigurations supplémentaires des jailsOui
/etc/fail2ban/filter.d/*.confDéfinitions des filtres (modèles regex)Oui — pour les filtres personnalisés
/etc/fail2ban/action.d/*.confDéfinitions des actions (commandes ban/unban)Oui — pour les actions personnalisées

Important : Ne modifiez jamais jail.conf ou fail2ban.conf directement. Ces fichiers sont écrasés lors des mises à jour du paquet. Créez toujours des fichiers .local qui 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 :

ActionComportement
%(action_)sBlocage uniquement (sans notification)
%(action_mw)sBlocage + e-mail avec informations WHOIS
%(action_mwl)sBlocage + 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

CommandeDescription
sudo systemctl start fail2banDémarrer le service Fail2Ban
sudo systemctl stop fail2banArrêter le service Fail2Ban
sudo systemctl restart fail2banRedémarrer le service Fail2Ban
sudo systemctl status fail2banVérifier l’état du service
sudo fail2ban-client statusLister tous les jails actifs
sudo fail2ban-client status sshdAfficher l’état et les IP bloquées du jail sshd
sudo fail2ban-client set sshd banip 203.0.113.100Bloquer manuellement une IP dans le jail sshd
sudo fail2ban-client set sshd unbanip 203.0.113.100Débloquer une IP spécifique du jail sshd
sudo fail2ban-client unban --allDébloquer toutes les IP dans tous les jails
sudo fail2ban-client get sshd bantimeAfficher la durée actuelle du blocage pour un jail
sudo fail2ban-client get sshd maxretryAfficher la limite actuelle de tentatives pour un jail
sudo fail2ban-client get sshd ignoreipAfficher les IP en liste blanche pour un jail
sudo fail2ban-client reloadRecharger la configuration sans redémarrer
sudo fail2ban-client reload sshdRecharger un jail spécifique
sudo tail -100 /var/log/fail2ban.logVoir 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.log quand 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 :

  1. Débloquez-les immédiatement :
sudo fail2ban-client set sshd unbanip IP_UTILISATEUR
  1. Ajoutez leur IP ou réseau à la liste blanche :
sudo fail2ban-client set sshd addignoreip IP_UTILISATEUR
  1. Pour une correction permanente, ajoutez l’IP à ignoreip dans jail.local et 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.local au lieu de modifier jail.conf directement
  • 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-regex avant 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.