Installer et utiliser Fail2ban sur Debian 12
Installer et utiliser Fail2ban sur Debian 12
Sur cette page
- Comment cela fonctionne
Configurer Fail2ban
- Activer une prison
- Suivez les journaux
- Dépannage
- Mise sur liste blanche des adresses IP propres
- Interdiction manuelle
- Débloquer manuellement
- Conclusion
Fail2ban surveille les fichiers journaux pour les échecs de connexion et interdit temporairement l'adresse IP source sujette à des échecs d'accès à l'hôte. C'est une défense contre les attaques par force brute visant à deviner les mots de passe. Il est très utile d'avoir fail2ban sur les 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 fonctionne.
root@posti:/etc/fail2ban# fail2ban-client ping
Server replied: pong
root@posti:/etc/fail2ban#Comment cela 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 le bannissement et le débanissement se produisent.
Les tentatives d'intrusion déclenchent une interdiction si, pendant le temps de recherche, au moins un nombre maximum d'échecs de connexion est détecté depuis le même numéro IP. Ensuite, l'IP est bannie pendant un certain nombre de secondes. Après que l'interdiction ait été en vigueur pendant ce temps, celle-ci 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/.
Configurer 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 simplement que les connexions ssh soient surveillées et que les intrus indésirables soient bannis, 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'autoinstallateur ISPConfig installe rsyslog et le tutoriel du serveur parfait ISPConfig recommande d'installer rsyslog.
Avec rsyslog, les fichiers journaux apparaissent dans le répertoire /var/log/, ce qui permet à la configuration par défaut de fail2ban de trouver les fichiers journaux. Si rsyslog n'est pas installé, la configuration de fail2ban doit être modifiée afin qu'elle lise les journaux du journal systemd. Ajoutez à la section par défaut de jail.local backend=systemd, comme ceci.
[DEFAULT]
backend = systemdActiver une prison
La documentation recommande de mettre toutes vos 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 [Lisez le fichier /usr/share/doc/fail2ban/README.Debian.gz].
À titre d'exemple, l'activation de jail pure-ftpd se fait en ajoutant dans le 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.
Une fois les modifications terminées, 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# Étant donné que jail.local n'a que le paramètre "enabled" pour cette jail, 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 est inutile. Si nécessaire, la section jail.local pour cette jail peut contenir des paramètres qui remplacent ceux qui ont été définis dans les fichiers .conf.
Cet exemple modifie findtime, maxretry et bantime pour la prison pure-ftpd :
[pure-ftpd]
enabled = true
findtime = 2h
maxretry = 6
bantime = 1dLe client Fail2ban affiche les temps en secondes, mais les temps peuvent être saisis dans les fichiers de configuration dans un format plus facile, par exemple 10h au lieu de 36000 secondes. Le man jail.conf dans le chapitre "FORMAT D'ABRÉVIATION DU TEMPS" explique les formats de saisie de temps conviviaux.
fail2ban-client a l'option de convertir le format de temps convivial en secondes.
fail2ban-client --str2sec 1d3h7m
97620Suivez les journaux
Pour déterminer quelles prisons doivent être activées, suivez les journaux créés par les services s'exécutant 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 s'exécutant 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 celles-ci :
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 par e-mail, et un autre cas similaire. Fail2ban aurait dû empêcher autant de tentatives. Pour comprendre pourquoi cela ne s'est pas produit, 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 de se connecter toutes les 10 minutes environ, et le verrou fail2ban postfix-sasl le détecte.
Il est bon de vérifier si cette IP appartient peut-être à un utilisateur légitime de l'hôte, qui a simplement un ancien mot de passe sur son smartphone ou un autre appareil essayant de se connecter à intervalles réguliers. J'utilise geoiplookup, qui montre de quel pays provient l'IP. Mes utilisateurs viennent de mon pays, donc les utilisateurs étrangers ont tendance à être des acteurs malveillants. geoiplookup provient des paquets Debian geoip-database et geoip-bin.
geoiplookup 91.224.92.40
GeoIP Country Edition: LT, Lithuania
Pour comprendre pourquoi l'IP n'a pas été banni, examinez le temps de recherche 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 observé ces attaques lentes, le coupable sait que le temps de recherche 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 bannissements, augmentez le temps de recherche pour la prison, par exemple à 10 heures. Ajoutez au fichier jail.local dans la section [postfix-sasl]:
findtime = 10h
Alors après avoir rechargé fail2ban avec systemctl, la prison a un temps de recherche plus long :
root@posti:/etc/fail2ban# fail2ban-client get postfix-sasl findtime
36000
root@posti:/etc/fail2ban#
Une autre façon dont les intrus essaient de pénétrer est d'être persistants. Même si un intrus est banni, il suffit d'attendre la fin du bannissement et de continuer à deviner le mot de passe. La durée du bannissement pourrait être prolongée, mais cela pose des problèmes pour les utilisateurs légitimes, qui peuvent se tromper en saisissant leur mot de passe et ne peuvent alors pas accéder à leur compte tant que la durée du bannissement n'est pas écoulée. Il existe une prison pour les récidivistes appelée récidive. Cela fonctionne en recherchant des interdictions répétées pour une adresse IP dans le journal de fail2ban, puis en interdisant pendant longtemps, par exemple une semaine.
La liste suivante provient du rapport logwatch :
--------------------- pam_unix Begin ------------------------
sshd:
Authentication Failures:
unknown (212.70.149.150): 59 Time(s)La recherche de cet 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:04
Fail2ban fonctionne comme prévu, détectant les mauvaises connexions et émettant une interdiction de 10 minutes. Pendant cette interdiction, l'infracteur est empêché d'accéder à cet hôte, mais il peut continuer après que l'interdiction a pris fin. Cela semble être le cas d'une tentative sérieuse de violation. La solution est d'activer la prison de récidive avec un faible nombre de tentatives maximum et une durée d'interdiction longue.
J'aime utiliser un court délai d'interdiction initial, disons 10 minutes. Si un véritable utilisateur est banni, il attend simplement ce temps, espérant profiter de ce temps pour trouver quel est le bon mot de passe et essayer à nouveau. Ceux qui se font bannir à nouveau le même jour sont bannis pour une semaine. Les valeurs par défaut de la prison de récidive peuvent être trouvées dans le fichier jail.conf, il y a un temps d'interdiction de 1 semaine et un temps de recherche de 1 jour, cela me semble correct. Mais j'ai fixé maxretry à 2, les délinquants sont bannis plus rapidement. J'ai ajouté au fichier jail.local :
[recidive]
enabled = true
maxretry = 2
À mon avis, des interdictions de plus d'une semaine ne valent pas la peine. Finalement, l'ancienne adresse IP est bannie ou mise sur liste noire partout, donc l'infracteur obtient une nouvelle adresse IP. L'ancienne adresse IP est attribuée à un nouvel utilisateur innocent d'Internet, qui ne devrait pas être puni pour les mauvaises actions de l'ancien propriétaire de cette adresse 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 se poursuivent jusqu'à l'expiration du temps d'interdiction. Ainsi, le test 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 adresse IP est bannie, les versions récentes de fail2ban peuvent le faire.
fail2ban-client banned 43.131.9.186
[['recidive']]La commande affiche la liste des prisons où l'adresse 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 de cette manière :
fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232
43.163.219.232Si la sortie montre l'adresse IP, alors elle figurait dans la liste des adresses IP bannies. La commande tr est utilisée pour séparer la liste des adresses IP bannies (qui est une seule ligne longue) en une IP par ligne.
Pour voir ce qui se passe avec une adresse IP donnée, consultez 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] Unban
Un déchargement détaillé de la configuration de fail2ban montre les paramètres à examiner :
fail2ban-client -vvv -dMise en liste blanche de ses propres adresses IP
Peut-être que vos propres hôtes se font bannir 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 ajoutés à la liste blanche. Par défaut, rien n'est 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 peut être défini dans chaque section des prisons, mais ce paramètre devrait affecter toutes les prisons, donc il est préférable de le définir dans la section DEFAULT. Il serait peut-être préférable de définir ignore pour le sous-réseau interne, afin que tous vos propres hôtes évitent les interdictions. Ceci provient du début de jail.local :
[DEFAULT]
ignoreip = 92.237.123.96/27
La 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 lorsqu'on interdit, définissez l'interdiction manuellement. Testez d'abord avec une prison avec un temps d'interdiction court, afin de pouvoir revenir éventuellement si vous vous interdisez par erreur. Par exemple
fail2ban-client set sshd banip 8.8.4.4</>Si un certain IP se comporte mal mais que vous ne pouvez pas faire détecter cela par fail2ban et émettre des interdictions, régler une interdiction manuelle dans la prison des récidivistes se débarrasse de cet 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/24Débloquer manuellement
La levée d'un bannissement est possible, mais il faut considérer que si le mauvais comportement continue, l'adresse IP sera de nouveau bannie. Vous devriez donc 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 débannir 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 temps de ban de 10 minutes, sauf que la prison pour récidivistes a une durée de 1 semaine, donc je ne débannirai l'IP que de la prison pour récidivistes, les autres prisons ont déjà expiré. Si vous n'utilisez pas la prison pour récidivistes, l'IP peut être bannie dans plusieurs prisons en même temps, donc c'est utile.
Pour débloquer toutes les adresses IP de toutes les prisons, faites
fail2ban-client unban --allConclusion
Fail2ban rend la devinette des mots de passe plus difficile mais ne prévient pas complètement les pirates de tenter 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 seulement le mot de passe est connu.