1. Le problème : des milliers d'attaques par jour
Ouvrez les logs SSH de n'importe quel serveur exposé sur internet sans protection :
grep 'Failed password' /var/log/auth.log | wc -lVous verrez probablement plusieurs milliers de tentatives échouées. Des robots parcourent constamment internet et testent les identifiants courants (admin, root, ubuntu...) sur tous les serveurs qu'ils trouvent.
Fail2Ban surveille ces fichiers de logs et, dès qu'une IP dépasse un seuil de tentatives échouées (configurable), il ajoute automatiquement une règle dans le pare-feu pour la bloquer.
Fail2Ban ne remplace pas les autres mesures de sécurité. Il complète une configuration solide : port SSH non standard, authentification par clé, UFW activé. C'est une couche de défense supplémentaire.
2. Installation
apt update
apt install fail2ban -yFail2Ban se lance automatiquement après l'installation. Vérifiez :
systemctl status fail2banVous devez voir Active: active (running) en vert.
Activez le démarrage automatique au boot :
systemctl enable fail2ban3. Comprendre la structure de configuration
Fail2Ban fonctionne avec des jails (prisons). Chaque jail surveille un service spécifique (SSH, Nginx, etc.) et applique des règles de bannissement indépendantes.
Deux fichiers importants :
/etc/fail2ban/jail.conf- configuration par défaut, ne jamais modifier/etc/fail2ban/jail.local- votre configuration personnalisée, écrasejail.conf
Toujours utiliser jail.local. Le fichier jail.conf est écrasé lors des mises à jour de Fail2Ban. Tout ce que vous y écrivez sera perdu.
4. Configurer Fail2Ban pour SSH
Créez votre fichier de configuration :
nano /etc/fail2ban/jail.localCollez cette configuration :
[DEFAULT]
# Durée du ban : 1 heure (3600 secondes)
bantime = 3600
# Fenêtre d'analyse : si X tentatives dans 10 minutes...
findtime = 600
# ...alors ban (5 tentatives max)
maxretry = 5
# Ces IPs ne seront jamais bannies
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
# Votre port SSH (changez si vous avez modifié le port)
port = 2222
filter = sshd
logpath = %(sshd_log)s
# Plus strict pour SSH : 3 tentatives max
maxretry = 3
# Ban SSH pendant 24h
bantime = 86400Sauvegardez (Ctrl+X, Y, Entrée) et redémarrez Fail2Ban :
systemctl restart fail2banVérifiez que la jail SSH est active :
fail2ban-client statusVous devez voir sshd dans la liste des jails actives.
5. Comprendre les paramètres clés
bantime : durée pendant laquelle l'IP est bloquée.
3600= 1 heure86400= 24 heures-1= permanent
findtime : la fenêtre de temps dans laquelle les tentatives sont comptées. 600 = les tentatives des 10 dernières minutes sont comptabilisées.
maxretry : nombre de tentatives échouées avant le ban. 3 pour SSH est une valeur stricte mais appropriée.
ignoreip : IPs qui ne seront jamais bannies. Ajoutez votre IP personnelle ici si vous ne voulez pas risquer de vous auto-bannir.
ignoreip = 127.0.0.1/8 ::1 VOTRE-IP-PERSONNELLE6. Commandes utiles au quotidien
# Voir l'état de toutes les jails
fail2ban-client status
# Voir le détail d'une jail (IPs bannies, statistiques)
fail2ban-client status sshd
# Débannir une IP (si vous vous êtes banni vous-même !)
fail2ban-client set sshd unbanip 1.2.3.4
# Bannir manuellement une IP suspecte
fail2ban-client set sshd banip 1.2.3.4
# Voir les logs Fail2Ban en temps réel
tail -f /var/log/fail2ban.log
# Tester la configuration sans redémarrer
fail2ban-client reloadVous êtes bloqué hors de votre serveur ? Accédez via la console KVM/VNC disponible dans votre espace client CroustyCloud (elle ne passe pas par SSH), puis débannissez votre IP avec la commande ci-dessus.
7. Protéger Nginx en plus de SSH
Fail2Ban peut surveiller n'importe quel service qui écrit des logs. Voici comment protéger Nginx contre les tentatives d'authentification et les scans agressifs :
nano /etc/fail2ban/jail.localAjoutez à la suite de votre configuration existante :
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 3600
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
bantime = 600systemctl restart fail2ban
fail2ban-client statusVous devez maintenant voir trois jails actives : sshd, nginx-http-auth, nginx-limit-req.
Votre serveur est maintenant protégé contre les attaques brute-force. Fail2Ban tourne en arrière-plan et bannit automatiquement les attaquants. Consultez /var/log/fail2ban.log régulièrement - vous serez surpris du nombre d'attaques bloquées chaque jour.