Authentification à deux facteurs requise

Pour renforcer la sécurité de votre compte, veuillez activer l'authentification à deux facteurs (2FA). Cette fonctionnalité est obligatoire pour protéger vos données.

DevOups
Entreprise
Retour à la documentation

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.

bash
# 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/*.conf
⚙️

Installation 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.

bash
sudo apt-get update -y
sudo apt-get install -y fail2ban

Activez 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.

bash
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Vé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.).

bash
sudo systemctl status fail2ban
sudo fail2ban-client status

Il 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.

bash
sudo mkdir -p /etc/fail2ban/jail.d

Aprè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.

bash
sudo systemctl restart fail2ban
sudo fail2ban-client status
🔒

Gestion 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.

bash
sudo fail2ban-client status

Si 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.

bash
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 par le nom du jail souhaité (exemple : sshd, apache-auth, etc.). Affiche toutes les informations de configuration et l'état actuel du jail.

bash
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.

bash
sudo fail2ban-client status sshd
🚫

Gestion 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.

bash
sudo fail2ban-client banned

Si 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.

bash
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é.

bash
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.

bash
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.

bash
sudo fail2ban-client unban --all
📋

Configuration 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.

bash
# 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 = 600

Configurez 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)

bash
# 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 = 86400

Configuration 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)

bash
# 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 = 600

Aprè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

bash
sudo systemctl restart fail2ban
sudo fail2ban-client status
📊

Surveillance 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.

bash
sudo journalctl -u fail2ban -f

Consultez 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.

bash
sudo journalctl -u fail2ban -n 100

Filtrez 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.

bash
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.

bash
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.

bash
sudo journalctl -u fail2ban | grep "Ban" | wc -l
🔧

Dé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.

bash
sudo fail2ban-client -t

Fail2ban 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.

bash
sudo iptables -L -n | grep fail2ban

Pour 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.

bash
sudo iptables -L f2b-<nom_du_jail> -v -n

Si 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.

bash
sudo fail2ban-client stop
sudo iptables -F
sudo fail2ban-client start

Si 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.

bash
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.

bash
sudo systemctl is-enabled fail2ban

Commandes 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 !

bash
# É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.publique

Recevez 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).

bash
# É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 mailutils

Si 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.

bash
# Éditer la configuration
sudo nano /etc/fail2ban/fail2ban.local

# Ajouter ou modifier :
[Definition]
loglevel = DEBUG

# Redémarrer
sudo systemctl restart fail2ban

Augmentez 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.

bash
# 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 = 1h

Si 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. est remplacé automatiquement par l'expression régulière d'une IP. Testez votre regex avec : sudo fail2ban-regex /chemin/vers/log /etc/fail2ban/filter.d/monapp.conf

bash
# 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 =