Sécurité · 12 min read · Oct 23, 2025
Installation et utilisation de Fail2ban sur Debian 12

Fail2ban surveille les fichiers journaux pour les échecs de connexion et interdit temporairement l’adresse IP source sujette aux échecs d’accéder à l’hôte. C’est une défense contre les attaques par force brute de devinette de mot de passe. Il est très utile d’avoir fail2ban sur des hôtes exposés à Internet.
La version de fail2ban sur Debian 12 est 1.0.2.
root@posti:~# fail2ban-client version
1.0.2Pour voir si fail2ban fonctionne actuellement, envoyez au serveur la commande ping avec fail2ban-client. Le serveur Fail2ban répond “pong” s’il est en cours d’exécution.
root@posti:/etc/fail2ban# fail2ban-client ping
Server replied: pong
root@posti:/etc/fail2ban#Comment ça fonctionne
Fail2ban collecte des filtres, des actions et des fichiers surveillés dans une prison. Plusieurs prisons sont fournies avec la distribution. Elles doivent être activées pour commencer à fonctionner. Le filtre spécifie comment détecter les échecs d’authentification. L’action définit comment l’interdiction et la levée d’interdiction se produisent.
Les tentatives d’intrusion déclenchent une interdiction si, pendant le temps de recherche, au moins maxretry échecs de connexion sont détectés depuis le même numéro d’IP. Ensuite, l’IP est bannie pendant bantime secondes. Après que l’interdiction a été en vigueur pendant bantime secondes, l’interdiction est levée et l’IP peut à nouveau accéder à l’hôte. Fail2ban peut gérer à la fois IPv4 et IPv6.
Plus d’informations peuvent être lues dans les fichiers du répertoire /usr/share/doc/fail2ban/.
Configuration de Fail2ban
Sur les systèmes Debian GNU/Linux, fail2ban est installé par défaut avec la prison sshd activée avec des paramètres raisonnables. Cela se fait dans le fichier /etc/fail2ban/jail.d/defaults-debian.conf. C’est la seule prison fonctionnant par défaut. D’autres prisons doivent être activées par l’administrateur système.
Donc, si vous souhaitez uniquement surveiller les connexions ssh et interdire les intrus malveillants, aucune configuration supplémentaire n’est nécessaire.
Malheureusement, sur Debian 12, fail2ban peut ne pas fonctionner avec les paramètres par défaut. Debian 12 a marqué le paquet rsyslog comme optionnel, ce qui signifie qu’il peut ne pas être installé, donc les journaux ne sont collectés que dans journald [wiki.debian.org/Rsyslog].
Sur les systèmes ISPConfig, fail2ban fonctionne, car l’auto-installateur ISPConfig installe rsyslog et le tutoriel Perfect server d’ISPConfig indique d’installer rsyslog.
Avec rsyslog, les fichiers journaux apparaissent dans le répertoire /var/log/ - ainsi, la configuration par défaut de fail2ban trouve les fichiers journaux. Si rsyslog n’est pas installé, la configuration de fail2ban doit être modifiée pour qu’elle lise les journaux du journal systemd. Ajoutez à la section par défaut de jail.local backend = systemd, comme ceci
[DEFAULT]
backend = systemdActivation d’une prison
La documentation recommande de mettre toutes ses propres modifications dans des fichiers .local. Cela évite des problèmes lorsque les fichiers fournis par la distribution sont mis à jour ou modifiés par le mainteneur [Lire le fichier /usr/share/doc/fail2ban/README.Debian.gz].
Par exemple, l’activation de la prison pure-ftpd se fait en ajoutant au fichier /etc/fail2ban/jail.local (créez le fichier s’il n’existe pas déjà) les lignes
[pure-ftpd]
enabled = true
Le nom de la prison entre crochets commence la section pour les paramètres de cette prison.
Lorsque vous avez terminé avec les modifications, forcez la relecture des fichiers de configuration avec la commande
systemctl reload fail2banLa prison devrait maintenant être en cours d’exécution, ce qui peut être vérifié avec fail2ban-client :
root@posti:/etc/fail2ban# fail2ban-client status pure-ftpd
Status for the jail: pure-ftpd
|- Filter
| |- Currently failed: 0
| |- Total failed: 106
| `- File list: /var/log/syslog
`- Actions
|- Currently banned: 0
|- Total banned: 4
`- Banned IP list:
root@posti:/etc/fail2ban# Puisque jail.local n’a que le paramètre “enabled” pour cette prison, tous les autres paramètres sont des paramètres par défaut de la distribution. En général, ils ont de bonnes valeurs, donc une configuration supplémentaire n’est pas nécessaire. Si nécessaire, la section jail.local pour cette prison peut contenir des paramètres qui remplacent ce qui a été défini dans les fichiers .conf.
Cet exemple change findtime, maxretry et bantime pour la prison pure-ftpd :
[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1dFail2ban-client affiche les temps en secondes, mais les temps peuvent être saisis dans les fichiers de configuration dans un format plus simple, par exemple 10h au lieu de 36000 secondes. man jail.conf dans le chapitre “FORMAT D’ABRÉVIATION TEMPORELLE” explique les formats d’entrée de temps conviviaux.
fail2ban-client a l’option de convertir du format de temps convivial en secondes.
# fail2ban-client --str2sec 1d3h7m
97620Suivre les journaux
Pour déterminer quelles prisons doivent être activées, suivez les journaux créés par les services exécutés sur l’hôte. Un outil qui crée des résumés de journaux, comme logwatch ou pflogsumm, est utile. Lire des journaux bruts est chronophage et fastidieux.
Vérifiez s’il existe une prison disponible pour un service exécuté sur l’hôte, peut-être en lisant jail.conf.
Une fois que les journaux montrent quelque chose d’intéressant ou d’inquiétant, il est temps d’examiner. Par exemple, pflogsumm a envoyé un résumé par e-mail avec des lignes comme ceci :
136 unknown[91.224.92.40]: SASL LOGIN authentication failed: UGFzc3...
136 hostname srv-91-224-92-40.serveroffer.net does not resolve to a...
123 unknown[193.32.162.23]: SASL LOGIN authentication failed: UGFzc...
123 hostname mail.whatami.co does not resolve to address 193.32.162.23
Cela montre que l’IP 91.224.92.40 a échoué 136 fois à se connecter à l’e-mail, et un autre cas similaire. Fail2ban aurait dû empêcher autant de tentatives. Pour voir pourquoi cela n’a pas été le cas, examinez le journal de fail2ban.
root@posti:/etc/apt/apt.conf.d# grep 91.224.92.40 /var/log/fail2ban.log | head
2024-02-18 00:01:38,718 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:01:38
2024-02-18 00:11:50,261 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:11:50
2024-02-18 00:21:54,337 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:21:54
2024-02-18 00:32:14,232 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:32:14
2024-02-18 00:42:37,921 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:42:37
2024-02-18 00:53:06,796 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 00:53:06
2024-02-18 01:03:35,293 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:03:35
2024-02-18 01:14:03,765 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:14:03
2024-02-18 01:24:24,628 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:24:24
2024-02-18 01:34:43,876 fail2ban.filter [996]: INFO [postfix-sasl] Found 91.224.92.40 - 2024-02-18 01:34:43
root@posti:/etc/apt/apt.conf.d#Cette IP essaie à intervalles d’environ 10 minutes de se connecter, et la prison fail2ban postfix-sasl la détecte.
Il est bon de découvrir si cette IP appartient peut-être à un utilisateur légitime de l’hôte, qui a simplement un ancien mot de passe dans un smartphone ou un autre appareil essayant de se connecter à intervalles réguliers. J’utilise geoiplookup, cela montre de quel pays provient l’IP. Mes utilisateurs viennent de mon pays, donc les utilisateurs étrangers ont tendance à être de mauvais acteurs. geoiplookup provient des paquets Debian geoip-database et geoip-bin.
$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, LituaniePour découvrir pourquoi l’IP n’a pas été bannie, examinez le findtime de cette prison :
root@posti:/etc/apt/apt.conf.d# fail2ban-client get postfix-sasl findtime
600
root@posti:/etc/apt/apt.conf.d#J’ai récemment vu ces attaques lentes, le coupable sait que le findtime est de 10 minutes, donc il essaie d’éviter d’être banni en essayant des connexions à des intervalles plus longs. Cela a fonctionné dans ce cas. Pour faire en sorte que les échecs de connexion entraînent des interdictions, augmentez le findtime pour la prison, par exemple à 10 heures. Ajoutez au fichier jail.local dans la section [postfix-sasl] :
findtime = 10hEnsuite, après systemctl reload fail2ban, la prison a un findtime plus long :
root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#Une autre façon pour les intrus d’essayer de s’introduire est d’être persistant. Même si l’intrus est banni, il suffit d’attendre que l’interdiction se termine et de continuer à deviner le mot de passe. Le bantime pourrait être prolongé, mais cela pose des problèmes pour les utilisateurs légitimes, qui peuvent mal saisir leur mot de passe et ne peuvent alors pas accéder à leur compte jusqu’à ce que le bantime se termine. Il existe une prison pour les récidivistes appelée recidive. Elle fonctionne en recherchant des interdictions répétées pour une IP dans le journal de fail2ban, puis en interdisant pendant longtemps, par exemple une semaine.
Le listing suivant provient du rapport logwatch :
--------------------- pam_unix Begin ------------------------
sshd:
Échecs d'authentification :
inconnu (212.70.149.150): 59 foisRechercher cette IP dans le fichier journal montre :
2024-02-21 03:42:39,121 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:42:38
2024-02-21 03:42:39,508 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 03:52:38,386 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 03:54:33,560 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:33
2024-02-21 03:54:35,364 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 03:54:35
2024-02-21 04:00:37,017 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:36
2024-02-21 04:00:39,021 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:00:38
2024-02-21 04:06:43,036 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:42
2024-02-21 04:06:45,039 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:06:44
2024-02-21 04:06:45,426 fail2ban.actions [895]: NOTICE [sshd] Ban 212.70.149.150
2024-02-21 04:16:44,302 fail2ban.actions [895]: NOTICE [sshd] Unban 212.70.149.150
2024-02-21 04:19:04,868 fail2ban.filter [895]: INFO [sshd] Found 212.70.149.150 - 2024-02-21 04:19:04Fail2ban fonctionne comme prévu, trouvant les connexions incorrectes et émettant une interdiction pendant 10 minutes. Pendant cette interdiction, l’intrus est empêché d’accéder à cet hôte, mais continue après la levée de l’interdiction. Cela semble être le cas d’une tentative sérieuse de pénétration. Le remède consiste à activer la prison recidive avec un maxretry bas et un bantime long.
J’aime utiliser une courte interdiction initiale, disons 10 minutes. Si un véritable utilisateur a été banni, il suffit d’attendre ce temps, espérant utiliser ce temps pour trouver quel est le bon mot de passe et ensuite réessayer. Ceux qui sont à nouveau bannis le même jour, se voient interdire pendant une semaine. Les valeurs par défaut de la prison recidive peuvent être trouvées dans le fichier jail.conf, il y a un bantime d’une semaine et un findtime d’un jour, ceux-ci me semblent corrects. Mais je fixe maxretry à 2, les contrevenants sont bannis plus rapidement. J’ai ajouté au fichier jail.local :
[recidive]
enabled = true
maxretry = 2
Des interdictions de plus d’une semaine ne valent pas la peine, à mon avis. Finalement, l’ancienne adresse IP est bannie ou mise sur liste noire partout, donc l’intrus obtient une nouvelle IP. L’ancienne IP est donnée à un nouvel utilisateur Internet innocent, qui ne devrait pas être puni pour les mauvaises actions de l’ancien propriétaire de cette IP.
Dépannage
Après le démarrage du système d’exploitation ou le redémarrage de fail2ban, l’état est restauré, donc les interdictions continuent jusqu’à ce que le bantime s’écoule. Ainsi, les tests et le dépannage peuvent impliquer des redémarrages.
Pour tester la configuration, il existe une option de test :
fail2ban-server --testPour savoir si une IP est bannie, les versions récentes de fail2ban peuvent faire
# fail2ban-client banned 43.131.9.186
[['recidive']]La commande montre la liste des prisons où l’IP donnée est actuellement bannie.
Les anciennes versions de fail2ban n’ont pas cette commande. Tester chaque prison une par une peut se faire comme ceci :
# fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232
43.163.219.232Si la sortie montre l’IP, alors elle était dans la liste des numéros IP bannis. La commande tr est là pour casser la liste des numéros IP bannis (c’est une longue ligne) en un IP par ligne.
Pour voir ce qui s’est passé avec une IP donnée, recherchez-la dans fail2ban.log :
root@posti:/etc/mysql# grep 43.131.9.186 /var/log/fail2ban.log | cut --characters=-80
2024-03-06 09:00:40,295 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:53,954 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:02:55,958 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:34,193 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,195 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:04:36,388 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:04:36,626 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:14:35,180 fail2ban.actions [3574846]: NOTICE [sshd] Unban
2024-03-06 09:15:10,073 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:55,919 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:16:58,522 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:18:44,972 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,018 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:20:30,499 fail2ban.actions [3574846]: NOTICE [sshd] Ban 43
2024-03-06 09:20:30,620 fail2ban.filter [3574846]: INFO [recidive] Fo
2024-03-06 09:20:30,899 fail2ban.actions [3574846]: NOTICE [recidive] Ba
2024-03-06 09:20:32,021 fail2ban.filter [3574846]: INFO [sshd] Found
2024-03-06 09:30:29,289 fail2ban.actions [3574846]: NOTICE [sshd] UnbanLe déversement détaillé de la configuration de fail2ban montre les paramètres à examiner :
# fail2ban-client -vvv -dMise sur liste blanche de ses propres adresses IP
Peut-être que vos propres hôtes sont bannis ou vous voulez vous assurer que certains hôtes étrangers ne soient jamais bannis même s’ils se comportent mal. Ces numéros IP peuvent être mis sur liste blanche. Par défaut, rien n’est mis sur liste blanche, vous pouvez vérifier cela avec :
root@posti:~# fail2ban-client get sshd ignoreip
No IP address/network is ignored
root@posti:~Le paramètre ignoreip pourrait être défini dans chaque section de prison, mais ce paramètre devrait affecter toutes les prisons, donc il est préférable de le définir dans la section DEFAULT. Il pourrait être préférable de définir l’ignore sur le sous-réseau interne, afin que tous vos propres hôtes évitent les interdictions. Cela provient du début de jail.local :
[DEFAULT]
ignoreip = 92.237.123.96/27La section par défaut peut avoir d’autres paramètres qui affectent toutes les prisons. Par exemple, findtime = 10h pourrait y être ajouté.
Interdiction manuelle
Pour tester ce qui se passe lors d’une interdiction, définissez une interdiction manuellement. Testez d’abord avec une prison avec un bantime court, afin de revenir éventuellement si vous vous interdisez par erreur. Par exemple
# fail2ban-client set sshd banip 8.8.4.4>Si une IP se comporte mal mais que vous ne pouvez pas faire en sorte que fail2ban la détecte et émette des interdictions, définir une interdiction manuelle dans la prison recidive se débarrasse de cette IP pendant une semaine.
# fail2ban-client set recidive banip 8.8.4.4Interdire un sous-réseau fonctionne en utilisant la notation CIDR :
fail2ban-client set recidive banip 5.188.87.0/24Levée d’interdiction manuelle
Supprimer une interdiction est possible, mais considérez que si le mauvais comportement continue, l’IP va être à nouveau bannie. Donc, vous devriez découvrir ce qui se passe (en lisant les journaux, par exemple) et corriger le mauvais comportement.
# fail2ban-client set recidive unbanip 8.8.4.4L’IP peut être bannie dans plusieurs prisons. Pour lever une interdiction sur une IP dans toutes les prisons, utilisez
# fail2ban-client unban 8.8.4.4Je n’ai cependant que rarement besoin de faire cela. J’ai un bantime de 10 minutes, sauf que la prison recidive a 1 semaine, donc je ne lève l’interdiction que dans la prison recidive, les autres prisons ont déjà expiré. Si vous n’utilisez pas la prison recidive, l’IP peut être bannie dans plusieurs prisons en même temps, donc cela est utile.
Pour lever l’interdiction de toutes les adresses IP de toutes les prisons, faites
fail2ban-client unban --allConclusion
Fail2ban rend plus difficile la devinette de mots de passe mais ne prévient pas complètement les crackers d’essayer d’accéder à l’hôte. Pour SSH, forcer l’utilisation de clés SSH offre plus de protection en empêchant la connexion avec un mot de passe. Pour d’autres services, l’authentification multi-facteurs empêche la connexion si seul le mot de passe est connu.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.