Fail2ban
Sommaire
Comment marche Fail2Ban ?
Développé en langage Python, Fail2Ban est un logiciel libre permettant d'analyser des fichiers de logs et de déclencher des actions si certaines choses suspectes sont détectées. La grande force de Fail2Ban est sa grande modularité que cela soit au niveau des mécanismes de détections basées sur les expressions régulières ou sur les actions à mener qui peuvent aller de l'expédition d'un mail à la mise en place de règles de Firewall.
Fail2Ban se base sur un système de prisons (jails) que l'on peut définir, activer ou désactiver dans un simple fichier de configuration (/etc/fail2ban/jail.conf).
Une prison (jail) est composée, entre autres, des éléments suivants:
- Nom du fichier de log à analyser.
- Filtre à appliquer sur ce fichier de log (la liste des filtres disponibles se trouve dans le répertoire /etc/fail2ban/filter.d). Il est bien sûr possible de créer ses propres filtres.
- Paramètres permettant de définir si une action doit être déclenchée quand le filtre correspond ("match"): Nombre de "matchs" (maxretry), intervalle de temps correspondant (findtime)...
- Action à mener si nécessaire. La liste des actions se trouve dans le répertoire /etc/fail2ban/action.d. Il est également possible de créer ses propres actions.
Installation
On commence par installer Fail2Ban sur son système. Il se trouve dans la grande majorité des distributions GNU/Linux et BSD. par exemple pour l'installer sur une machine Debian 6, il suffit de saisir la commande suivante (en root ou bien précédée d'un sudo):
Protection contre les attaques "brute force" SSH
Un exemple étant toujours plus parlant, nous allons configurer notre Fail2Ban pour bloquer automatiquement les adresses IP des machines essayant des attaques de type "brute force" sur notre port SSH (cette attaque est à la portée de n'importe quel "neuneu". On trouve de très bon tutoriaux sur le sujet sur le net).
Si une machine cliente échoue 2 fois de suite lors de la saisie du couple login/password sur le serveur SSH alors on bloque l'accès au port TCP/SSH pendant 15 minutes. On analyse pour cela le fichier de log /var/log/auth.log en lui appliquant le filtre /etc/fail2ban/filter.d/sshd.conf puis, si nécessaire, l'action /etc/fail2ban/action.d/iptables.conf La définition de cette prison (jail) est à faire dans le fichier /etc/fail2ban/jail.conf
# SSH # 2 retry ? > Ban for 15 minutes [ssh] enabled = true port = ssh filter = sshd action = iptables[name=SSH, port=ssh, protocol=tcp] logpath = /var/log/auth.log maxretry = 2 bantime = 900
Un fois le filtre activé en relançant Fail2Ban avec la commande (en root):
On peut rapidement voir son efficacité en regardant le fichier de log /var/log/fail2ban.log
Protection contre les attaques DOS (HTTP/GET)
Dans ce deuxième exemple nous allons voir comment lutter efficacement contre les attaques de type DOS ciblant vos serveurs Web. Ces attaques se caractérisent par un nombre inhabituel de requêtes HTTP venant d'un même client (du moins d'une même adresse IP source).
Le plus difficile est de trouver les bons paramètres correspondants à un comportement "inhabituel". Dans l'exemple suivant, je considère comme "inhabituel" le fait qu'un client effectue plus de 360 requêtes en 2 minutes (soit une moyenne de supérieurement à 3 req/sec) sur mon serveur Web. Dans ce cas, je bloque l'accès au port HTTP pendant une durée de 10 minutes.
La prison (jail) correspondante est la suivante à ajouter dans votre fichier /etc/fail2ban/jail.conf
# Protect against DOS attack # 360 requests in 2 min > Ban for 10 minutes [http-get-dos] enabled = true port = http,https filter = http-get-dos logpath = /var/log/apache2/acces.log maxretry = 360 findtime = 120 action = iptables[name=HTTP, port=http, protocol=tcp] bantime = 600
Il est tout a fait possible d'utiliser plusieurs fichiers de logs. Par exemple, si on utilise des virtuals Host et que ceux-ci ont des fichiers logs bien distincts. Pour réaliser cela, il suffit de renseigner les différents fichiers pour l avariable logpath :
logpath = /var/log/apache2/acces.log
/var/log/apache2/access-crm.log
Le filtre http-get-dos n'est pas fourni par défaut. Il faut donc éditer le fichier /etc/fail2ban/filter.d/http-get-dos.conf avec le contenu suivant:
# Fail2Ban configuration file # # Author: http://www.go2linux.org # [Definition] # Option: failregex # Note: This regex will match any GET entry in your logs, so basically all valid and not valid entries are a match. # You should set up in the jail.conf file, the maxretry and findtime carefully in order to avoid false positives. failregex = ^<HOST>.*"GET # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
Un fois le filtre activé:
Requêtes w00tw00t
Voici un exemple, pour bannir les désormais célèbres requêtes DFind w00tw00t. Dans le fichier /etc/fail2ban/jail.conf on ajoute :
[apache-w00tw00t] enabled = true filter = apache-w00tw00t action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp] logpath = /var/log/apache2/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 =
Un fois le filtre activé:
Lister les IP bannies
Listez les ip bannies avec la commande:
Vous obtiendrez quelque chose du genre:
... Chain fail2ban-ssh (1 references) target prot opt source destination DROP all -- APoitiers-551-1-48-250.w92-146.abo.wanadoo.fr anywhere DROP all -- ip-83-134-25-126.dsl.scarlet.be anywhere DROP all -- 192.168.1.245 anywhere RETURN all -- anywhere anywhere fail2ban-HTTP (1 references) target prot opt source destination RETURN all -- anywhere anywhere ...
On peut voir que l'IP 192.168.1.245 s'est fais bannir via le filtre fail2ban-ssh
Il faut compter le nombre de ligne d'Ip bannis jusqu’à celle que l'on veut débannir. Ici la 3eme ligne.
Ensuite une petite ligne de commande, il faudra bien entendu remplacer "fail2ban-ssh" par le nom du filtre qui a bannis l'ip et "3" par le numéro de la ligne correspondante.
Relancer la première commande pour vérifier que l'Ip n'est plus dans la liste des adresses bannies.
Il est fortement recommandé de redémarrer le service fail2ban si on débanni une IP manuellement
Tester son filtre
Many things can be tested after configuration but the following commands can help to verify your settings:
fail2ban-client -d
will dump the current configuration.
fail2ban-regex "line" "failregex"
will test a single regular expression failregex (such as given in sshd.conf) with a single line of your logfile. Don't forget the double quotes around your line and failregex definitions.
fail2ban-regex accepts files too. Thus, it is easier to test and debug your own regular expressions.
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
You can use a combination of both:
fail2ban-regex /var/log/auth.log "Failed [-/\w]+ for .* from <HOST>"
Différentes prison/jail
Les prisons (jail) sont toujours à configurer dans /etc/fail2ban/jail.conf
SSH
# SSH # 2 retry ? > Ban for 15 minutes [ssh] enabled = true port = ssh filter = sshd action = iptables[name=SSH, port=ssh, protocol=tcp] logpath = /var/log/auth.log maxretry = 2 bantime = 900
Ban persistant
Vous pouvez faire des bans persistants par la création d'une liste noire et le chargement de cette liste noir lorsque fail2ban est redémarré automatiquement. D'abord, vous devez créer un fichier pour stocker les adresses IP sur liste noire.
Ensuite, vous pouvez soit faire une copie ou modifier le fichier /etc/fail2ban/action.d/iptables-multiport.conf.
Dans le fichier de configuration d'action il y a plusieurs directives différentes, nous voulons nous concentrer sur deux, la directive actionstart et actionban. Premièrement, lorsque fail2ban interdit une adresse IP, nous voulons non seulement l'interdire, mais nous voulons aussi ajouter l'adresse IP dans le fichier ip.blacklist.
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>
echo <ip> >> /etc/fail2ban/ip.blacklist
Ensuite, nous voulons être sûrs que la règle iptables est ajouté lorsque fail2ban démarre, donc nous ajoutons les lignes de code à la directive actionstart suivantes:
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>
cat /etc/fail2ban/ip.blacklist | while read IP; do iptables -I fail2ban-<name> 1 -s $IP -j DROP; done
Maintenant, dés que fail2ban va démarrer/redémarrer, il va automatiquement bannir toutes les IP se trouvant dans le fichier /etc/fail2ban/ip.blacklist.
Liens externes
protéger son serveur avec fail2ban
Bannir les bannis avec fail2ban
http://doc.ubuntu-fr.org/fail2ban
http://www.commentcamarche.net/faq/18225-utiliser-fail2ban-pour-proteger-votre-application-web
http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Testing
http://zach.seifts.us/posts/2013/07/14/how-make-fail2ban-bans-persistent
