guest@6admin.io:~$

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.