Fail2ban
Framework de prévention d'intrusion qui protège votre serveur contre les attaques par force brute et les tentatives d'accès non autorisées.
Introduction à Fail2ban
Comprendre le rôle et le fonctionnement de Fail2ban dans la sécurité des serveurs
Fail2ban est un framework de prévention d'intrusion qui protège les serveurs contre les attaques par force brute. Il analyse les logs système en temps réel et bannit automatiquement les adresses IP qui présentent des comportements malveillants (tentatives de connexion répétées, scans de ports, etc.).
Fonctionnement : Fail2ban surveille les fichiers de logs spécifiés, utilise des expressions régulières (filtres) pour détecter les échecs d'authentification, puis applique des actions (généralement via iptables) pour bloquer les IP suspectes pendant une durée définie.
Cette architecture modulaire permet de protéger différents services (SSH, Apache, Nginx, etc.) avec des configurations personnalisées appelées "jails".
Fail2ban fonctionne selon un modèle en trois composants principaux qui travaillent ensemble pour protéger votre serveur :
Architecture Fail2ban
Jails : Chaque jail protège un service spécifique et définit les paramètres de détection et de bannissement.
Filtres : Expressions régulières qui scannent les logs pour identifier les patterns d'attaque (échecs de connexion, scans, etc.).
Actions : Scripts exécutés lors d'un événement (ban/unban), typiquement pour ajouter/retirer des règles firewall.
Cette architecture modulaire permet de protéger facilement plusieurs services avec des stratégies différentes.
# Architecture Fail2ban
#
# 1. Jails (Prison)
# - Configuration spécifique à un service (SSH, Apache, etc.)
# - Définit : ports à protéger, logs à surveiller, seuils de ban
# - Fichiers : /etc/fail2ban/jail.conf et /etc/fail2ban/jail.d/*.conf
#
# 2. Filtres
# - Expressions régulières pour détecter les échecs
# - Analysent les logs et identifient les tentatives malveillantes
# - Fichiers : /etc/fail2ban/filter.d/*.conf
#
# 3. Actions
# - Commandes exécutées lors d'un ban/unban
# - Généralement : ajout/suppression de règles iptables
# - Fichiers : /etc/fail2ban/action.d/*.confInstallation et configuration
Guide complet pour installer et configurer Fail2ban sur votre serveur
L'installation de Fail2ban est simple et rapide. Une fois installé, le service démarre automatiquement avec une configuration par défaut qui protège SSH. Cette section vous guide à travers l'installation, la configuration initiale et la vérification du bon fonctionnement du service.
Installez Fail2ban depuis les dépôts officiels. Le paquet inclut le service, les filtres par défaut et les actions nécessaires.
Installation de Fail2ban
La commande apt-get install installe fail2ban avec toutes ses dépendances. Le paquet inclut également une configuration par défaut pour SSH.
sudo apt-get update -y
sudo apt-get install -y fail2banActivez Fail2ban pour qu'il démarre automatiquement au boot, puis démarrez le service immédiatement.
Activation et démarrage du service
enable configure le service pour démarrer automatiquement au boot du système. start démarre le service immédiatement sans attendre un redémarrage.
sudo systemctl enable fail2ban
sudo systemctl start fail2banVérifiez que Fail2ban fonctionne correctement et consultez la liste des jails actifs.
Vérification du statut
systemctl status affiche l'état du service (actif, en erreur, etc.). fail2ban-client status liste tous les jails configurés et leur statut (nombre d'IP bannies, etc.).
sudo systemctl status fail2ban
sudo fail2ban-client statusIl est recommandé de placer vos configurations personnalisées dans /etc/fail2ban/jail.d/ plutôt que de modifier directement jail.conf. Cela facilite les mises à jour.
Création du répertoire pour configurations personnalisées
Les fichiers dans jail.d/ surchargent les paramètres de jail.conf. Cette approche permet de conserver vos personnalisations lors des mises à jour de Fail2ban.
sudo mkdir -p /etc/fail2ban/jail.dAprès avoir modifié la configuration de Fail2ban, redémarrez le service pour appliquer les changements.
Redémarrage après modification de configuration
restart redémarre complètement le service. Vérifiez ensuite avec status que tous vos jails sont bien actifs et fonctionnent correctement.
sudo systemctl restart fail2ban
sudo fail2ban-client statusGestion des jails
Commandes pour surveiller et gérer les jails Fail2ban
Les jails sont les unités de configuration de Fail2ban. Chaque jail protège un service spécifique (SSH, Apache, Nginx, etc.) avec ses propres paramètres de détection et de bannissement. Cette section couvre les commandes essentielles pour lister, surveiller et gérer vos jails.
Affichez la liste complète de tous les jails actifs avec un résumé de leur état (nombre d'IP bannies actuellement et au total).
Lister tous les jails configurés
Cette commande affiche tous les jails actifs avec leurs statistiques de base. Utile pour avoir une vue d'ensemble de votre configuration.
sudo fail2ban-client statusSi vous voulez uniquement la liste des noms de jails sans les statistiques détaillées, utilisez grep pour filtrer la sortie.
Lister uniquement les noms des jails
Extrait uniquement la ligne contenant la liste des jails actifs, sans les statistiques.
sudo fail2ban-client status | grep "Jail list"Consultez les informations détaillées d'un jail : ports protégés, nombre de tentatives maximum, durée de ban, fichiers de logs surveillés, et liste des IP bannies.
Voir les détails d'un jail spécifique
Remplacez
sudo fail2ban-client status <nom_du_jail>Exemple : Détails du jail SSH
Affiche les détails du jail sshd qui protège le service SSH contre les attaques par force brute.
sudo fail2ban-client status sshdGestion des bannissements
Commandes pour gérer les IP bannies et les bannissements manuels
Fail2ban bannit automatiquement les IP suspectes, mais vous pouvez également gérer les bannissements manuellement : bannir une IP spécifique, débannir une IP (par exemple si vous vous êtes bloqué par erreur), ou consulter la liste des IP bannies. Cette section couvre toutes ces opérations.
Consultez la liste complète de toutes les IP actuellement bannies par Fail2ban, quel que soit le jail.
Lister toutes les IP bannies (tous jails confondus)
Affiche toutes les adresses IP actuellement bloquées par l'ensemble des jails actifs.
sudo fail2ban-client bannedSi vous voulez voir uniquement les IP bannies par un jail particulier (par exemple SSH), utilisez cette commande.
Lister les IP bannies pour un jail spécifique
La section 'Banned IP list' affiche toutes les adresses IP actuellement bannies par ce jail spécifique.
sudo fail2ban-client status <nom_du_jail>Vous pouvez bannir manuellement une adresse IP spécifique pour un jail donné, même si elle n'a pas été détectée automatiquement.
Bannir manuellement une IP
Exemple : sudo fail2ban-client set sshd banip 192.168.1.100
Bannit immédiatement l'IP spécifiée pour le jail indiqué.
sudo fail2ban-client set <nom_du_jail> banip <IP>Si vous devez débannir une adresse IP (par exemple si vous vous êtes bloqué par erreur), utilisez la commande unbanip.
Débannir une IP
Exemple : sudo fail2ban-client set sshd unbanip 192.168.1.100
Supprime immédiatement le bannissement de l'IP spécifiée.
sudo fail2ban-client set <nom_du_jail> unbanip <IP>Pour débannir toutes les IP bannies par un jail spécifique en une seule commande.
Débannir toutes les IP d'un jail
Attention : cette commande débannit TOUTES les IP de TOUS les jails. Utilisez-la avec précaution.
sudo fail2ban-client unban --allConfiguration des jails
Créer et configurer des jails personnalisés pour protéger vos services
Les jails sont configurés dans des fichiers .conf situés dans /etc/fail2ban/jail.d/. Chaque jail définit quel service protéger, quels logs surveiller, et les paramètres de bannissement (nombre de tentatives, durée de ban, etc.). Cette section vous montre comment créer des configurations personnalisées pour différents services.
Créez un fichier de configuration personnalisé pour protéger SSH avec des paramètres stricts.
Exemple : Configuration SSH sécurisée
Paramètres expliqués :
- enabled : Active le jail
- port : Port SSH à protéger (ssh = port 22)
- filter : Filtre à utiliser (sshd.conf dans filter.d/)
- logpath : Fichier de logs à surveiller
- maxretry : Nombre d'échecs avant ban (3 tentatives)
- bantime : Durée du ban en secondes (3600s = 1h)
- findtime : Fenêtre de temps pour compter les échecs (600s = 10min)
Cette configuration bannit pendant 1h toute IP qui échoue 3 fois en 10 minutes.
# Créer le fichier de configuration
sudo nano /etc/fail2ban/jail.d/sshd.conf
# Contenu du fichier :
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600Configurez Fail2ban pour protéger un serveur web Apache contre les attaques par force brute et les scans.
Exemple : Protection Apache contre les attaques
Deux jails pour protéger Apache :
apache-auth : Protège contre les tentatives d'authentification répétées (5 tentatives en 10min → ban 2h)
apache-badbots : Bloque les bots malveillants détectés dans access.log (2 détections → ban 24h)
# Créer le fichier de configuration
sudo nano /etc/fail2ban/jail.d/apache.conf
# Contenu du fichier :
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 5
bantime = 7200
findtime = 600
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/access.log
maxretry = 2
bantime = 86400Configuration similaire pour protéger un serveur Nginx.
Exemple : Protection Nginx
nginx-http-auth : Protège l'authentification HTTP basic (5 échecs → ban 1h)
nginx-limit-req : Protège contre les attaques de type flood/DDoS basées sur les limites de requêtes Nginx (10 dépassements → ban 10min)
# Créer le fichier de configuration
sudo nano /etc/fail2ban/jail.d/nginx.conf
# Contenu du fichier :
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 600Après avoir créé ou modifié des configurations, redémarrez Fail2ban et vérifiez que les nouveaux jails sont actifs.
Appliquer les changements
Vérifiez que vos nouveaux jails apparaissent dans la liste et sont correctement configurés. Si un jail ne démarre pas, consultez les logs : sudo journalctl -u fail2ban -n 50
sudo systemctl restart fail2ban
sudo fail2ban-client statusSurveillance et logs
Surveiller l'activité de Fail2ban et diagnostiquer les problèmes
La surveillance des logs de Fail2ban est essentielle pour comprendre son activité : quelles IP sont bannies, pourquoi, et détecter d'éventuels problèmes de configuration. Cette section présente les commandes pour consulter les logs et monitorer l'activité en temps réel.
Suivez l'activité de Fail2ban en temps réel pour voir les détections et bannissements au fur et à mesure qu'ils se produisent.
Voir les logs en temps réel
Le flag -f (follow) affiche les logs en continu. Appuyez sur Ctrl+C pour quitter. Idéal pour surveiller l'activité pendant une attaque.
sudo journalctl -u fail2ban -fConsultez les logs récents sans le mode suivi, utile pour un diagnostic rapide.
Voir les 100 dernières lignes des logs
Le flag -n 100 limite l'affichage aux 100 dernières lignes. Ajustez le nombre selon vos besoins.
sudo journalctl -u fail2ban -n 100Filtrez les logs pour voir uniquement les actions de bannissement effectuées par Fail2ban.
Rechercher les bannissements dans les logs
Recherche toutes les lignes contenant 'Ban' dans les logs, ce qui correspond aux bannissements d'IP.
sudo journalctl -u fail2ban | grep "Ban"Si vous voulez suivre uniquement l'activité d'un jail particulier, filtrez les logs par le nom du jail.
Voir les logs d'un jail spécifique
Remplacez 'sshd' par le nom du jail souhaité. Les \[ \] échappent les crochets pour une recherche exacte.
sudo journalctl -u fail2ban | grep "\[sshd\]"Obtenez un résumé du nombre total de bannissements effectués par Fail2ban depuis son démarrage.
Statistiques des bannissements
Compte le nombre de fois où le mot 'Ban' apparaît dans les logs, donnant ainsi une estimation du nombre total de bannissements.
sudo journalctl -u fail2ban | grep "Ban" | wc -lDépannage et maintenance
Résoudre les problèmes courants et maintenir Fail2ban en bon état
Comme tout service, Fail2ban peut parfois rencontrer des problèmes : jails qui ne démarrent pas, faux positifs, ou règles iptables qui s'accumulent. Cette section vous aide à diagnostiquer et résoudre les problèmes les plus courants.
Avant de redémarrer Fail2ban, validez toujours votre configuration pour éviter les erreurs de syntaxe qui empêcheraient le service de démarrer.
Vérifier la configuration
Le flag -t (test) valide la configuration sans démarrer le service. Affiche les erreurs de syntaxe s'il y en a.
sudo fail2ban-client -tFail2ban crée des chaînes iptables spécifiques pour chaque jail. Vous pouvez les consulter pour vérifier que les règles de bannissement sont bien appliquées.
Vérifier les règles iptables créées par Fail2ban
Liste toutes les chaînes iptables contenant 'fail2ban'. Chaque jail actif devrait avoir sa propre chaîne.
sudo iptables -L -n | grep fail2banPour voir exactement quelles IP sont bannies au niveau iptables pour un jail spécifique.
Voir les règles iptables détaillées d'un jail
Exemple : sudo iptables -L f2b-sshd -v -n
Affiche toutes les règles de la chaîne fail2ban pour le jail spécifié, avec le nombre de paquets bloqués.
sudo iptables -L f2b-<nom_du_jail> -v -nSi vous avez des problèmes avec des règles iptables qui persistent après l'arrêt de Fail2ban, vous pouvez les nettoyer manuellement.
Nettoyer toutes les règles iptables de Fail2ban
Attention : iptables -F efface TOUTES les règles iptables, pas seulement celles de Fail2ban. À utiliser uniquement si vous êtes sûr de votre configuration firewall.
sudo fail2ban-client stop
sudo iptables -F
sudo fail2ban-client startSi un jail se comporte de manière incorrecte, vous pouvez le redémarrer individuellement sans redémarrer tout Fail2ban.
Réinitialiser un jail
Redémarre uniquement le jail spécifié, sans affecter les autres jails actifs.
sudo fail2ban-client stop <nom_du_jail>
sudo fail2ban-client start <nom_du_jail>Assurez-vous que Fail2ban est configuré pour démarrer automatiquement au démarrage du système.
Vérifier que Fail2ban démarre au boot
Retourne 'enabled' si le service est configuré pour démarrer automatiquement, 'disabled' sinon. Utilisez 'sudo systemctl enable fail2ban' pour l'activer.
sudo systemctl is-enabled fail2banCommandes avancées
Techniques avancées pour optimiser et personnaliser Fail2ban
Pour les utilisateurs avancés, Fail2ban offre de nombreuses options de personnalisation : whitelisting d'IP, ajustement des filtres, création d'actions personnalisées, et intégration avec d'autres outils de sécurité. Cette section couvre les techniques avancées de configuration.
Empêchez certaines adresses IP (par exemple votre propre IP ou celle de serveurs de confiance) d'être bannies, même en cas d'échecs répétés.
Whitelister des adresses IP
Le paramètre ignoreip accepte une liste d'IP ou de sous-réseaux (notation CIDR) qui ne seront jamais bannies. Séparez les entrées par des espaces. Ne whitelistez que des IP de confiance !
# Éditer le fichier de configuration principal
sudo nano /etc/fail2ban/jail.local
# Ajouter dans la section [DEFAULT] :
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 votre.ip.publiqueRecevez un email à chaque bannissement pour être averti des tentatives d'intrusion sur votre serveur.
Configurer les notifications par email
action_mwl envoie un email avec les logs et les informations whois de l'IP bannie. Assurez-vous que le serveur peut envoyer des emails (configurez postfix ou utilisez un relay SMTP).
# Éditer la configuration
sudo nano /etc/fail2ban/jail.local
# Ajouter :
[DEFAULT]
destemail = votre@email.com
sendername = Fail2ban
action = %(action_mwl)s
# Installer mailutils pour l'envoi d'emails
sudo apt-get install -y mailutilsSi vous rencontrez des problèmes, augmentez le niveau de verbosité des logs pour obtenir plus d'informations.
Augmenter le niveau de log pour le débogage
Les niveaux disponibles : CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG. DEBUG est le plus verbeux. N'oubliez pas de revenir à INFO ou WARNING en production pour éviter de saturer les logs.
# Éditer la configuration
sudo nano /etc/fail2ban/fail2ban.local
# Ajouter ou modifier :
[Definition]
loglevel = DEBUG
# Redémarrer
sudo systemctl restart fail2banAugmentez progressivement la durée de ban pour les IP qui sont bannies à répétition (recidive).
Personnaliser la durée de ban selon la récidive
Avec ces paramètres :
- Premier ban : 1h
- Deuxième ban : 2h (1h × 2)
- Troisième ban : 4h (2h × 2)
- Maximum : 5 semaines
Cela décourage fortement les attaquants persistants.
# Dans votre jail personnalisé
sudo nano /etc/fail2ban/jail.d/sshd.conf
# Ajouter :
[sshd]
enabled = true
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 5w
bantime = 1hSi vous devez protéger une application personnalisée, créez votre propre filtre avec des expressions régulières adaptées.
Créer un filtre personnalisé
failregex définit les patterns d'échec à détecter.
# Créer un nouveau filtre
sudo nano /etc/fail2ban/filter.d/monapp.conf
# Exemple de contenu :
[Definition]
failregex = ^.*Failed login attempt from <HOST>.*$
^.*Invalid user .* from <HOST>.*$
ignoreregex =