Va bene, abbastanza stallo; ecco cosa ho escogitato finora
(scusa, post lungo avanti. Sii coraggioso, amico, il viaggio ne varrà la pena)
Combinando i metodi 3 e 4 dal post originale in una specie di whitelist 'fuzzy' o dinamica, e quindi - ed ecco il trucco - non bloccare gli IP non autorizzati, limitandoli all'inferno e viceversa .
Nota che questa misura ha il solo scopo di contrastare questo specifico tipo di attacco. In pratica, ovviamente, funzionerebbe in combinazione con altri approcci di best practice per l'authoring: limitazione del nome utente fisso, limitazione per-IP, politica di password complessa con codice, accesso con cookie non limitato, hashing di tutti gli equivalenti di password prima di salvarli, mai usando domande di sicurezza, ecc.
Ipotesi sullo scenario di attacco
Se un utente malintenzionato prende di mira nomi utente variabili, la limitazione del nostro nome utente non viene attivata. Se l'attaccante sta utilizzando una botnet o ha accesso a un ampio intervallo IP, la nostra limitazione IP è impotente. Se l'attaccante ha pre-cancellato il nostro elenco di utenti (di solito possibile sui servizi Web a registrazione aperta), non possiamo rilevare un attacco in corso in base al numero di errori "utente non trovato". E se imponiamo una limitazione restrittiva a livello di sistema (tutti i nomi utente, tutti gli IP), tale attacco farà il nostro intero sito per la durata dell'attacco più il periodo di limitazione.
Quindi dobbiamo fare qualcos'altro.
La prima parte della contromisura: whitelisting
Ciò di cui possiamo essere abbastanza sicuri è che l'attaccante non è in grado di rilevare e falsificare dinamicamente gli indirizzi IP di diverse migliaia di nostri utenti (+). Il che rende whitelisting possibile la . In altre parole: per ogni utente, memorizziamo un elenco degli IP (con hash) da cui l'utente ha effettuato (di recente) l'accesso.
Pertanto, il nostro schema di whitelisting funzionerà come una "porta d'ingresso" bloccata, in cui un utente deve essere connesso da uno dei suoi "buoni" IP riconosciuti per accedere a tutti. Un attacco di forza bruta su questa "porta d'ingresso" sarebbe praticamente impossibile (+).
(+) a meno che l'attaccante "possieda" il server, tutte le caselle dei nostri utenti o la connessione stessa - e in quei casi, non abbiamo più un problema di "autenticazione", abbiamo un vero pull-the in franchising -inserire la situazione FUBAR
La seconda parte della contromisura: limitazione a livello di sistema di IP non riconosciuti
Al fine di far funzionare una whitelist per un servizio Web a registrazione aperta, in cui gli utenti cambiano computer frequentemente e / o si connettono da indirizzi IP dinamici, è necessario mantenere una "porta di accesso" aperta agli utenti che si connettono da IP non riconosciuti. Il trucco è progettare quella porta in modo che le botnet rimangano bloccate e che gli utenti legittimi vengano infastiditi il meno possibile .
Nel mio schema, ciò si ottiene impostando un numero massimo molto restrittivo di tentativi di accesso non riusciti da parte di IP non approvati su, per esempio, un periodo di 3 ore (potrebbe essere più saggio utilizzare un periodo più breve o più lungo a seconda del tipo di servizio), e rendere globale tale restrizione , vale a dire. per tutti gli account utente.
Anche una forza bruta lenta (1-2 minuti tra i tentativi) verrebbe rilevata e contrastata rapidamente ed efficacemente usando questo metodo. Certo, davvero lento forza bruta potrebbe ancora rimanere inosservata, ma velocità troppo lente vanificano lo scopo stesso dell'attacco di forza bruta.
Ciò che spero di ottenere con questo meccanismo di limitazione è che se viene raggiunto il limite massimo, la nostra "porta per gatti" sbatte per un po ', ma la nostra porta d'ingresso rimane aperta agli utenti legittimi che si collegano con i soliti mezzi:
- O connettendosi da uno dei loro IP riconosciuti
- O utilizzando un cookie di accesso persistente (da qualsiasi luogo)
Gli unici utenti legittimi che sarebbero interessati durante un attacco, ad es. mentre era attiva la limitazione - sarebbero utenti senza cookie di accesso persistenti che effettuavano l'accesso da una posizione sconosciuta o con un IP dinamico. Tali utenti non sarebbero in grado di accedere fino a quando il throttling non si esaurisce (il che potrebbe richiedere del tempo, se l'attaccante ha mantenuto la sua botnet in esecuzione nonostante il throttling).
Per consentire a questo piccolo sottoinsieme di utenti di spremere attraverso la porta per gatti altrimenti sigillata, anche se i robot lo stavano ancora martellando, avrei impiegato un modulo di accesso di "backup" con un CAPTCHA. In modo che, quando visualizzi il messaggio "Siamo spiacenti, ma non puoi accedere da questo indirizzo IP al momento", includi un link che dice " accesso sicuro al backup - SOLO UMANI ( robot: non mentire ) ". Scherzo a parte, quando fanno clic su quel link, danno loro un modulo di accesso autenticato da reCAPTCHA che elude la limitazione a livello di sito. In questo modo, SE sono umani E conoscono il login + password corretti (e sono in grado di leggere i CAPTCHA), non potranno mai negato il servizio, anche se si stanno connettendo da un host sconosciuto e non stanno usando il cookie di accesso automatico.
Oh, e solo per chiarire: dal momento che considero i CAPTCHA generalmente malvagi, l'opzione di accesso 'backup' appare solo quando la limitazione era attiva .
Non si può negare che un attacco prolungato del genere costituirebbe comunque una forma di attacco DoS, ma con il sistema descritto in atto, influenzerebbe solo quello che sospetto sia un piccolo sottoinsieme di utenti, vale a dire le persone che non usano il cookie "ricordami" E accede mentre si sta verificando un attacco E non accede da nessuno dei loro IP abituali E che non sono in grado di leggere i CAPTCHA. Solo coloro che possono dire di no a TUTTI questi criteri - in particolare i robot e le persone disabili davvero sfortunate - saranno respinti durante un attacco bot.
EDIT: In realtà, ho pensato a un modo per consentire anche agli utenti sfidati di CAPTCHA di passare durante un 'blocco': invece di, o come supplemento al login CAPTCHA di backup, fornire all'utente un'opzione per avere un uso singolo , codice di blocco specifico dell'utente inviato alla sua e-mail, che può quindi utilizzare per ignorare la limitazione. Questo sicuramente supera la mia soglia del "fastidio", ma dato che è usato solo come ultima risorsa per un piccolo sottoinsieme di utenti e dato che batte ancora per essere bloccato fuori dal tuo account, sarebbe accettabile.
(Si noti inoltre che nulla di tutto ciò accade se l'attacco è meno sofisticato della cattiva versione distribuita che ho descritto qui. Se l'attacco proviene da pochi IP o colpisce solo pochi nomi utente, sarà contrastato molto prima e senza conseguenze a livello di sito)
Quindi, questa è la contromisura che implementerò nella mia libreria di autenticazione, una volta che sono convinto che sia corretto e che non ci sia una soluzione molto più semplice che mi è sfuggita. Il fatto è che ci sono così tanti modi sottili di fare cose sbagliate in termini di sicurezza, e non sto esagerando nel fare false assunzioni o logiche irrimediabilmente imperfette. Quindi, per favore, qualsiasi feedback, critica e miglioramento, sottigliezze ecc. Sono molto apprezzati.