L'account utente deve essere bloccato dopo la quantità X di accessi non riusciti?

3

Ho quasi finito di sviluppare il mio sistema di login e c'è ancora una cosa di cui non sono sicuro. Così tanti dibattiti che ho trovato su internet sul conteggio degli accessi non validi e l'account degli utenti bloccati. Il mio sistema memorizza i nomi utente e le password (che sono salati [per ogni utente diverso sale] e hash) nel database. Se l'utente inserisce un nome utente o una password non validi, tengo traccia dei loro Username, Password, LoginTime, SessionID, IP e Browser. Ecco un esempio:

LoginID   LoginTime                 LoginUN    LoginPW    LoginSessionID    LoginIP     LoginBrowser    
   1    2018-03-15 13:40:25.000     jpapis     test       E72E.cfusion      10.18.1.37  Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
  98    2018-03-15 13:48:45.000     mhart      mypass55   E72E.cfusion      10.12.1.87  Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
  32    2018-03-15 14:29:14.000     skatre     1167mmB!   378E.cfusion    10.36.1.17    Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0

Mi chiedo se dovrei bloccare l'account dopo i tentativi di X? Se sì, quale sarebbe la migliore pratica per farlo? Ecco un approccio che ho trovato:

SELECT COUNT(LoginID) AS countID, DATEDIFF(mi,LoginTime,GETDATE ( )) AS TimeElapsed
FROM FailedLogins
WHERE (LoginUN = '#username#' OR LoginSessionID = '#SESSION.sessionid#' OR LoginIP = '#REMOTE_ADDR#')
    AND DATEDIFF(mi,LoginTime,GETDATE ( )) <= 60
GROUP BY LoginID, LoginTime
HAVING COUNT(LoginID) >= 5;

Query sopra cercherà username, sessionID o indirizzo IP. Se uno di questi è trovato nella tabella FailedLogin entro 60 minuti ed è maggiore di 5, bloccherei l'account. L'unico problema qui è che non sono sicuro di cosa ciò possa impedire, l'attacco di forza bruta può inviare troppi tentativi in 60 minuti, quindi non sono sicuro di quale sarebbe il vantaggio di controllare gli accessi non riusciti in questo modo. C'è un modo migliore per gestire gli accessi non riusciti ora? Devo anche bloccare l'account? Se qualcuno può fornire alcuni pensieri ed esempi, per favore fatemelo sapere. Inoltre voglio condividere alcuni dettagli sul sistema. Non abbiamo transazioni di denaro nel sistema o legate ad account utente. Disponiamo di informazioni sensibili nel sistema ed è per questo che vorrei implementare funzionalità di sicurezza per impedire agli hacker di cercare di infrangere la password con alcune tecniche di hacker. Grazie.

    
posta espresso_coffee 16.03.2018 - 14:29
fonte

1 risposta

3

I blocchi degli account su applicazioni remote (ad esempio, laddove l'autore dell'attacco non è in grado di reimpostare il numero di tentativi senza ulteriore intervento) sono principalmente per prevenire attacchi di forza bruta contro gli account. Se hai utenti che selezionano password molto deboli o comuni e il tuo sistema non tenta di impedirne l'utilizzo, è del tutto possibile che un utente malintenzionato possa accedere ad alcuni account, anche se il blocco degli account è implementato. Tuttavia, ciò non significa che non valga la pena di essere implementato - per gli utenti che scelgono password leggermente migliori, rallenta enormemente un utente malintenzionato e può avvisare te o i tuoi utenti di potenziali attacchi.

Questo è diverso dalla scelta di un metodo di memorizzazione della password, che generalmente sta tentando di difendersi dagli aggressori che hanno ottenuto il tuo database utente. Ovviamente, in quel caso, non puoi impedire a qualcuno di fare tanti tentativi di indovinare la password come preferiscono: possono semplicemente cancellare un gruppo di password con il sale del tuo DB e confrontare fino a trovare una password che dia lo stesso hash.

Tuttavia, il metodo specifico che stai usando per registrare i tentativi falliti è un problema. Stai registrando il nome utente e la password errata. Nella maggior parte dei casi, la probabilità che un utente legittimo che digita erroneamente la password è superiore a quella di un utente malintenzionato che tenta di accedere al sistema. In tal caso, la tabella dei registri che stai mantenendo diventa preziosa per gli autori di attacchi: contiene nomi utente con stringhe che potrebbero essere vicine a password valide per gli account. Se gli utenti hanno password solo per il tuo sito, questo potrebbe ridurre in modo massiccio lo sforzo richiesto alle password brute force se il tuo DB è stato acceduto e se gli utenti hanno account su altri sistemi con le stesse password, anche se gli altri sistemi utilizzano schemi di lockout degli account, hai appena dato agli attaccanti una possibilità molto migliore di indovinare la password corretta entro il limite del tentativo.

Non è necessario memorizzare la password. Ti interessa solo il numero di tentativi contro ogni account. Potrebbe essere un valore intero collegato al loginid e sarebbe sufficiente per il processo di blocco. È possibile archiviare separatamente l'IP di origine e monitorare modelli di traffico insoliti, anche se si rischia di bloccare gli utenti legittimi che si connettono al proprio sito tramite connessioni NAT-ed - i provider di telefonia mobile spesso raggruppano un numero elevato di utenti in modo che sembrino provenire da un singolo indirizzo IP, ad esempio.

Uno schema comune per il blocco degli account è il monitoraggio del numero di tentativi falliti contro un account, quindi l'applicazione di blocchi temporali incrementali contro tale account. Ad esempio, dopo 3 tentativi falliti, è possibile bloccare ulteriori tentativi per 5 minuti. Se si verificano altri 3 tentativi falliti, bloccare l'account per 10 minuti e così via - questo può essere ripristinato una volta che si verifica un accesso legittimo. Può anche essere utile per mostrare il numero di tentativi falliti agli utenti al momento dell'accesso - se individuano qualcosa di strano, possono potenzialmente avvisarti di un problema.

Una cosa da tenere presente con l'implementazione degli schemi di blocco degli account è che possono agire come nome utente oracle, se implementati male. In questo caso, è possibile individuare un comportamento distinto tra account validi e account inesistenti, consentendo a un utente malintenzionato di sapere che un determinato nome utente è valido. Per evitare ciò, è possibile monitorare tutti i nomi utente forniti e mostrare lo stesso comportamento per quelli non esistenti come quelli validi, o semplicemente non visualizzare quando un account è bloccato. Se lo scegli, potresti creare confusione agli utenti, che potrebbero non essere in grado di accedere se sono soggetti a un attacco a loro insaputa.

    
risposta data 16.03.2018 - 15:22
fonte