Registrar tentativas de login inválidas para Fail2ban e ação do servidor upstream

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 curtida

did you figure out how to hook or log this?

Thanks

1 curtida

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 curtida

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

1 curtida

curioso - este pedido de recurso está sendo rastreado ou planejado ainda? Seria um bom recurso de segurança.

registrar (ou hook para) tentativas de login falhadas por endereço IP

Obrigado!

1 curtida

O arquivo nginx access.log deve ter linhas com respostas 403 para a rota de login que você precisa para isso. Você verificou os logs?

1 curtida

ahhh, obrigado! Gostaria de saber como acessá-lo de fora da imagem/container do docker

Olá @Falco, obrigado pela resposta. Verifiquei os logs imediatamente, uma tentativa de senha correta e uma tentativa de senha incorreta parecem iguais para mim (resposta 200):

(Sanitizei o endereço IP e o domínio, o resto está intacto)

senha errada:

[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 "-"

senha correta:

[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 "-"

Portanto, como ambos retornam uma resposta 200, você não pode usar isso para fail2ban, você banirá todos os usuários com senha boa ou ruim.

2 curtidas

O Twitter usa 400 para senha errada, mas Facebook, LinkedIn, Google e Amazon retornam 200. Na minha opinião, um 200 soa errado, mas parece ser a coisa “normal”?

Talvez você possa começar com um plugin que se conecte a este método aqui

E faça o que você precisa?

3 curtidas

incrível, obrigado pela resposta! Assim que tiver um pouco de tempo livre, tentarei criar um plugin para gerar essas informações! (tudo que preciso é que o endereço IP seja registrado em um arquivo quando alguém tentar fazer login com uma senha incorreta, por exemplo: tentativa de login inválida do IP 10.111.222.33)

3 curtidas

Obrigado! Espero usar este plugin; me avise se você puder disponibilizá-lo.

Você conseguiu fazer isso funcionar? Estou muito interessado em usar o fail2ban com minha instância do Discourse também.

Estou escrevendo sobre os papéis de webmaster autodidata e usuário final puro, mas…

Login inválido é erro 200 por definição. Claro, pode e deve ser um erro interno de um aplicativo e, em algum momento, gerar algo mais, como erro 403 mais algo como enviar um link de recuperação, mas não deveria ou não pode acontecer imediatamente.

Fail2ban é uma ferramenta legal, mas realmente superestimada. Vamos esquecer o docker, porque ele torna tudo mais difícil, mas o simples fato de poder contornar o iptables do VPS é algo realmente confuso para mim. Mas os bots têm a tendência de mudar de IP após a cada 3ª tentativa e isso torna o Fail2ban bastante ineficaz contra ataques de força bruta puros via login.

Script kiddies são outra história, é claro. Eles copiam e colam tudo o que encontram, dão uma rodada e não mexem com IPs. Então o Fail2ban pode detê-los, mesmo que raramente possam fazer algum mal, mas aumentam a carga. O problema real é a quantidade de script kiddies quando há um fluxo instantâneo.

Mas, desde que o VPS possa lidar com tal situação, isso simplesmente não importa. Agora é 2023 e a maioria desses idiotas está explorando vulnerabilidades antigas do wordpress em sites de discourse :wink:

Mas deveríamos ter alguma lógica para parar logins constantes, mesmo que não seja uma ameaça diária, eu acho.