Installation de Fail2ban

Protection contre les attaques par brute force - BTS SIO SISR

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
Pourquoi 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
Explication des paramètres :
  • 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
Note : Si vous avez changé le port SSH (ex: 2222), modifier 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
Résultat attendu : Le service doit être "active (running)"

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

Points d'attention :
  • 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
Explications :
  • 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 :

  1. Accéder via console physique ou hyperviseur
  2. Débannir l'IP :
    fail2ban-client set sshd unbanip VOTRE_IP
  3. 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