Fail2ban : Un outil indispensable pour contrer les Bruteforces
Vous possédez un serveur Linux ? Votre Firewall est actif et filtre tous les contenus indésirables ?
Seuls les services principaux sont accessibles depuis l'extérieur ?
Et bien, vous pouvez passer à la suite, l'installation de l'outil Fail2ban !
Fail2ban est un outil très simple qui analyse vos logs de votre serveur et qui est capable de réagir et d'exécuter des commandes en fonction des éléments détectés.
Il permet de vous protéger contre les tentatives d'attaque de type Bruteforces.
Fail2ban fonctionne en mode Filtre-Action :
- Le filtre (''/etc/fail2ban/filter.d'') défini les éléments à détecter dans les logs
- L'action (''/etc/fail2ban/action.d'') consiste a exécuter une commande comme : envoyer un mail, interdire une IP dans l'Iptables ...
Fail2ban s'installe avec une liste de filtres et d'actions prédéfinis. Il suffit juste de vérifier l'emplacement de vos logs et vérifier que les patterns définis dans les filtres sont applicables à vos logs.
Voici un exemple de configuration pour ma box Gentoo :
[ssh]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 3
[pure-ftpd]
enabled = true
filter = pure-ftpd
action = iptables[name=Pure-Ftpd, port=ftp, protocol=tcp]
logpath = /var/log/pure-ftpd.log
maxretry = 3
[postfix]
enabled = true
filter = postfix
action = iptables[name=Postfix, port=smtp, protocol=tcp]
logpath = /var/log/mail.log
Après la configuration mise en place, il suffit de lancer le démon :
# /etc/init.d/fail2ban start
L'ensemble des détections seront directement logués dans le fichier
# less /var/log/fail2ban.log
Pour connaitre l'origine des attaques il est possible d'utiliser des outils de géolocalisation comme "geoiplookup" qui se trouve dans le package gentoo "dev-libs/geoip".
Avec un petit script Python, il est possible d'analyser le fichier de log failtoban.log pour en extraire le nom du pays de la machine attaquante :
# Fail2BanGeo.py
import os
import re
f = open('/var/log/fail2ban.log', 'r')
pattern = r".*?Ban\s*?((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$"
p = re.compile(pattern)
for i in f:
m = p.match(i)
if m:
ip = m.group(1)
file = os.popen('geoiplookup %s' % ip)
print file.read()
Pour en savoir plus sur le GeoIpLookup, je vous conseille d'aller lire la page Wiki dédiée à Fail2ban :
https://github.com/fail2ban/fail2ban