Ceci est une ancienne révision du document !



Bannir des IP avec fail2ban

fail2ban lit les logs de divers services (SSH, Apache, FTP…) à la recherche d’erreurs d'authentification répétées et ajoute une règle iptables pour bannir l'adresse IP de la source.

Il est vivement déconseillé de modifier les fichiers de configuration /etc/fail2ban/fail2ban.conf et /etc/fail2ban/jail.conf (notamment car ils peuvent être écrasés par une mise à jour). Ces fichiers contiennent les configurations de base qu'on peut surcharger au moyen d'un ou lusieurs fichiers enregistrés dans /etc/fail2ban/jail.d
Le fichier /etc/fail2ban/jail.conf doit servir uniquement de référence et de documentation.

Généralités

Fail2ban n'est pas a proprement parler un outil de sécurité. L'objectif principal est d'éviter de surcharger les logs du système avec des milliers de tentatives de connexion. Un serveur avec un accès SSH sur le port standard, par exemple, recevra très rapidement des centaines, voire des milliers de tentatives de connexions provenant de différentes machines. Ce sont des attaques par force brute lancées par des robots. Fail2ban en analysant les logs permet de bannir les IP au bout d'un certain nombre de tentatives ce qu limitera le remplissage des logs et l'utilisation de la bande passante. Mais cela n'améliore en rien la sécurité du service concerné. Si l'accès SSH n'est pas suffisamment sécurisé (mot de passe faible par exemple) fail2ban n'empêchera pas un attaquant d'arriver à ses fins.

Paramétrage par défaut

Les paramètres par défaut sont visibles dans le fichier /etc/fail2ban/jail.conf

La durée de bannissement d'une IP est définie par la directive bantime avec une valeur en secondes. La valeur par défaut de 600 s (10 minutes est beaucoup trop faible). Il est plus réaliste d'avoir des durées de bannissement d'une ou plusieurs heures, voir plusieurs jours.

Une autre directive importante est findtime qui définit en secondes le temps depuis lequel une anomalie est recherchée dans les logs. Il ne faut pas mettre une valeur trop élevée (1 heure suffit) sans quoi la quantité de logs à analyser pourrait devenir très importante et donc avoir un impact sur les performances.

La directive ingnoreip permet de définir la liste des IP à ignorer. Il est utile d'y mettre sa propre IP afin de ne pas risquer de se faire bannir.

Il faut créer le fichier dans /etc/fail2ban/jail.d/custom.conf (ou un autre nom de votre choix) contenant :

[DEFAULT]
ignoreip = 127.0.0.1 124.32.5.48
findtime = 3600
bantime = 86400
maxretry = 3
  • ingnoreip ⇒ votre IP (ici 124.32.5.48) en plus de l'interface de bouclage ;
  • bantime = 86400 soit 24 heures
  • findtime = 3600 soit une heure
  • maxretry = 3 ⇒ une IP sera bannie après 3 tentative de connexion avortées.

Configurer fail2ban pour les services actifs

Pour spécifier à fail2ban quels services il doit surveiller, il faut activer les « jails » (prisons) correspondant.

Si vous regardez le fichier /etc/fail2ban/jail.conf, dans la partie jail vous trouverez des blocs du type :

/etc/fail2ban/jail.conf
[sshd]

port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Il indique :

  • port = les ports à bloquer avec les règles iptables ;
  • logpath = l'emplacement des fichiers de log à surveiller ;
  • backend = le moteur de surveillance des logs.

Les valeurs représentées ainsi %(sshd_logs)s sont des variables qui sont définies dans d'autres fichiers de configuration : paths_common.conf et paths_debian.conf notamment.

Pour activer la surveillance des connexion SSH, il suffit d'ajouter dans le fichier /etc/fail2ban/jail.d/custom.conf :

/etc/fail2ban/jail.d/custom.conf
[sshd]
enabled = true

Procédez de même pour les autres services.
Il est bien entendu inutile d'activer des prisons pour des services qui ne sont pas utilisés sur le serveur.

Si vous avez besoin de spécifier un port (par exemple, quand SSH n'est pas en écoute sur un port standard, un fichier de log particulier, oun un nombre de tentatives différent de la valeur par défaut, précisez-le :

/etc/fail2ban/jail.d/custom.conf
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
maaxretry = 5
D'une manière générale, il est important d'effectuer des tests pour vérifier le bon fonctionnement de fail2ban ! Voir ci-dessous comment procéder.

Relancez la configuration avec

sudo systemctl restart fail2ban

Vous pouvez alors vérifier si les prisons ont été correctement lancées avec :

sudo fail2ban-client status
Status
|- Number of jail:      3
`- Jail list:           apache, proftpd, sshd

Les prisons peuvent être contrôlées séparément avec les mots clés start,stop,status Par exemple :

sudo fail2ban-client stop sshd
Jail stopped

Pour plus d'informations, référez-vous aux pages de man.

TODO: revoir toute la suite…

Vérifier le bon fonctionnement de votre configuration Fail2Ban

Pour vérifier le bon fonctionnement de fail2ban : essayez de vous identifier plusieurs fois en saisissant un mauvais mot de passe. Si Fail2ban fonctionne, vous devriez être interdit d'accès au serveur au bout d'un certain nombre d'essais (précisés dans la configuration à la ligne maxretry).

Côté serveur vous pouvez également surveiller ce qu'il se passe avec la commande

sudo fail2ban-client status sshd

qui dans ce cas vous retournera le statut de la prison 'sshd' (avec le nombre de tentatives échouées et la liste des IP bannies)

Attention, si votre IP de test apparaît comme bannie mais que vous pouvez tout de même vous loguer, il se peut que vous ayez un problème de configuration des ports pour fail2ban (voir l'avertissement dans "configuration" ci-dessus)

  • une variante de fail2ban-client status, qui permet un checklist des ip bannies sur toutes les jails
sudo nano checklist_ban
#!/bin/bash
#lancer le script en sudo 
JAILS=$(fail2ban-client status | grep " Jail list:" | sed 's/`- Jail list:\t//g' | sed 's/,//g')
for j in $JAILS
do
echo "$j $(fail2ban-client status $j | grep " Currently banned:" | sed 's/   |- Currently banned:\t//g')"
done

Ou de façon plus succincte :

fail2ban-client status | egrep -o "[a-z-]*," | tr -d ',' | xargs -I jail fail2ban-client status jail

À chaque service est associé un fichier de configuration dans le dossier /etc/fail2ban/filter.d

Une expression rationnelle définit les lignes du log qui signalent une erreur d'authentification. Il est possible de spécifier via une regex des exceptions, ie des lignes à ignorer. Cela peut être utile par exemple pour ne pas bannir les IP provenant de votre réseau local.

Exemple avec la règle anti-w00tw00t

Voici un exemple, pour bannir les désormais célèbres requêtes DFind w00tw00t. On surcharge le fichier /etc/fail2ban/jail.conf par ajout dans :

/etc/fail2ban/jail.local
[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables[name=Apache-w01tw00t,port=80,protocol=tcp]
logpath = /var/log/apache*/*access.log
maxretry = 1

On notera que contrairement aux autres règles, celle-ci s'attaque au fichier de log des accès (/var/log/apache2/access*.log).

Voici le fichier de règles /etc/fail2ban/filter.d/apache-w00tw00t.conf

[Definition]

failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*

ignoreregex =

On teste maintenant si la règle s'applique bien en faisant :

fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-w00tw00t.conf

Si vous subissez ce genre d'attaque, on peut voir en sortie de ce programme les adresses des spammeurs. Les règles iptables sont automatiquement crées en conséquence.

Pour qu'il accepte de se lancer au démarrage, j'ai dû changer la ligne "socket = /var/run/fail2ban/fail2ban.sock" en "socket = /var/run/fail2ban.sock" dans le fichier /etc/fail2ban/fail2ban.local

Alertes e-mail après un bannissement

Il est possible de recevoir un e-mail après chaque bannissement d'une adresse IP en utilisant la syntaxe suivante dans la section [DEFAULT] du fichier /etc/fail2ban/jail.local :

destemail = votrelogin@votrelogin-desktop

Voire même toute autre adresse mail si le système est correctement configuré pour l'envoi de mail, par exemple avec ssmtp.

La valeur par défaut est root@localhost dans la section [DEFAULT] de /etc/fail2ban/jail.conf et concerne donc toutes les prisons. Il reste cependant possible de spécifier un destemail particulier dans une prison donnée.

Pour voir les messages locaux (si vous avez laissé une adresse e-mail du type @localhost), il vous faudra ouvrir un terminal et taper la commande "mail" ou, plus simplement encore, consulter le fichier /var/mail/votrelogin.

Pour activer l'envoi de mail, modifier la ligne dans le fichier /etc/fail2ban/jail.local

action = %(action_)s 

Vers : (pour envoyer un mail avec le whois)

action = %(action_mw)s 

ou : (pour envoyer un mail avec le whois ainsi que les logs)

action = %(action_mwl)s 

Si les dates d'envoi des messages ne correspondent pas à la date réelle, il faut alors ajouter à la fin du fichier /etc/default/fail2ban :

LC_ALL=C
LANG=C

pensez à redémarrer fail2ban pour que cette modification soit prise en compte

sudo service fail2ban restart

Des informations complémentaires sont disponibles sur le site officiel de Fail2ban : FAQ Fail2ban

Modification du filtre SASL

Pour activer le filtre SASL permettant le bannissement en cas d'attaque par force brute il faut modifier l'expression régulière du filtre dans le fichier /etc/fail2ban/filter.d/sasl.conf

Remplacer la ligne:

failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [A-Za-z0-9+/]*={0,2})?$

Par:

failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed: \w

On teste maintenant si la règle s'applique bien en faisant :

fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/sasl.conf

Une erreur qui semble toucher les versions inférieures à 0.8.5-2 (fail2ban-client –version). Si dans votre /var/log/fail2ban.log, vous avez ce genre d'erreurs "fail2ban.actions.action: ERROR iptables …" et qu'il manque curieusement des règles fail2ban dans iptables (sudo iptables -L -n -v), veuillez modifier le fichier /usr/bin/fail2ban-client

sudo nano /usr/bin/fail2ban-client
et ajouter time.sleep(0.1) ou time.sleep(0.2)
	def __processCmd(self, cmd, showRet = True):
		beautifier = Beautifier()
		for c in cmd:
			time.sleep(0.1)
			beautifier.setInputCmd(c)
			try:
				client = CSocket(self.__conf["socket"])
				ret = client.send(c)
  • Vérification
sudo fail2ban-client reload
sudo tail -n 300 /var/log/fail2ban.log

Une erreur qui semble toucher les versions récentes !

Debian GNU/Linux 8.7 (jessie)
Fail2Ban v0.8.13
Error in FilterPyinotify callback: 'module' object has no attribute '_strptime_time'

Changer la configuration par défaut pour corriger cette erreur.

nano /etc/fail2ban/jail.conf
#backend = auto
backend = polling
service fail2ban restart
  • Denyhosts fonctionne à peu près sur le même principe mais sans utiliser iptables.
  • fail2ban.1521056771.txt.gz
  • Dernière modification: Le 14/03/2018, 20:46
  • par bruno