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

Eu esperava que o Discourse pudesse registrar tentativas de login inválidas em um arquivo, mesmo que fosse algo que você precisasse configurar para fazer. Assim, eu poderia criar um filtro e um jail personalizados para o Discourse.

Eu uso um servidor fail2ban centralizado. O funcionamento é o seguinte: todos os meus Containers, imagens Docker e VMs têm uma ação de banimento personalizada:

No fail2ban, você especifica a ação a ser tomada no seu jail, por exemplo:
action = iptables-allports

Depois, tudo o que você precisa fazer é editar essa ação:
sudo nano /etc/fail2ban/action.d/iptables-allports.conf

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

Com essa configuração, seu container/docker/VM aplicará o fail2ban localmente, mas também repassará essas informações para o seu servidor fail2ban central. O servidor central também pode pegar todos os IPs coletados e disponibilizá-los como uma lista de banimento em texto, por exemplo: https://fail2ban.SuaDominio.com/banned.txt

Daí, você pode fazer com que seu firewall pfSense assine essa lista de banimento, e até mesmo compartilhar a lista com outros roteadores pfSense. Assim, se alguém tentar invadir um aplicativo, será banido de tudo. Isso funcionou muito bem para mim há anos.

E tudo o que preciso para implementar isso no Discourse é que o Discourse escreva uma entrada em um arquivo de log quando houver uma tentativa de login inválida :slight_smile:

1 curtida

Você descobriu como interceptar ou registrar isso?

Obrigado

1 curtida

Bump. Isso parece ser uma ideia muito boa!

Onde o Discourse armazena e exibe os logs?

Os logs do NGINX
Ocasionalmente, os logs do NGINX podem conter algumas dicas extras, eles estão localizados em:

cd /var/discourse
./launcher enter app
cd /var/log/nginx
Os arquivos access.log e error.log estarão lá, assim como vários arquivos rotacionados e compactados. Executar less access.log.2.gz irá automaticamente descompactar e exibir o arquivo de log para você.

Este diretório também está disponível no host em /var/discourse/shared/standalone/log/var-log/nginx.

Infelizmente, os arquivos nginx error.log e access.log não registram nenhuma tentativa de login inválida.

Alguém pode sugerir outra alternativa?

Obrigado.

1 curtida

Concordo. Seria ótimo integrar um mecanismo de backoff exponencial automatizado, como o fail2ban.

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.