Fail2ban est in IPS (Intrusion Prevention Software) qui analyse les fichiers log du système pour détecter des tentatives d’accès par brute force ou dictionnaire et bannir les adresses IP ayant obtenu un trop grand nombre d’échecs. Il met à jour les règles du pare-feu Iptables pour rejeter ces adresses IP et stopper les attaques pendant un temps définis. Les règles de bannissement sont paramétrables comme par exemple la durée du bannissement ou le nombre de tentatives échouées.
Installation
L’installation peut simplement se faire via la commande apt install
:
# apt install fail2ban |
Dès son installation Fail2Ban est déjà actif et permet une protection contre de nombreuses attaques telle que le bruteforcing du port SSH.
Vous pouvez vérifier si Fail2Ban est bien lancé :
# systemctl status fail2ban.service |
Le répertoire contenant les logs de Fail2ban se trouve dans /var/log/fail2ban/fail2ban.log
et les fichiers de configuration dans /etc/fail2ban/
.
Configuration
Fail2ban contient des fichiers de configuration généraux, de préférence à ne pas toucher pour ne pas que la configuration personnalisée soit effacée lors d’une mise à jour ou lors d’une réinstallation, et des fichiers de configuration prévus pour être personnalisés par l’utilisateur.
Les fichiers de configuration
Dans /etc/fail2ban/
se trouvent tous les fichiers de configuration de Fail2ban. Fail2ban utilise 2 types de fichiers de configuration. Les fichiers de configuration de base et les fichiers de configuration personnalisés par l’utilisateur·trice.
Les configurations personnelles de fail2ban doivent de préférence toutes se faire dans un fichier *.local
, cette sécurité permet de garder la configuration personnalisée en cas de mise à jour et d’éviter un risque d’écrasement. Dans ces fichiers il faut uniquement spécifier les modifications, le reste de la configuration sera effectuée par les fichiers *.conf
qui seront lu en premier.
# ls -l /etc/fail2ban/ |
Fichiers de configuration de Fail2ban
La configuration par défaut de Fail2ban (ces fichiers ne sont pas à modifier) :
fail2ban.conf | Configuration générale |
action.d/*.conf | Actions à effectuer en cas d’attaque |
filter.d/*.conf | Filtres permettant de détecter une attaque dans les logs |
**jail.conf ** | Configuration des prisons |
paths-common.conf | Contient les chemins vers différents fichiers logs variables |
paths-debian.conf | Contient les chemins vers différents fichiers logs |
paths-opensuse.conf | Contient les chemins vers différents fichiers logs |
Fichiers pour personnaliser fail2ban
Les fichiers à utiliser pour configurer son Fail2ban, en cas de réinstallation ou de mise à jour ses fichiers devraient être conservés. Je vous recommande tout de même d’en faire une sauvegarde.
fail2ban.local | Configuration générale, copie de fail2ban.conf - Fichier à créer |
jail.local | Copie manuelle de jail.conf, configuration générale des prisons |
fail2ban.d/*.local | Contient la configuration générale personnalisée / modifiée |
action.d/*.local | Actions à effectuer en cas d’attaque |
filter.d/*.local | Filtres permettant de détecter une attaque dans les logs |
jail.d/*.local | Contient les prisons personnalisées / modifiées |
Configuration générale
On effectue une copie de fail2ban.conf
dans fail2ban.d/fail2ban.local
afin de pouvoir, si besoin, personaliser ce fichier.
# cp fail2ban.d/fail2ban fail2ban.d/fail2ban.local |
Contenu du fichier fail2ban.d/fail2ban.local
, il contient les options par défaut qui seront appliquées si vous ne les spécifiez pas dans vos prisons.
# =============================================================== |
Configuration des prisons
Le fichier de configuration /etc/fail2ban/jail.local
contient la configuration générale pour les prisons. Il est par la suite possible de créer des fichiers séparés dans /etc/fail2ban/jail.d/*.local
pour configurer chaque prison ou de tout simplement les configurer dans ce même fichier.
Contenu du fichier /etc/fail2ban/jail.local
qui contient la configuration générale des prisons. Cette configuration de base sera appliquée si rien n’est précisée dans la prison à configurer.
# =============================================================== |
Les prisons peuvent être configurées à la suite de ce fichier ou séparément dans /etc/fail2ban/jail.d/*.local
.
Créer de nouvelles prisons
Pour créer une nouvelle prison il faut 3 fichiers (parfois ils existent déjà dans Fail2ban) :
- Le fichier qui défini la prison :
/etc/fail2ban/jail.d/MaPrison.local
- Le fichier qui qui permettra de détecter une attaque dans les logs :
/etc/fail2ban/filter.d/MaPrisonFiltre.local
/etc/fail2ban/filter.d/MaPrisonFiltre.conf
(si vous utiliser un filtre qui existe déjà)
- Le fichier qui indiquera la marche à suivre si une attaque est détectée :
/etc/fail2ban/action.d/ActionMaPrison.local
/etc/fail2ban/filter.d/ActionMaPrison.conf
(si vous utiliser une action qui existe déjà)
Par défaut une prison possède les options et les valeurs suivantes :
# -------------------------------------- |
Si certaines options ci-dessus ne sont pas définies dans la prison alors ce sera les paramètres définis par défaut dans les fichiers jail.conf
, jail.local
, fail2ban.conf
ou fail2ban.local
dans qui seront pris en compte.
SSHD : une prison pour ssh
Dans le répertoire /etc/fail2ban/jail.d
on créer un nouveau fichier appelée sshd.local
et on y écrit le contenu suivant :
[sshd] |
Les valeurs de sshd_log et sshd_backend sont déjà définies dans /etc/fail2ban/path-common.conf
et /etc/fail2ban/path-debian.conf
et valent respectivement :
- sshd_log = %(syslog_authpriv)s = syslog_authpriv = /var/log/auth.log
- backend = %(sshd_backend)s = %(default_backend)s = default_backend = auto
Et de façon implicite (car défini par défaut dans jail.local
)
- banaction = iptables-multiport
- banaction_allports = iptables-allports
SSHD-DDOS : une prison pour ssh contre le DDOS
Cette prison peut sembler similaire à [sshd]
mais la valeur de la variable filter = %(__name__)s
définie par défaut dans jail.local
diffère, en d’autres termes le filtre utilisé est différent en fonction du nom de la prison.
|
PAM : Prison pour la connexion des users
Cette prison permet de bloquer des tentatives de connexions directement sur le serveur (et non pas à distance via ssh). Elle bloque également les tentatives erronées losqu’un utilisateur déjà loggé tente d’utiliser un autre compte.
[pam-generic] |
Prisons particulières : IP récidivistes
Le but est de créer une interdiction plus étendue pour les IP récidivistes
Pré-configuration
Dans un premier temps il ne faut pas que le niveau de loglevel spécifié dans fail2ban.d/fail2ban.conf.local
ne soit pas à DEBUG (sinon fail2ban tomberait dans une boucle infinie en interpretant constamment des lignes inutiles). Il faut ensuite augmentez la valeur de dbpurgeage
à 648000 (7,5 jours) pour conserver les entrées de connexions échouées pendant une durée suffisament longue pour pouvoir bannir les IP pour 1 semaine par exemple.
Variables à modifier dans fail2ban.d/fail2ban.conf.local
[Definition] |
Création de la prison pour IP récidivistes
Ici Fail2ban va examiner son propre fichier logs et bannira pendant 1 semaine une adresse IP qui, sur une durée de 24h, s’est déjà retrouvée 5 fois (valeur par défaut du maxretry dans jail.local
) dans une prison.
[recidive] |
Activer les nouvelles prisons
Pour recharger les fichiers de configuration, afin que les nouvelles prisons soient prises en compte, il suffit de recharger Fail2ban.
# fail2ban-client reload |
Pour recharger le fichier de configuration d’une prison déjà existante :
# fail2ban-client reload <NomDeLaPrison> |
Débannissement
Si vous avez besoin de débannir une adresse IP en particulier vous pouvez aller regarder les statut des prisons :
# fail2ban-client status <Nom de la Prison> |
En regardant le statut de la prison concernée, par exemple avec celle nommée sshd
on peut voir les filtres et les actions mises en place par Fail2ban. Dans cet exemple il y a eu 717 tentatives, toutes loggées dans /var/log/auth.log
et une adresse IP actuellement bannie sur un total de 237.
# fail2ban-client status sshd |
On peut également, à titre informatif, voir ce bannissement directement dans iptables. Il n’est pas conseillé de modifier directement les règles d’IPtables mais plutôt d’utiliser la commande de Fail2ban approprié pour réautoriser une adresse IP.
# iptables -L |
Pour réautoriser une ip bannie par Fail2ban :
# fail2ban-client set <Nom-Prison> unbanip @AdresseIP |
Bonnes pratiques
Le réflexe à avoir est de créer une nouvelle prison à chaque services nouvellement installés. Il en existe de nombreuses prédéfinies de bases dans jail.local
, comme celles pour gérer un serveur Apache, Bind9 ou NGINX par exemple.
Fail2ban ET Docker
https://mondedie.fr/d/9250-faire-fonctionner-fail2ban-avec-limage-docker-wonderfall-boring-nginx
https://mondedie.fr/d/9327-docker-fail2ban-sur-lhost-avec-nginx-dockerise/3
Documentation
FAQ Fail2ban : http://www.fail2ban.org/wiki/index.php/FAQ_french
Fail2ban inutile ? https://kabs.homeunix.org/blog/brute-force