Fail2ban

De DiouxX's Wiki
Aller à : navigation, rechercher

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):

Konsole.png
[root@ordi ~]# apt-get install fail2ban


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):

Konsole.png
[root@ordi ~]# service fail2ban restart


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é:

Konsole.png
[root@ordi ~]# service fail2ban restart


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é:

Konsole.png
[root@ordi ~]# service fail2ban restart


Lister les IP bannies

Listez les ip bannies avec la commande:

Konsole.png
[root@ordi ~]# iptables -L


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.

Konsole.png
[root@ordi ~]# iptables -D fail2ban-ssh 3


Relancer la première commande pour vérifier que l'Ip n'est plus dans la liste des adresses bannies.

Warning.png
Attention !
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.

Konsole.png
[root@ordi ~]# sudo touch /etc/fail2ban/ip.blacklist


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