Enregistrer les tentatives de connexion invalides pour Fail2ban et l'action du serveur en amont

J’espérais que Discourse puisse enregistrer les tentatives de connexion invalides dans un fichier, même si cela nécessite une configuration spécifique. Ensuite, je pourrais créer un filtre et un jail personnalisés pour Discourse.

J’utilise un serveur fail2ban centralisé. Le principe est que tous mes conteneurs, images Docker et machines virtuelles disposent d’une action d’interdiction personnalisée :

Dans fail2ban, vous spécifiez l’action à exécuter dans votre jail, par exemple :
action = iptables-allports

Ensuite, il suffit de modifier cette action :
sudo nano /etc/fail2ban/action.d/iptables-allports.conf

actionban = <iplables> -I f2b-<name> 1 -s <ip> -j <blocktype>
      curl -s "https://fail2ban.VotreDomaine.com:35553/fail2ban.php?token=D2f3Ydy45f6y5FRTfyeFrtYErt&action=add&source=TEST_HOST&reason=TEST_FILTER&ip=111.222.333.444"

Avec cette configuration, votre conteneur/Docker/VM effectuera l’interdiction localement via fail2ban, mais transmettra également ces informations à votre serveur fail2ban central. Le serveur central peut également rassembler toutes les adresses IP collectées et les rendre disponibles sous forme de liste d’interdiction au format texte, par exemple : https://fail2ban.VotreDomaine.com/banned.txt

Ensuite, vous pouvez configurer votre pare-feu pfSense pour s’abonner à cette liste d’interdiction, et vous pouvez même partager cette liste avec d’autres routeurs pfSense. Ainsi, si une entité tente de s’infiltrer dans une application, elle sera bannie de toutes les autres. Cette méthode fonctionne parfaitement pour moi depuis des années.

Et tout ce dont j’ai besoin pour mettre cela en œuvre avec Discourse, c’est que Discourse écrive une entrée dans un fichier journal lorsqu’une tentative de connexion invalide se produit :slight_smile:

1 « J'aime »

As-tu trouvé comment intercepter ou journaliser cela ?

Merci

1 « J'aime »

Bump. Cela semble être une excellente idée !

Où Discourse stocke-t-il et affiche-t-il les journaux ?

Les journaux NGINX
Occasionnellement, les journaux NGINX peuvent contenir quelques conseils supplémentaires. Ils se trouvent à l’adresse suivante :

cd /var/discourse
./launcher enter app
cd /var/log/nginx
Les fichiers access.log et error.log s’y trouvent, ainsi qu’un ensemble de fichiers compressés rotatifs. Exécuter la commande less access.log.2.gz décompresse et affiche automatiquement le fichier journal pour vous.

Ce répertoire est également accessible sur l’hôte à l’adresse /var/discourse/shared/standalone/log/var-log/nginx.

Malheureusement, les fichiers error.log et access.log de nginx n’enregistrent aucune tentative de connexion invalide.

Quelqu’un peut-il suggérer une autre piste ?

Merci.

1 « J'aime »

D’accord. Ce serait formidable de pouvoir s’intégrer à un mécanisme de réessai exponentiel automatisé, du type fail2ban.

1 « J'aime »

curieux - cette demande de fonctionnalité est-elle déjà suivie ou planifiée ? Ce serait une bonne fonctionnalité de sécurité.

enregistrer (ou accrocher pour) les tentatives de connexion échouées par adresse IP

Merci !

1 « J'aime »

Le fichier nginx access.log devrait contenir des lignes avec des réponses 403 à la route de connexion dont vous avez besoin. Avez-vous vérifié les journaux ?

1 « J'aime »

ahhh, merci ! Je me demande comment y accéder depuis l’extérieur de l’image/du conteneur Docker

Bonjour @Falco, merci pour votre réponse. J’ai vérifié les journaux immédiatement, une tentative de mot de passe correct et une tentative de mot de passe incorrect me semblent identiques (réponse 200) :

(J’ai assaini l’adresse IP et le domaine, le reste est intact)

mauvais mot de passe :

[20/Dec/2021:08:07:31 -0800] "community.example.com" 10.111.222.33 "GET /session/csrf HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/csrf" 200 1185 "https://community.example.com/" 0.016 0.017 "-"
[20/Dec/2021:08:07:32 -0800] "community.example.com" 10.111.222.33 "POST /session HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/create" 200 1111 "https://community.example.com/" 0.552 0.550 "-"

bon mot de passe :

[20/Dec/2021:08:24:50 -0800] "community.example.com" 10.111.222.33 "GET /session/csrf HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/csrf" 200 1185 "https://community.example.com/" 0.020 0.020 "-"
[20/Dec/2021:08:24:51 -0800] "community.example.com" 10.111.222.33 "POST /session HTTP/1.1" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0" "session/create" 200 2251 "https://community.example.com/" 1.216 1.216 "-"

Donc, puisqu’ils renvoient tous les deux une réponse 200, vous ne pouvez pas l’utiliser pour fail2ban, vous bannirez tous les utilisateurs, qu’ils aient un bon ou un mauvais mot de passe.

2 « J'aime »

Twitter utilise 400 pour un mot de passe incorrect, mais Facebook, LinkedIn, Google et Amazon renvoient un 200. À mon avis, un 200 semble faux, mais il semble que ce soit la chose « normale » ?

Peut-être pourriez-vous commencer par un plugin qui s’accroche à cette méthode ici :

Et fait ce dont vous avez besoin ?

3 « J'aime »

Génial, merci pour votre réponse ! Dès que j’aurai un peu de temps libre, j’essaierai de créer un plugin pour générer ces informations ! (tout ce dont j’ai besoin, c’est que l’adresse IP soit enregistrée dans un fichier lorsque quelqu’un tente de se connecter avec un mot de passe incorrect, par exemple : tentative de connexion invalide depuis l'IP 10.111.222.33)

3 « J'aime »

Merci ! J’espère pouvoir utiliser ce plugin ; faites-moi savoir si vous pouvez le rendre disponible.

Avez-vous déjà réussi à faire fonctionner cela ? Je suis très intéressé à utiliser fail2ban avec mon instance discourse également.

J’écris sur les rôles de webmaster autodidacte et d’utilisateur final pur, mais…

Une connexion invalide est une erreur 200 par définition. Bien sûr, cela peut et devrait être une erreur interne d’une application, et à un moment donné, générer autre chose, comme une erreur 403 plus quelque chose comme l’envoi d’un lien de récupération, mais cela ne devrait pas ou ne peut pas se produire immédiatement.

Fail2ban est un bon outil mais vraiment surestimé. Oublions Docker, car cela rend tout plus difficile, mais le simple fait qu’il puisse contourner iptables de VPS est vraiment une chose brumeuse pour moi. Mais les bots ont tendance à changer d’IP après chaque 3ème tentative, ce qui rend Fail2ban assez inefficace contre les attaques par force brute via la connexion.

Les script kiddies sont une autre histoire, bien sûr. Ils copient-collent tout ce qu’ils trouvent, font une tentative et ne jouent pas avec les adresses IP. Alors Fail2ban peut les arrêter, même s’ils peuvent rarement faire du mal, mais augmenter la charge. Le vrai problème est la quantité de script kiddies lorsqu’il y a un déluge instantané.

Mais tant que le VPS peut gérer une telle situation, cela n’a pas d’importance. Nous sommes en 2023 et la plupart de ces connards frappent les vulnérabilités anciennes de WordPress sur les sites Discourse :wink:

Mais nous devrions avoir une certaine logique pour arrêter les connexions constantes, même si ce n’est pas une menace quotidienne, je pense.