fail2ban surveille un fichier journal à la recherche d'un motif, compte les correspondances par adresse et ajoute une règle de pare-feu quand le compte est dépassé. C'est tout ce qu'il fait, et le savoir vous dit exactement en quoi il aide et en quoi il n'aide pas.
Ce qu'il arrête
- Les tentatives répétées de mot de passe SSH — que les clés arrêtent déjà.
- Les échecs de connexion répétés sur un formulaire, si ces échecs sont consignés.
- Les scanners simples qui parcourent une liste de chemins connus.
Ce qu'il n'arrête pas
Il est réactif : il agit après plusieurs échecs, donc une seule tentative réussie n'est jamais vue. Il ne peut rien non plus contre une attaque répartie sur mille adresses, chacune essayant deux fois — et c'est ainsi qu'une tentative sérieuse se présente.
Une prison pour une connexion web
# /etc/fail2ban/filter.d/mysite-login.conf
[Definition]
failregex = ^<HOST> .* "POST /login" 401
ignoreregex =
# /etc/fail2ban/jail.local
[mysite-login]
enabled = true
filter = mysite-login
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 600
bantime = 3600
Testez le motif avant d'activer
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/mysite-login.conf
Il affiche combien de lignes correspondent. Zéro correspondance signifie que la prison ne se déclenchera jamais, et vous vous croirez protégé.
Ne vous bannissez pas vous-même
ignoreip = 127.0.0.1/8 ::1 YOUR.OFFICE.IP.HERE
Derrière un CDN, chaque requête porte l'adresse du proxy : le premier bannissement bloque donc le proxy, et avec lui tous vos visiteurs. Configurez d'abord la vraie adresse du client — voir l'article sur le fait d'être derrière un CDN.
fail2ban-client status mysite-login
fail2ban-client set mysite-login unbanip 1.2.3.4
Commencez par un bannissement d'une heure, pas définitif. Une liste de bannissements définitifs grossit, n'est jamais relue, et finit par contenir un client.