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

I was hoping Discourse could log invalid login attempts to file, even if it is something you have to configure to do so. Then I could create a custom filter and jail for discourse

I use a centralized fail2ban server. the way it works is all my Containers, Docker images, VMs have a custom ban action:

in fail2ban you specify the action to take in your jail, such as:
action = iptables-allports

then all you have to do is edit that action:
sudo nano /etc/fail2ban/action.d/iptables-allports.conf

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

With this setup your container/docker/vm will fail2ban them locally, but it will also relay this information to your central fail2ban server. The central server can also take all collected IPs and make them available as txt banlist such as: https://fail2ban.YourDomain.com/banned.txt

Then you can have your pfsense firewall subscribe to this banlist, and you can even share the list with other pfsense routers. This way if they try breaking in on one application, they get banned from everything. This has worked great for me for years.

And all that I need to implement this for discourse is for discourse to write an entry to a log file when there is an invalid login attempt :slight_smile:

1 « J'aime »

did you figure out how to hook or log this?

Thanks

1 « J'aime »

Bump. This seems like a very good idea!

Where does Discourse store and show logs?

The NGINX logs
Occasionally NGINX logs may contain some extra tips, they are located at:

cd /var/discourse
./launcher enter app
cd /var/log/nginx
The files access.log and error.log will be there as well as a bunch of rotated compressed files. Running less access.log.2.gz will automatically decompress and display the logfile for you.

This directory is also available on the host at /var/discourse/shared/standalone/log/var-log/nginx .

Unfortunately, the nginx error.log and access.log files do not log any invalid login attempts.

Can anyone suggest another avenue?

Thank you.

1 « J'aime »

Agree. It would be great to hook into a fail2ban kind of automated exponential backoff.

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.