Objectif
Déployer Fail2ban, un système de prévention contre les intrusions (IPS) qui analyse les fichiers de logs et bannit automatiquement les adresses IP présentant un comportement malveillant (tentatives de connexion SSH répétées, scans de ports, attaques web, etc.).
Prérequis
- Serveur Debian 11 / Ubuntu
- Service SSH actif
- Accès root ou sudo
- iptables installé (généralement présent par défaut)
Procédure Complète
Étape 1 : Installation de Fail2ban
apt update apt install fail2ban -y
Vérifier l'installation :
fail2ban-client --version
Étape 2 : Configuration initiale
Copier le fichier de configuration par défaut (bonne pratique : ne jamais modifier jail.conf directement) :
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Le fichier jail.conf est écrasé lors des mises à jour de Fail2ban. Le fichier jail.local est prioritaire et préserve vos configurations personnalisées.
Étape 3 : Configuration de base
Éditer le fichier de configuration :
nano /etc/fail2ban/jail.local
Chercher et modifier la section [DEFAULT] (Ctrl+W pour rechercher) :
[DEFAULT] # Durée de bannissement en secondes (3600 = 1 heure) bantime = 3600 # Période d'observation en secondes (600 = 10 minutes) findtime = 600 # Nombre maximum de tentatives avant bannissement maxretry = 5 # Backend de détection (auto, systemd, polling) backend = systemd # Action par défaut (ban + email optionnel) banaction = iptables-multiport destemail = [email protected] sendername = Fail2Ban action = %(action_)s
- bantime : durée du bannissement de l'IP (en secondes)
- findtime : fenêtre de temps pour comptabiliser les tentatives
- maxretry : nombre d'échecs autorisés avant ban
- backend : méthode de lecture des logs (systemd pour Debian 11)
- action : action à exécuter lors d'un ban (blocage iptables)
Étape 4 : Configuration de la jail SSH
Chercher la section [sshd] dans le fichier jail.local :
[sshd] enabled = true port = 22 filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 3600 findtime = 600
port = 2222
Sauvegarder et quitter (Ctrl+O, Entrée, Ctrl+X)
Étape 5 : Démarrage de Fail2ban
Activer Fail2ban au démarrage du système :
systemctl enable fail2ban
Démarrer le service :
systemctl start fail2ban
Vérifier le statut :
systemctl status fail2ban
Vérifications et Commandes Utiles
Vérifier le statut de la jail SSH
fail2ban-client status sshd
Affiche :
- Nombre total d'IPs bannies
- Nombre d'IPs actuellement bannies
- Liste des IPs bannies
Lister toutes les jails actives
fail2ban-client status
Débannir une IP manuellement
fail2ban-client set sshd unbanip 192.168.1.50
Bannir une IP manuellement
fail2ban-client set sshd banip 192.168.1.50
Recharger la configuration
systemctl reload fail2ban
Consulter les logs Fail2ban
tail -f /var/log/fail2ban.log
Ou avec filtrage sur SSH :
grep 'sshd' /var/log/fail2ban.log
Vérifier les règles iptables ajoutées
iptables -L f2b-sshd -v -n
Tester la configuration avant redémarrage
fail2ban-client -t
Affiche "OK" si la configuration est valide
Configuration avancée : Protection d'autres services
Protection Apache (HTTP/HTTPS)
Ajouter dans /etc/fail2ban/jail.local :
[apache-auth] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache2/error.log maxretry = 5 bantime = 3600 [apache-badbots] enabled = true port = http,https filter = apache-badbots logpath = /var/log/apache2/access.log maxretry = 3 bantime = 86400 [apache-noscript] enabled = true port = http,https filter = apache-noscript logpath = /var/log/apache2/error.log maxretry = 6 bantime = 3600
Protection Nextcloud
[nextcloud] enabled = true port = http,https filter = nextcloud logpath = /var/www/nextcloud/data/nextcloud.log maxretry = 5 bantime = 3600
Créer le filtre Nextcloud :
nano /etc/fail2ban/filter.d/nextcloud.conf
Contenu du filtre :
[Definition] failregex = ^.*Login failed: '.*' \(Remote IP: ''.*$ ^.*\"remoteAddr\":\" \".*\"message\":\"Login failed:.*$ ignoreregex =
Protection MySQL/MariaDB
[mysqld-auth] enabled = true filter = mysqld-auth port = 3306 logpath = /var/log/mysql/error.log maxretry = 5 bantime = 3600
Protection contre les scans de ports (portscan)
[portscan] enabled = true filter = portscan logpath = /var/log/syslog maxretry = 5 bantime = 86400
Redémarrer Fail2ban après modifications :
systemctl restart fail2ban
Surveillance et statistiques
Statistiques de bannissement
# IPs bannies actuellement fail2ban-client status sshd | grep "Banned IP list" # Nombre total de bans fail2ban-client status sshd | grep "Total banned" # Historique des bans dans les logs grep "Ban" /var/log/fail2ban.log # IPs les plus bannies grep "Ban" /var/log/fail2ban.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10
Surveillance temps réel
tail -f /var/log/fail2ban.log | grep --color 'Ban\|Unban'
Vérifier les tentatives de connexion SSH échouées
grep "Failed password" /var/log/auth.log | tail -20
Sécurité et Limites
Avantages de Fail2ban
- Protection automatique contre brute force
- Réduit la charge serveur (moins de tentatives)
- Personnalisable pour de nombreux services
- Logs détaillés des attaques
- Faible consommation de ressources
- Compatible avec iptables/nftables
Limites et précautions
- Peut bannir des IPs légitimes en cas de mauvaise configuration
- Ne protège pas contre les attaques distribuées (DDoS massif)
- Inefficace si l'attaquant change d'IP à chaque tentative
- Nécessite une surveillance régulière (débannir les faux positifs)
- Les règles iptables sont perdues au redémarrage (utiliser iptables-persistent)
Whitelist d'IPs (ne jamais bannir)
Éditer /etc/fail2ban/jail.local, section [DEFAULT] :
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8
- 127.0.0.1/8 : localhost
- ::1 : localhost IPv6
- 192.168.1.0/24 : réseau local (adapter à votre réseau)
- 10.0.0.0/8 : plages privées RFC 1918
Persistance des règles iptables
apt install iptables-persistent -y netfilter-persistent save
Notifications par email (optionnel)
Installer un MTA (Mail Transfer Agent) :
apt install postfix mailutils -y
Configuration dans jail.local :
destemail = [email protected] sendername = Fail2Ban mta = mail action = %(action_mwl)s
Bannissement permanent
Pour un bannissement permanent (déconseillé, privilégier des durées longues) :
bantime = -1
Bannissement progressif (récidive)
Installer le module recidive :
[recidive] enabled = true filter = recidive logpath = /var/log/fail2ban.log bantime = 604800 # 7 jours findtime = 86400 # 1 jour maxretry = 5
Banne les IPs déjà bannies plusieurs fois (récidivistes)
Dépannage
Problème : Fail2ban ne démarre pas
journalctl -xe -u fail2ban fail2ban-client -t
Vérifier la syntaxe des fichiers de configuration
Problème : Une jail ne fonctionne pas
# Vérifier que le fichier de log existe et est accessible ls -l /var/log/auth.log # Tester le filtre manuellement fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Problème : Se débannir soi-même
Si vous êtes banni par erreur :
- Accéder via console physique ou hyperviseur
- Débannir l'IP :
fail2ban-client set sshd unbanip VOTRE_IP - Ajouter l'IP à la whitelist (ignoreip)
Problème : Les règles iptables disparaissent
Installer et configurer iptables-persistent :
apt install iptables-persistent -y netfilter-persistent save systemctl enable netfilter-persistent
Points Clés pour l'Oral BTS
- Fail2ban : IPS (Intrusion Prevention System) basé sur l'analyse de logs
- Principe : détection de patterns malveillants dans les logs → ban automatique via iptables
- Jail : configuration de protection pour un service spécifique (SSH, Apache, etc.)
- Bannissement : ajout d'une règle iptables DROP pour l'IP malveillante
- Paramètres clés : maxretry, bantime, findtime
- Backend : systemd pour Debian 11 (lecture des logs journald)
- Complémentarité : à combiner avec firewall, clés SSH, port knocking
- Limites : inefficace contre DDoS distribués, nécessite surveillance