Aller au contenu

Fail2Ban

  1. Les réglages
  2. Fail2Ban cli

Les réglages

Le fichier de configuration global /etc/fail2ban/fail2ban.conf ne contient pas grand chose à modifier. Vous pourrez paramétrer l’endroit où Fail2Ban doit enregistrer ses logs, la verbosité de ces derniers et modifier les réglages du socket unix. En ce qui me concerne, je ne touche à rien.

/etc/fail2ban/jail.conf contient les jails par défaut. Comme il est indiqué en haut du fichier, ce dernier n’est pas à modifier directement. On activera les jails dans /etc/fail2ban/jail.d/defaults-debian.conf (Debian & Ubuntu), le nom du fichier est certainement différent sur d’autres distribs mais vous avez le chemin du répertoire. Vous devriez donc vous y retrouver sans problème.

Dans sa configuration la plus simple, on se contente d’activer les jails proposées par défaut. Voici par exemple une configuration minimaliste mais fonctionnelle.


[DEFAULT]
destemail = mon-email@mail.fr
sender = root@domaine.fr

[sshd]
enabled = true

[sshd-ddos]
enabled = true

[recidive]
enabled = true

On peut néanmoins y ajouer encore quelques détails. De plus sachez que pour chaque jail ainsi que pour [DEFAULT], vous pouvez préciser ignoreip, qui permet, comme son nom l’indique, de ne pas considérer certaines ip ou blocs d’ip. Pratique pour ne pas se retrouver à la porte de son propre serveur.


[DEFAULT]
destemail = mon-email@mail.fr
sender = root@domaine.fr
ignoreip = 127.0.0.1/8

[sshd]
enabled = true


[apache]
enabled = true

Vous voyez par exemple que j’ai ici aussi ajouté apache. Si vous avez un serveur Apache, cela peut s’avérer utile. Pensez bien à parcourir le jail.conf ainsi que les filtres prédéfinis dans filter.d afin de voir ce qui existe par défaut et activez ou non des jails selon vos besoins.

Ce n’est pas tout, d’autres options courantes sont à connaître :

port permet de préciser les ports à bloquer, logpath indique le fichier de log à analyser, maxretry le nombre d’occurences dans le fichier de log avant que l’action ne soit déclenchée, findtime permet de spécifier le laps de temps pendant lequel on considère les occurences (au dela de findtime, on repart à zéro), *bantime définit le temps que l’ip restera bloquée via Fail2Ban.


[…]


[sshd]
enabled = true
maxretry = 10
findtime = 120
bantime = 1200

Si vous parcourez /etc/fail2ban/jail.conf, vous pourrez voir les autres options qui s’appliquent par défaut si vous ne les redéfinissez pas.

Enfin, vous pouvez également définir backend. Il s’agit de la méthode de surveillance des logs. Quatre méthodes sont proposées :

pyinotify : un module Python permettant de monitorer les modifications sur un fichier. gamin : même usage que le précédent, mais il s’agit d’un module du projet Gnome. polling : le fichier est simplement vérifier à intervales régulièrs afin de vérifier s’il y a eu des écritures. systemd : ici, Fail2Ban se greffe sur SystemD afin d’être alerté de nouveaux logs. *auto : mode automatique, qui va tenter toutes les solutions sus-mentionnées, dans cet ordre.

On peut donc dans la plupart des cas laisser auto. Sachez qu’il est toutefois possible de définir le backend au cas par cas au niveau de chaque jail.

Ajout de nouveaux filtres

Ce qui est génial avec Fail2Ban, c’est qu’il est possible d’ajouter autant de jails que l’on veut. Si vous savez utiliser les REGEX, vous savez écrire une jail !

Nous commençons par créer un filtre afin de détecter les tentatives de connexion infructueuses. Dans un tel cas, notre applicatif devrait renvoyer une erreur 401. Voici un exemple de log que nous allons matcher :

80.214.431.42 - - [14/Oct/2018:21:27:32 +0200] "POST /users/login HTTP/2.0" 401 30 "https://app.buzeo.me/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0" "-"

Voici à quoi ressemble notre filtre (/etc/fail2ban/filter.d/nginx-unauthorized).




[Definition]
failregex =  - - \[.*\] ".*" 401
ignoreregex =

C’est aussi simple que ça ! <HOST>, vous l’aurez deviné, permet à Fail2Ban de matcher une ip ou un nom d’hôte et de capturer cette adresse afin de la bloquer dans iptables. Le reste est assez classique. La failregex peut contenir plusieurs lignes, dans ce cas, chacune sera matchée de manière indépendante. Quant à l’ignoreregex son nom est assez explicite et elle permet de ne pas tenir compte d’un pattern donné.

Modifions maintenant notre configuration dans /etc/fail2ban/jail.d/defaults-debian.conf pour activer notre nouveau filtre.

[…]


[nginx-unauthorized]
enabled = true

filter = nginx-unauthorized
port = 80,443 
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 120
bantime = 300

Fail2Ban cli

Fail2Ban possède plusieurs clients fort pratiques. fail2ban-regex permet de valider vos filtres et fail2ban-client permet de gérer tous les autres aspects du logiciel, de la vérification du contenu d’une jail au redémarrage de l’outil. Commençons par un rapide aperçu de l’outil regex.

fail2ban-regex <fichier-de-log | string-représentant-une-ligne-de-log> <chemin-du-filtre | string-regex> [<chemin-du-filtre | string-ignoregex]

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-unauthorized.conf

Ce n’est pas un bug, si vous voulez tester une ignoreregex depuis un fichier de filtre, il faut renseigner le chemin deux fois. Fort utile, le fail2ban-regex n’en est pas moins très simple d’usage.

Passons maintenant au “centre de commandement” de Fail2ban : fail2ban-client. Ce dernier outil permet de vérifier l’état de Fail2Ban comme les jails activées, le nombres d’ip bloquées etc. Voyons les fonctions les plus utiles.

Tout d’abord, il est bon de préciser que cet outil peut avantageusement s’utiliser en mode interactif, pour lancer le mode interactif, on invoque la commande avec l’option -i.

Commandes de base

Les commandes de bases sont start, reload, stop, status, ping, help. Si la plupart d’entre elles se passent d’explications, attardons nous sur

start

Lance le serveur et les jails.

reload

recharge la configuration.

reload <JAIL>

recharge la configuration d'une jail uniquement.

stop

Arrête le serveur.

status

Retourne le statut du serveur : nombre de jails, filtres, nombres de fails…

ping

Permet simplement de s'assurer que le serveur répond.

help

Retourne l'ensemble des commandes possibles.

Voici par exemple le retour de la commande status, nous n’utilisons pas ici le mode interactif.


fail2ban-client status
Status
|- Number of jail:    4
`- Jail list:        ssh-ddos, nginx-errors, recidive, ssh

Le logging

Le logging est le cœur même de Fail2Ban, car sans logs, l’outil ne pourrait pas fonctionner. L’outil génère lui-même ses logs, explorables via la cli. Voyons donc quelles sont les options offertes par cette dernière.

set loglevel

Définit le niveau de logging.

get loglevel

Retourne le niveau de logging.

set logtarget

Définit la cible des logs (STDOUT, STDERR, SYSLOG ou chemin vers un fichier).

get logtarget

Retourne le chemin du fichier de log (ou autre si ce n'est pas un fichier).

flushlogs

Vide le fichier de logs (si disponible). Cette fonction est dédié à la rotation.

Base de données

Fail2Ban possède une base de données interne SQLite. Cette dernière permet de persister des informations entre redémarrages, notamment les ips à bloquer et de recréer les règles iptables au démarrage.

set dbfile

Définir la localisation de la base de données.

get dbfile

Retourne le chemin de la base de données.

set dbpurgeage

Définit la durée de rétention des informations dans la base de données.

get dbpurgeage

Récupère le nombre de secondes de rétentions des informations en base de données de la configuration actuelle.

Contrôle et information concernant les jails

Le contrôle des prison est le nerf de la guerre dans Fail2Ban. Découvrons quelles sont les actions à notre disposition. Ci dessus les principales actions de contrôle.

add <JAIL> <BACKEND>

Active une jail et définit son backend (on mettra `auto` la plupart du temps).

start <JAIL>

Démarre une jail arrêtée.

stop <JAIL>

Arrête et désactive une jail.

status <JAIL>

Retourne les détails d'une jail en particulier.

Voici par exemple le statut d’une jail.

fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list:    /var/log/auth.log
|  |- Currently failed:    0
|  `- Total failed:    4499
`- Actions
   |- Currently banned:    1
   |- Total banned:    274
   `- IP list: 176.140.156.45

Voyons maintenant plus en détails comment obtenir des informations détaillées concernant des jails en particulier.

get <JAIL> logpath

Retourne le chemin du fichier de log analysé par cette jail.

get <JAIL> logencoding

Récupère l'encodage du fichier de log utilisé par cette jail.

get <JAIL> journalmatch

Récupére les entrées du fichier de log matchées par cette jail.

get <JAIL> ignoreip

Affiche les ips ignorées.

get <JAIL> ignorecommand

Affiche les entrée du `ignorecommand` de cette jail.

get <JAIL> failregex

Affiche la `failregex` de cette jail.

get <JAIL> ignoreregex

Affiche l'`ignoreregex` de cette jail.

get <JAIL> findtime

Retourne le délai pris de prise en comtpe de tantatives pour cette jail.

get <JAIL> bantime

Retourne la durée de banissement pour cette jail.

get <JAIL> maxretry

Retourne le nombre d'erreurs tolérées avant banissement.

get <JAIL> maxlines

Retourne le nombre maximum de lignes analysées.

get <JAIL> actions

Affiche l'ensemble des actions liées à cette jail.

Enfin, il est également possible d’altérer les paramètres des jails directement via la ligne de commande. Bien qu’on utilise en général directement les fichiers de configuration pour cela, ces commandes peuvent s’avérer particulièrement utiles afin de bannir ou dé-bannir manuellement des adresses.


fail2ban-client set <JAIL> banip <IP>


fail2ban-client set <JAIL> unbanip <IP>

Il ne s’agit pas d’une liste exhaustive des possibilités offertes pas la ligne de commande Fail2Ban. De nombreux paramètres habituellement configurés via les fichiers de configuration sont également paramétrables via la CLI. Pour connaître toutes les possibilités, il suffit d’utiliser la commande help.

Sachez cependant que Fail2Ban a encore d’autres tours dans son sac. En cas de match, il peut accomplir n’importe quel comportement (envoyer un email, rediriger vers une autre ip…). Pour en savoir plus je vous invite à lire la partie concernant les actions de cet article et celui-ci en anglais.