Problema
Nota iniziale: sono di parte nei confronti dei server web, ma molto di ciò che viene detto qui si applicherà ad altri tipi di servizi.
Il problema è Denial of Service . Può accadere in due modi: 1) Gli aggressori eseguono la forza bruta in modo tale da saturare il server e ora nessuno può accedere al servizio. 2) Gli utenti (malintenzionati o meno) potrebbero provare troppe volte, determinando il blocco dell'accesso.
Altre considerazioni
-
Dire all'utente se l'errore è nel nome utente o nella password consentirà a un utente malintenzionato di utilizzare nomi utente a forza bruta / dizionario. Anche se questo va contro l'usabilità, dovresti optare per la sicurezza se gli account sono privati o anonimi per impostazione predefinita ※.
-
Dire all'utente che l'account è bloccato rendere più facile per gli aggressori causare problemi bloccando molti account (che è una forma di negazione del servizio e probabilmente porterà a molti ticket di supporto). Inoltre, gli account che non esistono non possono essere bloccati, consentendo agli aggressori di scoprire gli account con questo metodo. Puoi prendere in considerazione l'idea di deridere il blocco sugli account falsi.
-
La scoperta degli account non è solo metà dell'attacco di forza bruta / dizionario, ma può anche essere utile nel futuro social engineering.
-
Una variante dell'attacco forza bruta / dizionario è provare la stessa password (di solito statisticamente comune) contro un gran numero di nomi utente.
※: I motori di ricerca saranno in grado di indicizzare i nomi degli utenti? Se lo faranno, optare per l'usabilità (gli aggressori hanno comunque un elenco di nomi utente validi nella cache del motore di ricerca). Evita di consentire ai motori di ricerca di accedere a tali informazioni in siti in cui sapere chi ha un account può essere considerato informazioni sensibili.
Possibili soluzioni
Ci sono alcune cose comuni da provare per risolvere il problema :
- Aggiungi un CAPTCHA
- Aggiungi un'ora per il nuovo tentativo
- Blocca l'account
- Blocca l'origine
- Autenticazione a due fattori
Va notato che solo il blocco dell'IP a livello di firewall o di configurazione del server web avrà un impatto reale sul carico del server. Tuttavia, se stai bloccando l'origine solo quando accoppiato con l'account specificato, la logica sarà nel codice lato server. È anche vero per il resto delle soluzioni che richiedono codice lato server.
Queste soluzioni si basano sul codice lato server e quindi non proteggeranno realmente il server da un attacco flood. Ciò significa che l'applicazione principale di questi metodi è come deterrente .
Vocabolario:
Per il contesto di questo post, queste parole hanno il significato qui menzionato:
-
"Blocca": "impedisce l'accesso fino a quando non viene fornita un'ulteriore autenticazione", per fornire ulteriori mezzi di autenticazione per seguire passaggi simili - se non uguali - a quelli forniti agli utenti che hanno dimenticato la password.
-
"Origine": l'IP, l'agente utente o altre tecniche che il server può utilizzare per identificare l'origine di una connessione. Se utilizzato, dovrebbe essere menzionato nell'informativa sulla privacy che il server registrerà tali informazioni.
-
"Terzo canale": Email, SMS, app dedicata o altro mezzo di riservatezza comunicazione al di fuori del controllo del server.
Va anche notato che in questa definizione il tempo di riprova non è un blocco perché non richiede un'autenticazione aggiuntiva dal utente ma in attesa.
E, poiché non può essere ripetuto abbastanza volte , applica hash e salt le tue password.
CAPTCHA
Va notato che non tutte le soluzioni CAPTCHA sono visive. Alcuni sono uditivi e anche altri sono testuali (ad esempio: "Quanti colori nell'elenco viola, pinguino, blu, bianco e rosso?").
Pro
CAPTCHA è facile da implementare utilizzando soluzioni di terze parti. L'uso di soluzioni di terze parti esternalizza anche il problema per rendere un CAPTCHA abbastanza forte.
Contro
L'utilizzo di un CAPTCHA può diventare un inconveniente per gli utenti legittimi che potrebbero avere problemi a digitare la password. L'attuale reCAPTCHA mitiga questo problema utilizzando l'analisi del comportamento per identificare gli utenti umani.
Un robot può risolvere il CAPTCHA tramite un'intelligenza artificiale intelligente o semplicemente chiedendo all'autore dell'attacco di risolverlo.
Riprova
Pro
Il tempo di riprova ha un vantaggio in quanto fa guadagnare tempo. Quindi, può essere combinato con una notifica su un terzo canale per avvisare il proprietario dell'account.
Quale azione può intraprendere l'utente? Puoi suggerire di utilizzare una password più complessa, ma questo non risolverà davvero il problema.
In alternativa, considera di dare all'utente l'opzione di negare l'accesso dalla macchina attaccante (cioè di bloccare la combinazione di origine e account) ※. Vedi "Bloccare l'origine".
※: Dovrebbe richiedere l'autenticazione e interessare solo l'account corrente. È necessario prestare attenzione nell'evitare qualsiasi difetto che possa portare a un account che blocca un altro account.
Contro
L'uso di un tempo di ripetizione riduce l'usabilità del servizio, in quanto diventa un inconveniente per utenti legittimi che potrebbero avere problemi a digitare la password. Questo è peggio del CAPTCHA in quanto è tempo di inattività cognitiva.
Gli attacchi di forza bruta / dizionario sono ancora possibili se l'aggressore esegue un tentativo una volta ogni ora circa. Le alternative per affrontare questo problema includono politiche di sicurezza per cambiare frequentemente la password (che l'utente potrebbe rendere inefficace scegliendo password simili) e IDS o altre analisi per rilevare gli aggressori (che potrebbero essere aggirati distribuendo l'attacco da più fonti - si spera che sia abbastanza costoso da essere esso stesso un deterrente).
Blocca l'account
Pro
È resistente contro la diffusione di un attacco nel tempo o origini multiple.
Svantaggi
Il blocco dell'account può comportare il blocco dell'account di un utente legittimo a causa del numero di tentativi falliti.
Inoltre, i tentativi falliti di un utente malintenzionato in una terza posizione bloccheranno l'utente legittimo. La combinazione del blocco dell'origine con il blocco dell'account consentirebbe un controllo più granulare. In questo caso, l'account verrebbe bloccato solo per l'origine da cui si sta tentando di accedere.
Gli attacchi possono comunque interessare il sistema inducendo utenti legittimi bloccati a contattare l'assistenza o a trovare un servizio alternativo.
Blocca l'origine
Pro
Bloccare un'origine, indipendentemente dall'account ha il vantaggio di consentire di fermare gli aggressori invece di punire gli account.
Contro
In richiederebbe al server di tracciare l'origine delle richieste e distinguere i tentativi falliti da quelli riusciti.
L'origine di un attacco può essere condivisa tra molti utenti (ad esempio in Internet cafè) e bloccare un'origine può significare bloccare gli utenti legittimi.
La combinazione del blocco dell'origine con il blocco dell'account consentirebbe un controllo più granulare. In questo caso, all'inizio l'origine sarebbe bloccata solo per l'account a cui sta tentando di accedere, tuttavia un'origine bloccata per molti account può essere bloccata a livello globale.
Autenticazione a due fattori
Tutte le varianti dell'autenticazione a due fattori sono forti deterrenti per la forza bruta / dizionario. Esistono due varianti principali:
-
Invia un codice tramite un terzo canale per consentire l'autenticazione. Non dovrebbe richiedere misure aggiuntive per prevenire la forza bruta di quel codice, perché è pensato per essere monouso e di breve durata.
-
Richiedi un codice da hardware / software dedicato chiave per l'autenticazione. La chiave deve fornire un codice monouso che autorizzi l'autenticazione.
Pro
L'autenticazione a due fattori è l'unica soluzione che può effettivamente rendere bruta- attacco forzato / dizionario inefficace. Ciò si ottiene richiedendo un codice monouso, che essendo monouso non sarà indovinato tentando più volte.
Contro
L'autenticazione a due fattori è spesso più costosa da implementare.
Cosa usare?
Ha senso aggiungere una protezione aggiuntiva per scoraggiare gli attacchi di forza bruta / dizionario. La necessità di queste misure aumenta nei sistemi in cui lo spazio della password è troppo piccolo ※, o se la forza minima delle password è troppo bassa (ad esempio i pin a quattro cifre comuni nelle banche).
※: È bene mettere un limite superiore alla dimensione della password. In questo modo il server non verrà bloccato mentre crea un costoso hash sulla password. E dovresti usare un hash costoso perché scoraggerà gli attacchi forzati contro i codici hash rubati .
CAPTCHA dovrebbe essere la prima opzione, poiché è molto facile ed economico da implementare ( utilizzando soluzioni consolidate come reCAPTCHA).
Tra il tempo di ripetizione e i blocchi, considera che l'implementazione minima possibile è simile: per bloccare un account aggiungi un campo all'oggetto / record dell'account contrassegnandolo come bloccato e quindi controlla che durante l'autenticazione ... per inserire un tempo di nuovo tentativo, fai la stessa cosa, tranne che ciò che memorizzi è l'ora in cui l'autenticazione è di nuovo valida.
Ha senso mitigare l'inconveniente aggiungendo queste misure una volta falliti alcuni tentativi. In tal caso, applica prima il CAPTCHA poiché non crea tempi di inattività cognitivi per l'utente.
Tra le opzioni di blocco, abbiamo visto che la combinazione di origine e account è un'alternativa migliore (ma anche più complesso) di uno solo. L'implementazione richiederà log e analisi.
Infine, le autenticazioni a due fattori hanno vantaggi che superano le soluzioni di cui sopra. Tuttavia è il più costoso da implementare in quanto richiede la connessione a un servizio di terze parti (server di posta elettronica, servizio SMS, app dedicata, hardware dedicato, ecc.).
Suggerirei di implementare la registrazione e l'analisi e in base a questi decidi se vuoi implementare il blocco o se vuoi implementare l'autenticazione a due fattori.
Quanti tentativi?
Ci saranno:
- n 1 tentativi finché non viene visualizzato catpcha.
- n 2 tentativi fino a quando non viene visualizzata l'ora del nuovo tentativo.
- n 3 tentativi fino all'applicazione del blocco.
Nota: se utilizzi l'autenticazione a due fattori, la utilizzi fin dal primo tentativo.
I valori di queste variabili possono essere modificati in futuro in base alle tue analisi. Tuttavia, per impostazioni predefinite ragionevoli, considera:
-
n 1 dovrebbe essere una stima del numero di tentativi che una persona può fare se ha problemi a digitare la password . 2 tentativi sarebbero il minimo n 1 perché ciò spiega l'errore di base dei limiti. Nota: Gmail mi consente 20 tentativi prima di utilizzare CAPTCHA.
-
n 2 dovrebbe essere una stima del numero di tentativi che una persona farebbe prima di andare a accesso al meccanismo di recupero. Non esiste un minimo rigido, infatti può essere applicato non appena si applica CAPTCHA e avere intervalli di tempo crescenti per l'attesa. A mio parere n 2 = 3 * n 1 è un buon punto di partenza.
-
n 3 sub> dovrebbe essere una stima del numero di tentativi in cui è più probabile che venga effettuato un attacco. Considera che CATPCHA e il tempo di ripetizione dovrebbero scoraggiare qualsiasi attacco manuale, quindi n 3 non deve essere molto più alto. A mio parere, n 3 = 2 * n 2 è un buon punto di partenza.
Nota sul tempo di nuovo tentativo : L'intervallo che l'utente deve attendere può essere aumentato a ogni tentativo. Ciò ti consente di utilizzare un intervallo iniziale molto piccolo (ad esempio 1 secondo) e di aumentare da lì fino a un limite massimo (ad esempio 1 giorno).
Nota sul conteggio dei tentativi: dovresti evitare un overflow nel i tentativi contano. Se si memorizza il numero di tentativi nell'oggetto / record dell'account, gestire l'overflow. Se stai eseguendo una query sui log per ottenere il numero di tentativi falliti dall'ultimo riuscito, considera l'aggiunta di un intervallo di tempo (che limiterà anche il tempo della query).