Registra tentativi di accesso non validi per Fail2ban e azione del server upstream

Speravo che Discourse potesse registrare i tentativi di accesso non validi su file, anche se ciò richiede una configurazione specifica. Potrei così creare un filtro e un jail personalizzati per Discourse.

Utilizzo un server fail2ban centralizzato. Il suo funzionamento prevede che tutti i miei container, immagini Docker e VM abbiano un’azione di blocco personalizzata:

in fail2ban si specifica l’azione da eseguire nel proprio jail, ad esempio:
action = iptables-allports

basta poi modificare quell’azione:
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"

Con questa configurazione, il tuo container/Docker/VM bloccherà gli aggressori localmente tramite fail2ban, ma inoltrerà anche queste informazioni al server fail2ban centralizzato. Il server centrale può raccogliere tutti gli indirizzi IP e renderli disponibili come elenco di blocco in formato txt, ad esempio: https://fail2ban.YourDomain.com/banned.txt

In questo modo, il tuo firewall pfSense può iscriversi a questo elenco di blocchi e puoi persino condividerlo con altri router pfSense. Così, se qualcuno tenta di infiltrarsi in una sola applicazione, viene bloccato da tutto. Questo sistema funziona benissimo per me da anni.

E tutto ciò che mi serve per implementare questa soluzione su Discourse è che Discourse scriva una voce in un file di log quando si verifica un tentativo di accesso non valido :slight_smile:

1 Mi Piace

Sei riuscito a capire come agganciare o registrare questo?

Grazie

1 Mi Piace

Rialzo. Questa sembra un’ottima idea!

Dove memorizza e mostra i log Discourse?

I log di NGINX
Occasionalmente i log di NGINX possono contenere alcuni suggerimenti aggiuntivi, si trovano in:

cd /var/discourse
./launcher enter app
cd /var/log/nginx

I file access.log e error.log saranno lì, insieme a una serie di file compressi ruotati. Eseguiendo less access.log.2.gz verrà automaticamente decompresso e visualizzato il file di log.

Questa directory è disponibile anche sull’host in /var/discourse/shared/standalone/log/var-log/nginx.

Purtroppo, i file nginx error.log e access.log non registrano tentativi di accesso non validi.

Qualcuno può suggerire un’altra strada?

Grazie.

1 Mi Piace

Concordo. Sarebbe ottimo integrare un meccanismo di backoff esponenziale automatizzato, simile a fail2ban.

1 Mi Piace

curioso - questa richiesta di funzionalità è già tracciata o pianificata? Sarebbe una buona funzionalità di sicurezza.

registra (o aggancia per) i tentativi di accesso falliti per indirizzo IP

Grazie!

1 Mi Piace

Il file nginx access.log dovrebbe avere righe con risposte 403 al percorso di login che ti servono per questo. Hai controllato i log?

1 Mi Piace

ahhh, grazie! Mi chiedo come accedervi dall’esterno dell’immagine/container Docker

Ciao @Falco grazie per la risposta. Ho controllato subito i log, un tentativo di password corretto e un tentativo di password errato mi sembrano uguali (risposta 200):

(Ho sanitizzato l’indirizzo IP e il dominio, il resto è invariato)

password errata:

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

password corretta:

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

quindi poiché restituiscono entrambi una risposta 200, non puoi usarlo per fail2ban, bannirai tutti gli utenti con password corretta o errata.

2 Mi Piace

Twitter usa 400 per password errata, ma Facebook, LinkedIn, Google e Amazon restituiscono un 200. Secondo me un 200 suona sbagliato, ma sembra essere la cosa “normale”?

Forse puoi iniziare con un plugin che si aggancia a questo metodo qui

E fa quello di cui hai bisogno?

3 Mi Piace

fantastico, grazie per la risposta! Appena avrò un po’ di tempo libero proverò a creare un plugin per generare queste informazioni! (tutto ciò di cui ho bisogno è l’indirizzo IP registrato su un file quando qualcuno tenta di accedere con una password errata, ad esempio: tentativo di accesso non valido dall'IP 10.111.222.33)

3 Mi Piace

Grazie! Spero di poter utilizzare questo plugin; fammi sapere se puoi renderlo disponibile.

Sei mai riuscito a farlo funzionare? Sono molto interessato a usare fail2ban con la mia istanza discourse.

Sto scrivendo sui ruoli di webmaster autodidatta e utente finale puro, ma…

Il login non valido è per definizione un errore 200. Certo, può e dovrebbe essere un errore interno di un’app e a un certo punto generare qualcos’altro, come un errore 403 più qualcos’altro come l’invio di un link di recupero, ma non dovrebbe o non può accadere subito.

Fail2ban è uno strumento carino ma davvero sopravvalutato. Dimentichiamo docker, perché rende tutto più difficile, ma il solo fatto che possa bypassare iptables di VPS è davvero una cosa fumosa per me. Ma i bot hanno la tendenza a cambiare IP dopo ogni terzo tentativo e questo rende Fail2ban piuttosto inefficace contro un attacco brute force puro tramite login.

Gli script kiddie sono un’altra storia, ovviamente. Copiano e incollano tutto ciò che trovano, danno una possibilità e non giocano con gli IP. Allora Fail2ban può fermarli, anche se raramente possono fare danni, ma aumentano il carico. Il vero problema è la quantità di script kiddie quando c’è un flood istantaneo.

Ma finché VPS può gestire tale situazione, semplicemente non ha importanza. Ora siamo nel 2023 e per lo più quei cazzoni stanno bussando alle antiche vulnerabilità di WordPress sui siti discourse :wink:

Ma dovremmo avere una logica per fermare i login costanti, anche se non è una minaccia quotidiana, credo.