eponyme's blog : linux, dev & cie

Mot-clé - fail2ban

Fil des billets - Fil des commentaires

fail2ban : punir les récidivistes

Fail2ban permet de bannir des adresses IP tentant de s'attaquer à votre système. Elles sont repérées grâce aux fichiers de log des différents services. Fail2ban les consulte et agit en fonction des expressions régulières qui lui sont données, et d'une tolérance d'erreurs donnée.

Les "bans" ont une durée, mais parfois on se rend compte qu'aussitôt son ban terminé, une adresse tente de nouveau de s'attaquer au système. Une solution simple peut être de mettre une rêgle permanante avec iptables, ce qui règlera définitivement le problème. Cependant cette solution ne me convient pas totalement car je n'aime pas le fait d'ajouter des règles à iptables qui ne seront peut être pas toujours utiles (l'attaquant peut s'arrêter, ou son adresse peut changer). De plus, j'aime assez l'idée qu'un serveur puisse être un minimum autonome. Si je ne consulte pas les logs de mon serveur pendant 1 mois et que je ne me rend pas compte qu'une adresse m'attaque à longueur de journée, mon serveur risque d'être en danger.

Pour régler ce problème, il suffit de créer un jail dans fail2ban qui scrutera son propre log. Ainsi il sera possible de bannir pour une très longue durée une IP qui déjà été bannie plusieurs fois. Cette technique est expliquée dans un article en anglais, je propose ici une explication en  français.

fail2ban : classement des IP les plus bannies

J'utilise depuis très longtemps fail2ban, qui permet de bannir des IP générant trop d'erreurs (le plus souvent des échecs d'authentification). Il se base sur les logs des différents services et des expressions régulières pour retrouver les tentatives et les bannir.

Je m'y suis un peu plus intéressé ces derniers temps car j'ai été attaqué par des scripts vraiment insistants (ce sera l'objet d'un prochain billet). Dans un premier temps, j'ai voulu obtenir une liste des adresses bannies, avec le nombre de fois, afin de déceler des "récidivistes". Voici la commande utilisée (fail2ban log avec SYSLOG sur mon serveur) :

cat /var/log/messages|grep Ban|awk '{print $7" "$9}'|sort|uniq -c|sort -r

Voici l'explication de la commande :

  • cat : affichage du fichier de log
  • grep Ban : on ne conserve que les lignes concernant un bannissement
  • awk : on extrait simplement les 7ème et 9ème parties, c'est à dire le "jail" utilisé pour le ban, et l'IP bannie
  • un premier sort pour faire en sorte que les IP identiques soient listées les unes en dessous des autres
  • uniq -q : réunies les lignes communes et affiche devant le nombre de fois qu'elles apparaissent
  • un dernier sort (avec l'option reverse) pour faire un tri inverse

On se retrouve ainsi avec une liste indiquant le nombre de fois qu'a été bannie une IP, le jail utilisé et l'IP bannie, le tout dans l'ordre décroisant. Voici un exemple :

      8 [ssh-iptables] 188.138.98.75
      2 [apache-dfind] 93.174.2.202
      2 [apache-dfind] 81.196.179.210
      2 [apache-dfind] 217.70.51.154
      1 [ssh-iptables] 96.8.121.185
      1 [ssh-iptables] 87.106.132.104
      1 [ssh-iptables] 58.211.5.130
      1 [ssh-iptables] 221.207.229.6
      1 [ssh-iptables] 201.140.103.17

Le défaut de cette commande est que l'odre est faire sur du texte, et donc si une IP est bannie plus de 9 fois, elle apparaitra en bas, au lieu d'être en haut.

Cela permet cependant de repérer rapidement une IP trop "agressive" pour la bannir définitivement par exemple.


Fabien (eponyme)