Comment installer et configurer Fail2ban sur Linux
Fail2ban est un logiciel gratuit et open source que nous pouvons utiliser pour atténuer les attaques par force brute et DoS/DDoS : il analyse les fichiers journaux à la recherche de plusieurs tentatives d’authentification échouées et bannit les adresses IP associées en créant des règles de pare-feu ad hoc.
Dans ce tutoriel, nous voyons comment installer et configurer fail2ban sous Linux, et nous apprenons les concepts de base derrière son utilisation.
Dans ce tutoriel, vous allez apprendre :
- Comment installer Fail2ban sur certaines des distributions Linux les plus utilisées
- Comment configurer Fail2ban
- Comment utiliser l’utilitaire fail2ban-client
Installation
Fail2ban est disponible dans les dépôts officiels de toutes les distributions Linux les plus utilisées. Pour l’installer sur Debian et les distributions basées sur Debian, nous pouvons utiliser la commande suivante :
sudo apt install fail2ban
Sur Fedora, nous effectuons l’installation avec le gestionnaire de paquets dnf
:
sudo dnf install fail2ban
Avant de pouvoir effectuer l’installation sur RHEL ou l’un de ses clones comme Rocky Linux, nous devons ajouter le référentiel EPEL (Extra Package for Enterprise Linux) en tant que source logicielle. Dans le cas de Rocky, il s’agit d’une opération très simple, puisque le dépôt est automatiquement configuré lorsque nous installons le paquet epel-release
:
sudo dnf install epel-release
Si vous utilisez RHEL lui-même, le paquet peut être téléchargé et installé à partir du site EPEL.
Pour s’assurer que le service fail2ban est actif et démarré au démarrage, nous lançons la commande suivante :
sudo systemctl enable --now fail2ban
Configuration de Fail2ban
Une fois le paquet Fail2ban installé, tous ses fichiers de configuration se trouvent dans le répertoire /etc/fail2ban
. Nous devrions éviter de modifier les fichiers qui font partie de l’installation (ceux avec l’extension « .conf »), et placer les configurations personnalisées dans les fichiers correspondants avec les extensions « .local », à la place. Le fichier de configuration principal de fail2ban est /etc/fail2ban/fail2ban.conf
. Ce fichier contient des paramètres génériques, tels que le niveau de connexion fail2ban. Nous plaçons les valeurs de remplacement dans le fichier /etc/fail2ban/fail2ban.local
, qui doit être créé s’il n’existe pas. Pour changer le niveau de journalisation de « INFO » (par défaut) à « DEBUG », par exemple, nous écririons :
[DEFAULT]
loglevel = DEBUG
Il y a trois « entités » principales auxquelles nous devons faire face lorsque nous travaillons avec Fail2ban : les filtres, les actions et les prisons. Jetons-y un coup d’œil.
Filtres
Fail2ban analyse les fichiers journaux et recherche les tentatives d’authentification ayant échoué. Avec les filtres, nous lui expliquons essentiellement comment reconnaître les tentatives d’authentification dans les fichiers journaux de services spécifiques. Les filtres prêts à l’emploi se trouvent dans le répertoire /etc/fail2ban/filter.d
:
ls /etc/fail2ban/filter.d
3proxy.conf domino-smtp.conf mysqld-auth.conf selinux-ssh.conf
apache-auth.conf dovecot.conf nagios.conf sendmail-auth.conf
apache-badbots.conf dropbear.conf named-refused.conf sendmail-reject.conf
apache-botsearch.conf drupal-auth.conf nginx-botsearch.conf sieve.conf
apache-common.conf ejabberd-auth.conf nginx-http-auth.conf slapd.conf
apache-fakegooglebot.conf exim-common.conf nginx-limit-req.conf softethervpn.conf
apache-modsecurity.conf exim.conf nsd.conf sogo-auth.conf
apache-nohome.conf exim-spam.conf openhab.conf solid-pop3d.conf
apache-noscript.conf freeswitch.conf openwebmail.conf squid.conf
apache-overflows.conf froxlor-auth.conf oracleims.conf squirrelmail.conf
apache-pass.conf gitlab.conf pam-generic.conf sshd.conf
apache-shellshock.conf grafana.conf perdition.conf stunnel.conf
assp.conf groupoffice.conf phpmyadmin-syslog.conf suhosin.conf
asterisk.conf gssftpd.conf php-url-fopen.conf tine20.conf
bitwarden.conf guacamole.conf portsentry.conf traefik-auth.conf
botsearch-common.conf haproxy-http-auth.conf postfix.conf uwimap-auth.conf
centreon.conf horde.conf proftpd.conf vsftpd.conf
common.conf ignorecommands pure-ftpd.conf webmin-auth.conf
counter-strike.conf kerio.conf qmail.conf wuftpd.conf
courier-auth.conf lighttpd-auth.conf recidive.conf xinetd-fail.conf
courier-smtp.conf mongodb-auth.conf roundcube-auth.conf znc-adminlog.conf
cyrus-imap.conf monit.conf screensharingd.conf zoneminder.conf
directadmin.conf murmur.conf selinux-common.conf
Actions
Les actions Fail2ban sont définies dans le répertoire /etc/fail2ban/action.d
. Les actions sont nommées d’après le logiciel utilisé pour faire respecter l’interdiction. Voyons un exemple. UFW (Uncomplicated Firewall) est un gestionnaire de pare-feu conçu pour être facile à utiliser ; Voici le contenu du fichier /etc/fail2ban/action.d/ufw.conf
:
Fail2Ban action configuration file for ufw
#
You are required to run "ufw enable" before this will have any effect.
#
The insert position should be appropriate to block the required traffic.
A number after an allow rule to the application won't be of much use.
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = [ -n "<application>" ] && app="app <application>"
ufw insert from to $app
actionunban = [ -n "<application>" ] && app="app <application>"
ufw delete from to $app
[Init]
Option: insertpos
Notes.: The position number in the firewall list to insert the block rule
insertpos = 1
Option: blocktype
Notes.: reject or deny
blocktype = reject
Option: destination
Notes.: The destination address to block in the ufw rule
destination = any
Option: application
Notes.: application from sudo ufw app list
application =
Une action est composée de deux sections principales : « Définition » et « Init ». Les commandes spécifiées dans le premier sont exécutées dans différentes situations : en tant qu’étape préliminaire (actioncheck), lorsqu’une prison démarre (actionstart), lorsqu’elle s’arrête (actionstop), pour bannir (actionban) et pour débannir (actionunban) une adresse IP.
La section « Init » contient des configurations spécifiques à l’action. Dans l’action ufw que nous avons signalée ci-dessus, par exemple, vous pouvez voir qu’elle contient des instructions sur la position de la règle de pare-feu dans la liste des règles (insertpos=1) et le type de bloc à utiliser (reject vs deny).
Prisons
Enfin, nous avons des prisons. Une prison associe essentiellement un filtre et une ou plusieurs actions. Le fichier de configuration principal de Fail2ban pour les prisons est /etc/fail2ban/jail.conf
; les fichiers de configuration peuvent être placés dans le répertoire /etc/fail2ban/jail.d
.
Les prisons sont nommées d’après le filtre qu’elles utilisent : si une prison est nommée « sshd « , par exemple, elle est associée au filtre /etc/fail2ban/filter.d/sshd.conf
, à moins qu’il ne soit explicitement spécifié via l’option « filter « . Le nom de la prison est indiqué entre crochets. Debian fournit une dérogation pour la prison sshd par défaut. Il est défini dans le fichier /etc/fail2ban/jail.d/defaults-debian.conf
:
[sshd]
enabled = true
Les paramètres par défaut de la prison « sshd " se trouvent dans le fichier de configuration de la prison principale. Debian fournit cette dérogation avec le paramètre « enabled » défini à « true » juste pour s’assurer que la prison est active. Voici quelques paramètres qui peuvent être utilisés lors de la définition d’une prison, ou dans la section « par défaut » (effective pour toutes les prisons existantes) :
Option | Rôle | Valeur par défaut |
---|---|---|
filtre | Filtre utilisé par la prison | Le filtre correspondant au nom de la prison sous /etc/fail2ban/filter.d |
chemin de journal | Spécifie le(s) chemin(s) des fichiers journaux à surveiller | dépendant du service |
action | Action(s) à utiliser par la prison. Les actions sont nommées d’après le fichier dans lequel elles sont définies, sans l’extension | %(action)s – voir ci-dessous |
ignoreip | Liste des adresses IP à ignorer | Aucun |
bantime | La durée du bannissement exprimée en secondes ou avec des suffixes temporels explicites | 10 millions |
trouver le temps | Intervalle de temps pendant lequel le nombre spécifié de tentatives d’authentification infructueuses doit se produire pour qu’une adresse IP soit bannie | 10 millions |
maxretry | Le nombre d’échecs qui doivent se produire dans le findtime spécifié pour déclencher un bannissement | 5 |
Définition de l’action par défaut
Si vous jetez un coup d’œil au fichier de configuration principal de la prison (/etc/fail2ban/jail.conf
), dans la section « par défaut », vous pouvez voir que l’action est définie de la manière suivante (ligne 268) :
action = %(action_)s
Dans la définition ci-dessus, la variable _action
est « expand » et sa valeur est affectée au paramètre « action ». La variable _action
elle-même est définie quelques lignes plus haut (ligne 212 sur Debian) :
action_ = __ %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
Dans cette expression, d’autres variables sont utilisées :
- banaction : il s’agit de l’action de bannissement « principale », définie par défaut sur iptables-multiport
- port : les ports à interdire – défini à 0:65535 par défaut, à remplacer dans des prisons spécifiques
- protocole : protocole utilisé dans la règle de pare-feu pour faire respecter le bannissement – TCP par défaut
- chain : la chaîne dans laquelle les sauts doivent être ajoutés dans les actions de bannissement qui attendent ce paramètre
Les variables port, protocol et chain sont utilisées entre crochets, séparées par des virgules. Avec cette syntaxe, ils sont passés en tant qu'« arguments » et remplacent les espaces réservés respectifs contenus dans la définition de l’action. Ici, « action_ " est l’une des macros disponibles, qui ne fait qu’appliquer un bannissement. D’autres sont définis en dessous. En voici quelques exemples :
- action_mw – Applique l’interdiction et envoie un e-mail contenant un rapport whois à l’adresse e-mail spécifiée.
- action_mwl – Identique à ci-dessus, mais inclut les lignes de journal pertinentes
Soyons bannis !
Vérifions que fail2ban fonctionne correctement et laissons-le déclencher un bannissement. Comme nous l’avons vu précédemment, le findtime par défaut est de 10 minutes, et la valeur maxretry par défaut est 5 : cela signifie que si nous échouons à 5 tentatives d’authentification en 10 minutes, notre IP (192.168.122.1 pour les besoins de cet exemple) sera bannie.
J’essaie de me connecter via SSH à l’hôte avec l’IP 192.168.122.93 en fournissant volontairement un mauvais mot de passe. Cela déclenche l’interdiction de l’hôte distant. Nous pouvons le vérifier en jetant un coup d’œil au journal fail2ban :
sudo tail /var/log/fail2ban.log
Les lignes pertinentes sont les suivantes :
2023-09-27 15:54:47,028 fail2ban.actions
[2829]: NOTICE [sshd] Ban 192.168.122.1
Comme vous pouvez le voir, l’IP 192.168.122.1 a été bannie. Un moyen plus pratique de vérifier tous les bannissements actifs est d’utiliser l’utilitaire fail2ban-client. Pour obtenir une liste d’IP bannies, nous l’utilisons avec la sous-commande « banned " :
fail2ban-client banned
[{'sshd': ['192.168.122.1']}]
Pour débannir une IP (de toutes les prisons), à la place, nous la passons en argument à la sous-commande unban
:
sudo fail2ban-client unban 192.168.122.1
L’utilitaire fail2ban-client peut également être utilisé pour contrôler le serveur (démarrer, arrêter, recharger) et effectuer certaines configurations d’exécution.