1. Le problème : des milliers d'attaques par jour

Ouvrez les logs SSH de n'importe quel serveur exposé sur internet sans protection :

bash
grep 'Failed password' /var/log/auth.log | wc -l

Vous 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

bash
apt update apt install fail2ban -y

Fail2Ban se lance automatiquement après l'installation. Vérifiez :

bash
systemctl status fail2ban

Vous devez voir Active: active (running) en vert.

Activez le démarrage automatique au boot :

bash
systemctl enable fail2ban

3. 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, écrase jail.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 :

bash
nano /etc/fail2ban/jail.local

Collez cette configuration :

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

Sauvegardez (Ctrl+X, Y, Entrée) et redémarrez Fail2Ban :

bash
systemctl restart fail2ban

Vérifiez que la jail SSH est active :

bash
fail2ban-client status

Vous 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 heure
  • 86400 = 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.

bash
ignoreip = 127.0.0.1/8 ::1 VOTRE-IP-PERSONNELLE

6. Commandes utiles au quotidien

bash
# 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 reload
🚨

Vous ê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 :

bash
nano /etc/fail2ban/jail.local

Ajoutez à la suite de votre configuration existante :

bash
[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 = 600
bash
systemctl restart fail2ban fail2ban-client status

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