Fail2Ban est un utilitaire qui lit les fichiers de journalisation afin de détecter des attaques et d'y remédier en ajoutant une règles iptables (par exemple).
Exemple d'attaque
Dans mon cas, mon serveur est souvent « attaqué » sur le services DNS :
May 11 15:48:01 serveur ntpd[3189]: kernel time sync status change 4001
May 11 15:52:17 serveur named[2322]: client 168.75.65.199#32780: query (cache) './NS/IN' denied
May 11 15:52:17 serveur named[2322]: client 168.75.65.199#32780: query (cache) './NS/IN' denied
May 11 15:52:17 serveur named[2322]: client 168.75.65.199#32780: query (cache) './NS/IN' denied
May 11 15:58:24 serveur named[2322]: client 209.249.141.45#32809: query (cache) './NS/IN' denied
May 11 15:58:24 serveur named[2322]: client 209.249.141.45#32809: query (cache) './NS/IN' denied
May 11 15:58:24 serveur named[2322]: client 64.74.15.250#32796: query (cache) './NS/IN' denied
May 11 15:58:24 serveur named[2322]: client 209.249.141.45#32809: query (cache) './NS/IN' denied
May 11 15:58:24 serveur named[2322]: client 64.74.15.250#32796: query (cache) './NS/IN' denied
May 11 15:58:24 serveur named[2322]: client 64.74.15.250#32796: query (cache) './NS/IN' denied
May 11 15:59:02 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
May 11 15:59:02 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
May 11 15:59:02 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
May 11 16:01:23 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
May 11 16:01:23 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
May 11 16:01:23 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
May 11 16:01:24 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
May 11 16:01:24 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
May 11 16:01:24 serveur named[2322]: client 209.249.141.181#33159: query (cache) './NS/IN' denied
Le principe de fail2ban est d'autoriser une certain nombre de requêtes invalides (maxretry), puis de bloquer l'accès au service en utilisant iptable, host.deny ou autre, pendant une petite durée (bantime).
Installation, configuration
Sous Debian, fail2ban est disponible directement :
sudo aptitude install fail2ban
La configuration se situe sous /etc/fail2ban. Le fichier jail.conf contient la définition des services à surveiller, le répertoire filter.d contient les regexp qui détectent les attaques pour chaque service, le répertoire action.d contient la définition des actions possibles (filtre iptable, host.deny, shorewall, mail, ...)
Il est conseillé de ne pas modifier la configuration par défaut, mais d'utiliser un fichier .local pour surcharger le fichier voulu.
Je n'ai que le services DNS à protégé, donc je créé le fichier jail.local. Par défaut seul le service ssh est protégé :
[ssh]
enabled = false
[named-refused-udp]
enabled = true
logpath = /var/log/daemon.log
Bind journalise dans syslog et dans daemon.log, je préfère prendre le fichier qui a le moins de trafic.
Résultat
Les actions de fail2ban sont journalisées dans /var/log/fail2ban.log :
2009-05-11 16:32:21,261 fail2ban.actions: WARNING [named-refused-udp] Ban 168.75.65.198
Le site officiel explique qu'il est même possible d'avoir une carte mondial des attaques en utilisant geoip : [http://www.fail2ban.org/wiki/index.php/HOWTOs].