Prérequis
- Un serveur Ubuntu/Debian ou AlmaLinux 9/Rocky Linux 9
- Accès root ou sudo
Fail2Ban protège votre serveur contre les attaques par force brute en bannissant automatiquement les IP qui échouent trop souvent à s'authentifier.
1. Installer Fail2Ban
apt update
apt install -y fail2ban
# Vérifier
systemctl status fail2ban# Fail2Ban est dans le dépôt EPEL
dnf install -y epel-release
dnf install -y fail2ban
# Activer et démarrer
systemctl enable fail2ban
systemctl start fail2ban
# Vérifier
systemctl status fail2ban2. Configuration de base
# Ne jamais modifier jail.conf directement !
# Créer jail.local qui surcharge jail.conf
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# Ou créer un fichier de configuration personnalisé
nano /etc/fail2ban/jail.local[DEFAULT]
# Durée du bannissement (10 minutes)
bantime = 10m
# Fenêtre de détection (10 minutes)
findtime = 10m
# Nombre de tentatives avant bannissement
maxretry = 5
# Email pour les notifications (optionnel)
# destemail = admin@votredomaine.com
# sender = fail2ban@votredomaine.com
# action = %(action_mwl)s
# Ignorer certaines IP (votre IP, réseau local...)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
# Backend de détection
backend = systemd
# Protection SSH
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 1h[DEFAULT]
# Durée du bannissement (10 minutes)
bantime = 10m
# Fenêtre de détection (10 minutes)
findtime = 10m
# Nombre de tentatives avant bannissement
maxretry = 5
# Ignorer certaines IP (votre IP, réseau local...)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
# Backend de détection
backend = systemd
# Protection SSH
# Note : sur AlmaLinux/Rocky Linux, le log SSH est dans /var/log/secure
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 1h3. Protéger différents services
# Protection Nginx (erreurs HTTP)
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
# Protection Nginx (bots et scanners)
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
# Protection Apache
[apache-auth]
enabled = true
port = http,https
logpath = /var/log/apache2/error.log
maxretry = 5
# Protection MySQL/MariaDB
[mysqld-auth]
enabled = true
port = 3306
logpath = /var/log/mysql/error.log
maxretry = 5
# Protection Postfix (email)
[postfix]
enabled = true
port = smtp,465,587
logpath = /var/log/mail.log
maxretry = 5
# Protection Dovecot (email IMAP/POP3)
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
logpath = /var/log/mail.log
maxretry = 5
# Protection WordPress (avec plugin log)
[wordpress]
enabled = false
port = http,https
filter = wordpress
logpath = /var/log/auth.log
maxretry = 3
bantime = 1dChemins des logs sur AlmaLinux/Rocky Linux
Sur AlmaLinux/Rocky Linux, certains chemins de logs diffèrent : Apache utilise /var/log/httpd/ au lieu de /var/log/apache2/. Ajustez les valeurs logpath en conséquence.
4. Redémarrer Fail2Ban
# Vérifier la configuration
fail2ban-client -t
# Redémarrer
systemctl restart fail2ban
# Vérifier le statut
fail2ban-client status5. Commandes utiles
# Statut global
fail2ban-client status
# Statut d'une jail spécifique
fail2ban-client status sshd
# Voir les IP bannies
fail2ban-client status sshd | grep "Banned IP"
# Bannir manuellement une IP
fail2ban-client set sshd banip 123.45.67.89
# Débannir une IP
fail2ban-client set sshd unbanip 123.45.67.89
# Recharger la configuration
fail2ban-client reload
# Voir les logs
tail -f /var/log/fail2ban.log6. Bannissement progressif
Augmentez la durée du bannissement pour les récidivistes :
# Ajouter dans [DEFAULT]
[DEFAULT]
bantime.increment = true
bantime.factor = 24
bantime.formula = ban.Time * (1<<(ban.Count if ban.Count<20 else 20)) * banFactor
bantime.maxtime = 5w
# Explications :
# - 1ère infraction : 10 minutes
# - 2ème infraction : ~4 heures
# - 3ème infraction : ~4 jours
# - Maximum : 5 semaines7. Créer un filtre personnalisé
# Créer le filtre
cat > /etc/fail2ban/filter.d/wordpress.conf << 'EOF'
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
^<HOST> .* "POST /xmlrpc.php
ignoreregex =
EOF
# Activer dans jail.local
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 1h8. Notifications par email
[DEFAULT]
# Email de destination
destemail = admin@votredomaine.com
# Email d'envoi
sender = fail2ban@votredomaine.com
# Action avec email et logs
action = %(action_mwl)s
# Alternatives :
# action = %(action_)s # Bannir seulement
# action = %(action_mw)s # Bannir + email avec whois
# action = %(action_mwl)s # Bannir + email avec whois et logs9. Intégration avec le pare-feu
# Dans jail.local, section [DEFAULT]
[DEFAULT]
banaction = ufw
banaction_allports = ufw# Dans jail.local, section [DEFAULT]
[DEFAULT]
banaction = firewallcmd-rich-rules
banaction_allports = firewallcmd-rich-rules10. Surveiller les attaques
# Voir les IP les plus bannies
zgrep 'Ban' /var/log/fail2ban.log* | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
# Tentatives SSH échouées
grep 'Failed password' /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -20
# Résumé des bannissements par jour
grep 'Ban' /var/log/fail2ban.log | awk '{print $1}' | sort | uniq -cLogs SSH sur AlmaLinux/Rocky Linux
Sur AlmaLinux/Rocky Linux, remplacez /var/log/auth.log par /var/log/secure pour les analyses de tentatives SSH échouées.
Attention à votre IP
Ajoutez toujours votre propre IP dans ignoreip pour éviter de vous bloquer vous-même en cas d'erreur de mot de passe !
Fail2Ban actif !
Votre serveur est maintenant protégé contre les attaques par force brute. Les IP malveillantes seront automatiquement bannies.