Fail2Ban : créer vos propres filtres pour bannir des IP

Hello !

Newsoo devient de plus en plus la cible de bruteforce pour tenter de poster du spam à travers le serveur de news. Chaque identification demande une requête SQL et le serveur devenait de plus en plus sollicité, bref je sors le bazooka et je vous le montre !

Le système est le suivant :

1. L'application génère un log spécifique aux identifications ratées (vous pouvez créer un log pour n'importe quoi, il faut que ça repose sur le critère que vous souhaitez sanctionner).
2. Fail2Ban garde un oeil sur le fichier de log avec le filtre qui va bien.
3. S'il y a trop de tentatives avec la même IP durant un laps de temps défini, c'est Fail2Ban qui gère l'entrée en firewall, et aussi la sortie une fois la sanction expirée.

1. Générer le log

import logging
logging.basicConfig(filename='/var/log/newsoo-badpwd.log',level=logging.WARNING,format='%(asctime)s %(message)s')
logging.warning('news1 server: ([email protected]'+self.ip+') [WARNING] Authentication failed for user ['+self.user+':'+password+']')

Après quelques fausses tentatives, le fichier "/var/log/newsoo-badpwd.log" se remplit :

2016-02-23 22:22:53,711 news1 server: ([email protected]) [WARNING] Authentication failed for user [cedric:test]

2. Le filtre Fail2Ban

## /etc/fail2ban/filters.d/newsoo-badpwd.conf
[INCLUDES]
before = common.conf
[Definition]
# Error message specified in multiple languages
__errmsg = (?:Authentication failed for user)
failregex = ^%(__prefix_line)s([email protected]<HOST>) [WARNING] %(__errmsg)s [.+]s*$
## /etc/fail2ban/jail.conf
...
[newsoo-badpwd]
enabled  = true
filter   = newsoo-badpwd
logpath  = /var/log/newsoo-badpwd.log
port     = 119,443,563,1337
protocol = tcp
bantime  = 300
maxretry = 3

Après un redémarrage de fail2ban, constatez que le firewall est prêt à recevoir les règles smile

# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
fail2ban-newsoo-badpwd  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 119,443,563,1337
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
Chain fail2ban-newsoo-badpwd (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
Chain fail2ban-ssh (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0         

Et voilà, vous avez un système de ban totalement automatisé et efficace smile

Adaptez-le, copiez-le, diffusez-le, partagez-le (en me mentionnant). Bisous !