Recherche de site Web

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

OptionRôleValeur par défaut
filtreFiltre utilisé par la prisonLe filtre correspondant au nom de la prison sous /etc/fail2ban/filter.d
chemin de journalSpécifie le(s) chemin(s) des fichiers journaux à surveillerdépendant du service
actionAction(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
ignoreipListe des adresses IP à ignorerAucun
bantimeLa durée du bannissement exprimée en secondes ou avec des suffixes temporels explicites10 millions
trouver le tempsIntervalle de temps pendant lequel le nombre spécifié de tentatives d’authentification infructueuses doit se produire pour qu’une adresse IP soit bannie10 millions
maxretryLe nombre d’échecs qui doivent se produire dans le findtime spécifié pour déclencher un bannissement5

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.

Conclusions

Articles connexes: