Identification

Fail2Ban

Catégorie : Systèmes Unix-like

Fail2Ban

Fail2Ban est un outil de protection qui surveille les journaux d'activité d'une machine à la recherche d'échecs d'authentification. Cette recherche s'effectue grâce à un ensemble d'expressions régulières.

Le principe est simple : Lorsque, dans un laps de temps donnée, un certain nombre d'échec d'authentification ont été détectés, le programme exécute une action prédéfinie. Il peut, par exemple :

  • Configurer le pare-feu du noyau Linux (Netfilter) afin que celui-ci rejette toute demande provenant de l'adresse IP du contrevenant,
  • Avertir l'administrateur du serveur par e-mail de la tentative d'intrusion,
  • Envoyer un message instantané ou un SMS à l'administrateur pour l'informer que quelque chose de louche à eu lieu (via un service externe) ,
  • Faire tout cela en même temps.
Ce document décrit l'installation et la configuration de Fail2Ban sur un serveur Debian.

Installation

Fail2Ban est disponible dans les dépôts Debian standards :

# apt-get install fail2ban

L'application s'installe en tant que service. Elle est automatiquement lancée à la fin de l'installation et dispose de son propre script de gestion :

# /etc/init.d/fail2ban {start|stop|restart|reload|status}

Ou encore :

# service fail2ban {start|stop|restart|reload|status}

Le comportement par défaut de Fail2Ban est de surveiller les logs de sshd sur le port 22 (port par défaut) ; par conséquent, si vous n'utilisez pas ssh ou que vous l'avez paramétré pour qu'il écoute sur un autre port, il faut adapter la configuration (cf. fichiers jail.conf et /etc/services).

Configuration

Les fichiers de configuration sont disponibles dans le dossier /etc/fail2ban/, lequel est organisé comme suit :

$ ls -l /etc/fail2ban/
total 20
drwxr-xr-x 2 root root 4096 juin  27 13:13 action.d
-rw-r--r-- 1 root root  853 nov.  29  2011 fail2ban.conf
drwxr-xr-x 2 root root 4096 juin  27 13:13 filter.d
-rw-r--r-- 1 root root 7346 juin  12 20:37 jail.conf
action.d
Sous-dossier contenant les scripts qui définissent les actions à réaliser. Ce sont les actions qui sont exécutées lorsque des événements particuliers sont détectés.
fail2ban.conf
Fichier contenant les paramètres généraux du démon fail2ban-server : niveau de journalisation, cible, etc. On peut aussi y spécifier le socket utilisé pour la communication client/serveur.
filter.d
Sous-dossier contenant les filtres de détection. Ces filtres contiennent les expressions régulières qui sont utilisées pour détecter les tentatives d'effraction, les échecs d'authentification, etc.
jail.conf
Fichier contenant la définition des règles de sécurité, aussi appelées "prisons". Les prisons sont en fait une combinaison de filtres et d'actions. On ne peut utiliser qu'un seul filtre par règle, mais il est possible de spécifier plusieurs actions.

Éditer les fichiers de configuration

Comme spécifié dans la documentation, chaque fichier suffixé .conf que vous souhaitez personnaliser (règle, filtre ou action) doit être surchargé par un fichier suffixé .local. Ceci permet en effet d'éviter les problèmes d'écrasement de configuration lors des mises à jour de Fail2Ban. La première chose à faire avant de procéder à la moindre modification de la configuration d'origine est donc de créer une copie locale du fichier. Par exemple :

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Paramétrer les options de démarrage

Le fichier /etc/default/fail2ban permet de paramétrer les options de ligne de commande qui seront appliquées lors du lancement de Fail2Ban. Le plus souvent il n'est pas utile d'éditer ce fichier.

Anatomie d'une règle Fail2Ban

Une règle se sécurité est l'association d'au moins deux types d'éléments : un filtre de détection, et une ou plusieurs actions à réaliser lorsque le filtre de détection retourne un positif.

Filtre de détection

Les filtres de détection sont rangés dans le dossier /etc/fail2ban/filter.d/ , ce sont des fichiers texte suffixés en .conf qui contiennent des expressions régulières.

Voici un template de filtre commenté pouvant servir de base pour la création de vos propres filtres :

# Fichier de configuration Fail2Ban
#
# Author: {votre nom}
#
# $Revision$
#

[Definition]

# Option : failregex
# Notes. : Expression régulière de détection des échecs
#          d'authentifications dans le fichier journal correspondant.
#          Le tag <HOST> est utilisé pour la correspondance 
#          adresse IP / nom d'hôte.
# Valeurs: TEXT
#
failregex = Authentication failure for .* from <HOST>
            Failed authentication for .* from <HOST>

# Option :  ignoreregex
# Notes. :  Si cette expression régulière retourne un positif, 
#           la ligne correspondante du fichier log est ignorée.
# Valeurs:  TEXT
#
ignoreregex =

Les directives failregex et ignoreregex peuvent contenir plusieurs expressions régulières qui doivent alors être séparées par un retour chariot comme dans l'exemple ci-dessus.

Tester vos filtres

Si vous êtes amenés à créer ou à modifier des filtres de détection, vous pouvez vous assurer qu'ils fonctionnent correctement en utilisant la commande :

# fail2ban-regex {chemin du fichier log} {chemin du fichier filtre}

Vous devez évidement disposer d'un jeu de données correspondant aux expressions régulières que vous désirez tester. Vous pouvez au choix :

  • utiliser un fichier qui contient déjà les enregistrements que vous souhaitez tester,
  • ajoutez les enregistrement nécessaires vous même dans le fichier log,
  • provoquer l'écriture des enregistrement en procédant à des tests d'authentification erronés.

Fichier d'action

Les fichiers d'actions sont rangés dans le dossier /etc/fail2ban/action.d/.
Comme les filtres, les actions sont des fichiers texte suffixés en .conf. Voici un exemple commenté et personnalisable :

# Fichier de configuration Fail2Ban
#
# Author: {Nom de l'auteur}
#
# $Revision$
#

[Definition]

# Option :  actionstart
# Notes. :  Commande exécutée une fois, au lancement de Fail2Ban.
# Valeurs:  CMD
#
actionstart = iptables -N fail2ban-<name>
              iptables -A fail2ban-<name> -j RETURN
              iptables -I <chain> -p <protocol> --dport <port> -j fail2ban-<name>

# Option :  actionstop
# Notes. :  Commande exécutée une fois, à l'arret de Fail2Ban.
# Valeurs:  CMD
#
actionstop = iptables -D <chain> -p <protocol> --dport <port> -j fail2ban-<name>
             iptables -F fail2ban-<name>
             iptables -X fail2ban-<name>

# Option :  actioncheck
# Notes. :  Commande exécutée avant chaque commande actionban.
# Valeurs:  CMD
#
actioncheck = iptables -n -L <chain> | grep -q fail2ban-<name>

# Option : actionban
# Notes. : Commande exécutée lors du bannissement d'une IP. 
#          Veillez à ce que la commande soit exécutée avec 
#          les droits d'utilisateur Fail2Ban.
# Tags   : <ip> adresse IP
#          <failures> nombre d'échecs
#          <time> timestamp unix du temps de bannissement
# Valeurs: CMD
#
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP

# Option : actionunban
# Notes. : Commande exécutée lors du débannissement d'une IP. 
#          Veillez à ce que la commande soit exécutée avec 
#          les droits d'utilisateur Fail2Ban.
# Tags   : <ip> adresse IP
#          <failures> nombre d'échecs
#          <time> timestamp unix du temps de bannissement
# Valeurs: CMD
#
actionunban = iptables -D fail2ban-<name> -s <ip> -j DROP

[Init]

# Nom par défaut de la chaine
#
name = default

# Option :  port
# Notes. :  Spécifie le port à surveiller
# Valeurs:  [ NUM | STRING ]  Défaut:
#
port = ssh

# Option :  protocol
# Notes. :  Utilisé en interne par le lecteur de configuration
#           pour les interpolations.
# Valeurs:  [ tcp | udp | icmp | all ] Défaut: tcp
#
protocol = tcp

# Option : chain
# Notes. : Précise la chaîne iptables à laquelle les règles fail2ban 
#          doivent être ajoutées
# Valeurs: STRING  Défaut: INPUT
chain = INPUT

Les fichiers d'actions sont principalement composés de deux sections.

La section [Definition] est obligatoire et permet de déterminer les actions à mener a certains moments clés  :

actionstart
Exécuté une fois au lancement de Fail2Ban.
actionstop
Exécuté une fois à l'arrêt de Fail2Ban.
actioncheck
Exécuté juste avant l'événement actionban.
actionban
Exécuté à chaque fois que le nombre de tentatives d'échec d'authentification est atteint.
actionunban
Exécuté lorsque le temps de bannissement d'un hôte est arrivé à expiration.

La section [Init] est optionnelle et permet de préciser certains paramètres d'applicabilité du fichier d'action.

Assembler une règle

Les règles sont contenues par défaut dans le fichier /etc/fail2ban/jail.conf.
Comme évoqué plus haut, il faut éviter d'éditer ce fichier directement et il convient d'en faire une copie (/etc/fail2ban/jail.local) avant toute modification.

Voici un exemple de règle, suivi de la définition de ses principales directives :

...
[foo]
enabled  = true
port     = http,20045
filter   = foo
logpath  = /var/log/foo.log
action   = iptables[name=FOO, port=http, protocol=tcp]
           mail-whois[name=FOO, dest=admin@localhost.localdomain]
findtime = 600
bantime  = 600
maxretry = 5
...
enabled
État d'activation de la règle de sécurité. Les valeurs possibles sont true ou false.
port
Numéro de port associés au service concerné. Il peut s'agir d'un port unique ou d'une liste de ports séparés par des virgules. Il est possible d'utiliser une valeur littérale comme ftp ou http ou une valeur numérique. Dans le cas de valeurs littérales, le nom des ports doit correspondre à ceux fournis dans le fichier /etc/services.
filter
Nom filtre Fail2Ban associé. Si le chemin du filtre est /etc/fail2ban/filter.d/foo.conf, le nom du filtre sera foo.
logpath
Chemin système du fichier journal que Fail2Ban doit surveiller.
action
Action(s) à effectuer lorsque le nombre maximum d'échec de connexion toléré a été atteint. Il peut s'agir d'une commande unique, d'une suite de commandes séparées par un retour chariot, ou du nom d'un fichier d'action sans son extension (ex. : mon-action pour le fichier /etc/fail2ban/actions.d/mon-action.conf)
findtime
Temps maximum en secondes pouvant s'écouler entre la première tentative d'authentification échouée et nombre maximum d'échec toléré (maxretry).
bantime
Temps de bannissement de l'hôte ayant transgressé la règle de sécurité, exprimé en secondes.
maxretry
Nombre maximum d'échec de connexion toléré.

Exemple : Bannissement des attaques w00t-w00t

La première chose à faire et de créer un fichier pour notre filtre et d'y enregistrer l'expression régulière qui nous permettra de détecter les attaque w00tw00T :

# nano /etc/fail2ban/filter.d/apache-w00tw00t.local
[Definition]

# Option:  failregex
# Notes.:  regex to match the w00tw00t scan messages in the logfile.
# Values:  TEXT
failregex = ^.*\[client <HOST>\].*w00tw00t\..*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex =

Une fois notre filtre enregistré, il nous faut ajouter une règle à la configuration de Fail2Ban :

# nano /etc/fail2ban/jail.local
...
[apache-w00tw00t]

enabled  = true
filter   = apache-w00tw00t
action   = iptables-allports
logpath  = /var/log/apache*/*error.log
maxretry = 0
bantime  = 86400
...

Enfin, il nous faut demander à Fail2Ban de prendre en compte notre nouvelle règle et vérifier qu'elle est bien chargée :

# fail2ban-client add apache-w00tw00t
# fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:           apache-w00tw00t

Contrôler Fail2Ban

Fail2Ban dispose d'outils qui vous permettent de contrôler les règles de sécurité. Les principaux sont listés dans ce chapitre, mais n'hésitez pas à consulter la documentation officielle de Fail2Ban afin d'obtenir d'avantage d'informations. La documentation de l'application est également disponible via les commandes habituelles : $ man fail2ban-client et $ man fail2ban-server.

Vérifier que le serveur est actif

# fail2ban-client ping

Exemple :

# fail2ban-client ping
Server replied: pong

Obtenir des détails lorsque fail2ban ne démarre pas

# fail2ban-client -x start

Exemple :

# fail2ban-client -x start
ERROR  No file(s) found for glob /var/www/*/logs/access_log
ERROR  Failed during configuration: Have not found any log file for php-url-fopen jail

Lister les règles de sécurité en cours d'application

# fail2ban-client status

Exemple :

# fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:           ssh

Obtenir les détails concernant l'application d'une règle de sécurité

# fail2ban-client status {nom de la règle}

Exemple :

# fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list:        /var/log/auth.log
|  |- Currently failed: 0
|  `- Total failed:     0
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned:     0

Désactiver une règle de sécurité

# fail2ban-client stop {nom de la règle}

Exemple :

# fail2ban-client stop ssh
Jail stopped

Note : Cette commande n'a pas un effet permanent. Pour désactiver une règle de sécurité de manière permanente il faut éditer le fichier /etc/fail2ban/jail.conf

Activer une règle de sécurité

# fail2ban-client add {nom de la règle}

Exemple :

# fail2ban-client add ssh
Added jail ssh

Note : Cette commande n'a pas un effet permanent. Pour activer une règle de sécurité de manière permanente il faut éditer le fichier /etc/fail2ban/jail.conf