Recherche de site Web

Installation et utilisation de Fail2ban sur Debian 12


Sur cette page

  1. Comment ça marche
  2. Configuration de Fail2ban

    1. Permettre une prison
    2. Suivez les journaux
    3. Dépannage
    4. Mettre sur liste blanche vos propres adresses IP
    5. Interdire manuellement
    6. Annuler le bannissement manuellement
    7. Conclusion

Fail2ban surveille les fichiers journaux pour détecter les échecs de connexion et interdit temporairement à l'adresse IP source sujette aux échecs d'accéder à l'hôte. Il s’agit d’une défense contre les attaques par force brute consistant à deviner le mot 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 la 1.0.2.

root@posti:~# fail2ban-client version
1.0.2

Pour voir si fail2ban est actuellement en cours d'exécution, 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 marche

Fail2ban collecte les fichiers de filtrage, d'action et surveillés dans une prison. Plusieurs prisons accompagnent la distribution. Il faut leur permettre de commencer à travailler. Le filtre spécifie comment détecter les échecs d'authentification. l'action définit la manière dont l'interdiction et la levée de l'interdiction se produisent.

Les tentatives d'intrusion déclenchent l'interdiction si, pendant la recherche, au moins des échecs de connexion maxretry sont détectés à partir du même numéro IP. Ensuite, l'adresse IP est interdite pendant quelques secondes. Après que l'interdiction ait été en vigueur pendant quelques secondes, l'interdiction est levée et l'adresse 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 qui fonctionne par défaut. Les autres prisons doivent être activées par l'administrateur système.

Ainsi, si vous souhaitez uniquement surveiller les connexions SSH et interdire les intrus mal conduits, 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 facultatif, ce qui signifie qu'il ne peut pas être installé, les journaux sont donc collectés uniquement dans journald [wiki.debian.org/Rsyslog].

Sur les systèmes ISPConfig, fail2ban fonctionne, puisque le programme d'installation automatique d'ISPConfig installe rsyslog et que le didacticiel du serveur ISPConfig Perfect demande 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 fail2ban doit être modifiée pour qu'elle lise les journaux du journal systemd. Ajouter à la section par défaut de jail.local backend=systemd, comme ceci

[DEFAULT]
backend = systemd

Permettre une prison

La documentation recommande de mettre toutes ses propres modifications dans les fichiers .local. Cela évite les problèmes lorsque les fichiers fournis par la distribution sont mis à niveau ou modifiés par le responsable [Read file /usr/share/doc/fail2ban/README.Debian.gz].

A titre d'exemple, l'activation du jail 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 des paramètres de cette prison.

Une fois les modifications terminées, forcez la relecture des fichiers de configuration avec la commande

systemctl reload fail2ban

La 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 « activé » pour cette prison, tous les autres paramètres sont les paramètres par défaut de la distribution. Ils ont généralement de bonnes valeurs, une configuration supplémentaire n'est donc pas nécessaire. Si nécessaire, la section jail.local de cette prison peut contenir des paramètres qui remplacent ceux 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 = 1d

Le client Fail2ban 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 36 000 secondes. man jail.conf dans le chapitre "FORMAT D'ABRÉVIATION DE L'HEURE" explique les formats de saisie de l'heure conviviaux.

fail2ban-client a la possibilité de convertir le format d'heure convivial en secondes.

# fail2ban-client --str2sec 1d3h7m
97620

Suivez 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. La lecture des journaux bruts prend du temps et est fastidieuse.

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 de l’examiner. Par exemple, pflogsumm a envoyé un résumé par e-mail contenant les lignes suivantes :

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 lors de la connexion au courrier électronique et dans un autre cas similaire. Fail2ban aurait dû empêcher autant de tentatives. Pour voir pourquoi cela ne s'est pas produit, examinez le journal 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 adresse IP essaie de se connecter à des intervalles d'environ 10 minutes, et fail2ban jail postfix-sasl la détecte.

C'est une bonne idée de savoir si cette adresse IP appartient peut-être à un utilisateur légitime de l'hôte, qui possède simplement un ancien mot de passe sur son smartphone ou sur un autre appareil essayant de se connecter à intervalles réguliers. J'utilise geoiplookup, il montre de quel pays provient l'adresse IP. Mes utilisateurs viennent de mon pays, donc les utilisateurs étrangers ont tendance à être de mauvais acteurs. geoiplookup provient des packages Debian geoip-database et geoip-bin.

$ geoiplookup 91.224.92.40
GeoIP Country Edition: LT, Lithuania

Pour savoir pourquoi la propriété intellectuelle n'a pas été interdite, examinez l'heure 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 vu ces attaques lentes, l'auteur sait que le temps de recherche est de 10 minutes et essaie donc d'éviter d'être banni en essayant de se connecter à des intervalles plus longs. Cela a fonctionné dans ce cas. Pour que les échecs de connexion entraînent des interdictions, augmentez le temps de recherche pour la prison, par exemple à 10 heures. Ajoutez au fichier jail.local dans la section [postfix-sasl] :

findtime = 10h

Ensuite, après systemctl reload fail2ban, 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 pour les intrus de tenter de s’introduire est de persister. Même si l'intrus est banni, attendez simplement la fin de l'interdiction et continuez à deviner le mot de passe. Le bantime pourrait être prolongé, mais cela poserait des problèmes aux utilisateurs légitimes, qui pourraient mal saisir leur mot de passe et ne pourraient alors pas accéder à leur compte avant la fin du bantime. Il existe une prison pour les récidivistes appelés récidivistes. Cela fonctionne en recherchant des interdictions répétées pour une adresse IP dans le journal fail2ban, puis en les bannissant pendant une longue période, 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 cette adresse IP dans le fichier journal affiche :

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, trouvant les mauvaises connexions et émettant une interdiction pendant 10 minutes. Pendant cette interdiction, le contrevenant ne peut pas 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 d'effraction. Le remède est de permettre une prison pour récidive avec un faible nombre de tentatives maximales et une longue durée d'interdiction.

J'aime utiliser une interdiction initiale courte, disons 10 minutes. Si un utilisateur réel est banni, il attend simplement ce moment, en espérant utiliser ce temps pour trouver le mot de passe correct, puis réessayer. Ceux qui sont à nouveau bannis le même jour sont bannis pendant une semaine. Les valeurs par défaut de la prison récidivante peuvent être trouvées dans le fichier jail.conf, il y a un bantime de 1 semaine et un findtime de 1 jour, cela me semble OK. Mais j'ai mis maxretry à 2, les contrevenants 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 n’en valent pas la peine. Finalement, l’ancienne adresse IP est bannie ou mise sur liste noire partout, de sorte que le contrevenant obtient une nouvelle adresse IP. L’ancienne adresse IP est donnée à un nouvel utilisateur Internet innocent, qui ne devrait pas être puni pour les mauvaises choses dont l’ancien propriétaire de cette adresse IP est coupable.

Dépannage

Après le démarrage du système d'exploitation ou le redémarrage, l'état fail2ban est restauré, les interdictions continuent donc jusqu'à ce que le temps d'interdiction soit écoulé. Ainsi, les tests et le dépannage peuvent impliquer des redémarrages.

Pour tester la configuration, il existe une option de test :

fail2ban-server --test

Pour savoir si une 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ù une adresse IP donnée est actuellement interdite.

Les anciennes versions de fail2ban n'ont pas cette commande. Tester chaque prison une par une peut être effectué comme ceci :

# fail2ban-client status recidive | tr " " "\n" | grep 43.163.219.232
43.163.219.232

Si la sortie affiche l’adresse IP, cela signifie qu’elle figurait dans la liste des numéros IP interdits. La commande tr est là pour diviser la liste des numéros IP interdits (c'est une longue ligne) à une IP par ligne.

Pour voir ce qui s'est passé avec une adresse 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] Unban

Le dump détaillé de la configuration fail2ban affiche les paramètres à examiner :

# fail2ban-client -vvv -d

Mettre sur liste blanche vos propres adresses IP

Peut-être que vos propres hôtes sont bannis ou que 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 le vérifier 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 jails, mais ce paramètre devrait affecter toutes les prisons, il est donc préférable de le définir dans la section DEFAULT. Il serait peut-être préférable de définir Ignorer sur le sous-réseau interne, afin que tous vos propres hôtes évitent les interdictions. Cela date 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é.

Interdire manuellement

Pour tester ce qui se passe lors d'une interdiction, définissez l'interdiction manuellement. Testez d'abord avec une prison avec une période d'interdiction courte, afin de revenir éventuellement si vous vous bannissez par erreur. Par exemple

# fail2ban-client set sshd banip 8.8.4.4</>

Si une adresse IP se comporte mal mais que vous ne pouvez pas faire en sorte que fail2ban la détecte et émette des interdictions, la définition d'une interdiction manuelle dans une prison récidivante supprime cette adresse IP pendant une semaine.

# fail2ban-client set recidive banip 8.8.4.4

L'interdiction d'un sous-réseau fonctionne en utilisant la notation CIDR :

fail2ban-client set recidive banip 5.188.87.0/24

Annuler le bannissement manuellement

La suppression d'une interdiction est possible, mais considérez que si le mauvais comportement persiste, l'adresse IP sera à nouveau interdite. 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.4

L'IP peut être interdit dans plusieurs prisons. Pour débloquer une adresse IP dans toutes les prisons, utilisez

# fail2ban-client unban 8.8.4.4

Cependant, j'ai rarement besoin de le faire. J'ai un bantime de 10 minutes, sauf que la prison pour récidive dure 1 semaine, donc je ne me retire que de la prison pour récidive, les autres prisons ont déjà expiré. Si vous n'utilisez pas la prison récidiviste, la propriété intellectuelle peut être interdite dans plusieurs prisons en même temps, ce qui est donc utile.

Pour débannir toutes les adresses IP de toutes les prisons, faites-le

fail2ban-client unban --all

Conclusion

Fail2ban rend la lecture des mots de passe plus difficile mais n'empêche pas complètement les pirates 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 multifacteur empêche la connexion si seul le mot de passe est connu.

Articles connexes: