Fail2ban : lutter contre le bruteforcing
Chaque serveur SSH public reçoit des centaines de tentatives de connexion par jour. Les logs d’auth.log se remplissent de lignes Failed password for root from x.x.x.x. Fail2ban lit ces logs, compte les échecs et bannit l’IP par iptables. C’est un chien de garde qui lit les logs au lieu de flairer.
Le principe
Fail2ban fonctionne en trois étapes: il suit un fichier de log (auth.log, mail.log, apache.log), il matche les lignes contre des expressions régulières configurables et il exécute une action quand le seuil est atteint (typiquement, une règle iptables DROP pour l’IP fautive pendant N minutes).
L’installation et la config
apt-get install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Le fichier jail.local est la config active (fail2ban ne lit jamais jail.conf directement). Le jail pour SSH:
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 600
Trois échecs en moins de 600 secondes = l’IP est bannie pour 600 secondes. Les filtres sont dans /etc/fail2ban/filter.d/ et le filtre sshd matche déjà toutes les variantes de logs OpenSSH (Failed password, Invalid user, etc.).
Les jails qui servent vraiment
Au-delà de SSH, trois jails qui valent l’installation:
[apache-noscript]
enabled = true
filter = apache-noscript
logpath = /var/log/apache2/error.log
maxretry = 5
[postfix]
enabled = true
filter = postfix
logpath = /var/log/mail.log
maxretry = 3
[proftpd]
enabled = true
filter = proftpd
logpath = /var/log/proftpd/proftpd.log
maxretry = 3
Le jail apache-noscript bannit les IPs qui cherchent /phpmyadmin, /wp-admin, /shell.php (les scanners automatiques). Le jail postfix bannit les IPs qui tentent le relay. Le jail proftpd bannit les brute-force FTP.
Vérifier que ça marche
fail2ban-client status ssh
# Status for the jail: ssh
# |- filter
# | |- Currently failed: 3
# | |- Total failed: 184
# |- action
# |- Currently banned: 2
# |- Total banned: 12
# |- IP list: 203.0.113.1 203.0.113.42
Et pour débannir manuellement (le cas où vous vous êtes banni vous-même en oubliant le mot de passe):
fail2ban-client set ssh unbanip 203.0.113.1
Ce que ça ne fait pas
Fail2ban ne remplace pas un firewall, ne remplace pas l’authentification par clés et ne remplace pas le monitoring. Il réduit le bruit dans les logs et empêche le brute-force automatisé. Un attaquant avec des IP différentes (botnet) contourne Fail2ban sans effort. La vraie contre-mesure reste l’authentification par clés.
Mais sur un serveur qui reçoit 500 tentatives SSH par jour, Fail2ban réduit les logs à 3 lignes par IP au lieu de 500. Et ça, ça change la vie du sysadmin qui lit auth.log.