Domanda:
Posso nascondere quale account nel mio database è l'account amministratore, in modo che un utente malintenzionato non saprà quale hash crackare per primo?
Melkor
2017-05-02 13:45:36 UTC
view on stackexchange narkive permalink

Supponiamo che avessi un database simile a questo:

  Nome hash password (bcrypt) Stato -------------------- -------------------------------------------------- ---------- Dave $ 2a $ 10SyyWTpNB.TyWd3nM hQ41frOtObcircAb3nJw1Cf9dC6CT7tVIEb6XS StandardSarah $ 2a $ 10 $ fUJrNA200sXgWUJAP7XEiuq4itHa43Y8WQVIpc. AdminMike $ 2y $ 10 $ 01jx7u7hnfKOzBYyjNWskOPQ23w1Cf1gNiv42wsKqXKOf8filzS02 Standard 

Se un utente malintenzionato ha ottenuto l'accesso a questo database, vedrebbe immediatamente che Sarah è un amministratore e probabilmente si concentrerebbe sull'infrangere la password, quindi potrebbe avere più potere. C'è un modo per nascondere in qualche modo se qualcuno è un amministratore nel database in modo che un utente malintenzionato non sappia chi sono gli amministratori? Potrei semplicemente hash il valore (standard o admin) ma ciò darebbe solo 1 bit di entropia e spero di ottenere un po 'più di sicurezza di quello.

Un utente malintenzionato potrebbe anche semplicemente guardare la voce più vecchia.Nella maggior parte dei sistemi questo sarà l'account amministratore :)
@Nat - Come possono accedere esattamente utilizzando solo l'hash?Non ha senso per me, anche se ha senso accedere semplicemente come ogni utente finché non trovi un amministratore.
Molto tempo lontano in un universo molto lontano fa, ho dovuto implementare qualcosa di simile.Il modo in cui l'ho fatto è stato: anteporre una lettera alla password quando viene hash (in realtà più lettere, era un "id di gruppo") e fare in modo che il meccanismo di autenticazione provi tutte le combinazioni.
Sarebbe più semplice e sarebbe meglio aggiungere 1 bit di entropia alla password (hash), raddoppiando efficacemente lo sforzo medio di un attacco di forza bruta riuscito, piuttosto che privare l'attaccante di 1 bit di informazioni di ricognizione.Inoltre, non ci vuole molto più tempo per forzare una pre-immagine per 1 milione di hash di quanto ci vuole per uno singolo (assumendo la stessa entropia pre-immagine effettiva).
Questa colonna è leggibile per gli utenti normali?
@DavidFoerster È più di un bit di informazione perché ci possono essere molti utenti.E rompere un hash della password non è la stessa cosa che trovare una pre-immagine di un valore hash per due motivi: "1." La maggior parte delle password ha molta meno entropia della dimensione dell'output dell'hash."2." Questi valori hash sembrano essere salati.
@kasperd: Fai un buon punto sull'entropia della password che ho considerato ma tralasciato per brevità e il seguente ragionevole presupposto: la password dell'amministratore avrà un'entropia molto più alta della password media dell'account e sarà probabilmente tra le ultime ad esseretrovato durante un tipico attacco al dizionario che cerca password brevi prima di password più lunghe e parole comuni prima di parole meno comuni prima di sequenze di caratteri casuali.
@kasperd: Informazioni sulla parte di informazione: potrebbero esserci più di 2 tipi di account, ma in questo scenario l'attaccante si preoccupa solo della distinzione binaria tra amministratore e non amministratore.
@DavidFoerster Il punto è che le informazioni ottenute dall'avversario dal sapere in anticipo quali utenti sono amministratori sono più vicine a 1 bit per utente che a 1 bit in generale.E ciò che interessa all'avversario sono solo le password degli amministratori.Se tutte le password nel database fossero ugualmente forti, 1 bit di conoscenza per utente potrebbe aiutare molto l'avversario.Tuttavia, come fai notare, le password dell'amministratore sono probabilmente più forti in media delle altre password.Ciò significa che sapere quali utenti sono amministratori vale molto meno per l'attaccante.
Perché è necessario decifrare la password dell'amministratore quando si è già acquisito l'accesso al sistema?
@JonasDralle L'attaccante potrebbe aver acquisito gli hash da un backup trapelato.Gli amministratori potrebbero aver utilizzato la stessa password per più di un sistema.
Forse invece di offuscare i tuoi dati applica l'autenticazione basata su certificato.
Se l'aggressore può scansionare il tuo database, hai già un problema molto più grande di questo.
I certificati client @JonasDralle TLS hanno i loro problemi.Vedi ad es.https://utcc.utoronto.ca/~cks/space/blog/tech/TLSClientCertificateWhen
Non è fondamentalmente Kerberos?:)
Se l'hacker ha accesso al tuo database, perché non provare ad hackerare tutti gli account e poi cambiare lo stato in Admin?
@MatthewWhited: Potrebbe essere un accesso di sola lettura.
Aggiungere più entropia all'hash è anche di scarso valore ... il vero problema con le password è che le persone usano quelle facilmente intuibili o le annotano se costrette a usare quelle casuali (ish).Che ne dici invece di implementare l'autenticazione a due fattori?Google Authenticator è gratuito per chiunque abbia uno smartphone.O anche solo ritirare "Dave" ecc. E insistere su una scelta casuale tra 1,6 miliardi di ID del (ragionevolmente memorabile) modulo aannaann.
Nove risposte:
Black Magic
2017-05-02 13:56:26 UTC
view on stackexchange narkive permalink

Direi che questo è un po 'troppo problematico considerando quello che ne ottieni. Penso che quando l'attaccante ha accesso al database hai problemi molto più grandi. Offuscare lo stato di amministratore di un utente costerà all'aggressore solo un po 'di tempo in più, ma un APT (Advanced Persistent Threat) probabilmente non sarebbe scoraggiato da questo fatto.

Esattamente.Offuscare lo stato di amministratore è inutile come cercare di fissare i tuoi effetti personali sul pavimento in modo che i ladri non possano ottenerlo - possono ancora farlo e lo faranno.Vuoi invece impedire l'ingresso del ladro.
@JamesCameron a meno che le tue `` cose '' non siano costituite da chiodi da 10 pollici.Quindi, penso che il ladro potrebbe chiedersi cosa c'è che non va in te ... e denunciarti come pazzo.
@TheGreatDuck - mentre le unghie da nove pollici sarebbero ovviamente perfettamente ragionevoli.
@TheGreatDuck: Dico a mia moglie che sono chiodi da 10 ", ma in realtà sono solo chiodi da 8,5".
@PieterGeerkens: Ed è per questo che non può parcheggiare in parallelo.
@PieterGeerkens che è ancora eccessivamente ottimista ...;)
schroeder
2017-05-02 14:08:08 UTC
view on stackexchange narkive permalink

La sicurezza attraverso l'offuscamento ha un'efficacia limitata nella migliore delle ipotesi: per determinare se è adatta, è necessario capire quali minacce si desidera contrastare. Se un attore di minacce può leggere direttamente il tuo database, che vantaggio c'è nel nascondere un particolare dettaglio memorizzato?

Se è un vantaggio nell'offuscamento (assicurati di poterlo davvero provare), utilizza il tipo di offuscamento che affronta tale minaccia (valori crittografati, fonti di dati offline, hashing, ecc.).

bdsl
2017-05-03 02:12:49 UTC
view on stackexchange narkive permalink

Concordo con Black Magic sul fatto che probabilmente non vale la pena farlo, ma se lo desideri potresti utilizzare una funzione di derivazione della chiave per creare una chiave di crittografia basata sulla password e utilizzarla per crittografare il contenuto della colonna Stato.

Potenzialmente lo stato dovrebbe essere mantenuto in memoria per tutte le sessioni utente aperte, in modo che queste potrebbero essere ancora vulnerabili all'attaccante.

Ciò significherebbe hanno le stesse restrizioni del tuo aggressore, supponendo che tu non conosca le password degli utenti. Non saresti in grado di leggere lo stato dal DB e se volessi cambiare lo stato di un utente dovresti cambiare la sua password allo stesso tempo.

In realtà potresti cambiare uno stato in non-admin senza conoscere la password: inserisci semplicemente un valore casuale nel campo e fai affidamento sulla probabilità praticamente nulla che ciò possa accadere per abbinare il testo cifrato per 'admin'.Il codice che lo legge dovrebbe tollerare valori imprevisti.
Oppure potresti avere una colonna db "newStatus" e impostarla invece, in testo normale, quindi cancellarla quando l'utente accede e aggiorni lo stato crittografato.
Significa anche che non puoi avere una funzione di recupero della password senza perdere lo stato dell'account.
Buon punto @MichaelKjörling che probabilmente sarebbe un rompicapo.
phyrfox
2017-05-03 00:34:18 UTC
view on stackexchange narkive permalink

Molti sistemi moderni in realtà separano il login dell'utente (come si autenticano) dai loro "profili" (i permessi che hanno), implementati come due o più sistemi discreti. Il tuo server di accesso potrebbe avere solo un GUID, un nome utente con hash e una password con hash; in caso di accesso riuscito, trasferire la sessione al server delle applicazioni. Finché il tuo server delle applicazioni non è compromesso, il database di accesso è inutile anche se viene scaricato.

Come passaggio aggiuntivo, potresti anche crittografare i dati dell'utente con una chiave dal server di accesso (archiviato come parte della sessione), rendendo anche più sicuro il server delle applicazioni. Due sistemi sono in genere più difficili da sconfiggere di uno. Tuttavia, se non sei disposto a configurare due server (o cluster) e tutto sembra troppo lavoro, probabilmente stai comunque meglio con il tuo progetto attuale. Sapere semplicemente quali account scegliere come target non semplifica il lavoro; se l'aggressore riesce a decifrarne uno, può decifrarli tutti con il calcolo parallelo.

satibel
2017-05-04 11:53:13 UTC
view on stackexchange narkive permalink

Il suggerimento di PlasmaHH era di: "anteporre una lettera alla password quando viene hash (in realtà più lettere, era un" id gruppo ") e fare in modo che il meccanismo di autenticazione provi tutte le combinazioni."

Sebbene sia in qualche modo la sicurezza per oscurità e deve essere associato a buone pratiche come:

  • un forte fattore di lavoro su bcrypt
  • amministratori che hanno una password complessa
  • modi per impedire che l'attaccante abbia una copia del database in primo luogo

È un buon modo per rallentare un attaccante abbastanza in modo che la password viene cambiata prima che venga trovata.

Il crack di una password non banale (supponendo che tu abbia utilizzato un fattore di lavoro forte) può richiedere da alcuni giorni ad alcuni mesi, quindi è fattibile, ma se non lo fanno Non so quale account vale la pena hackerare, gli impone di hackerare ogni account.

Quindi, a meno che non siano fortunati o tu abbia chiamato un account amministratore "admin", dovranno provare più account, che fanno i loro costi almeno un ordine di mag nitude più grande, facendo in modo che l'attaccante attenda di più, acquisti più potere o si arrenda.

In conclusione, non è inutile, in quanto è un deterrente economico che non disturba l'utente.

Nota che se hai suggerimenti che qualcuno sia un amministratore, come un post di qualcun altro modificato da loro (se solo gli amministratori possono farlo), mascherare il loro stato nel db è inutile.

Come altri hanno già detto, questo ha dei trucchi come impedirti di rendere un utente amministratore senza cambiare o almeno chiedere la sua password.

Se disponibile, richiedere l'autenticazione a 2 fattori per gli amministratori sarebbe probabilmente una soluzione migliore modo per proteggere gli account amministratore.

sebastian nielsen
2017-05-04 19:00:53 UTC
view on stackexchange narkive permalink

Sì, è possibile. Basta aggiungere lo stato di amministratore come parte della password.

come: HereIsMe! 65371 = adminHereIsMe! 65370 = regular

Quindi all'accesso, prova prima con regolare quindi admin, in questo modo:

  if (sha512 ($ password. "0") eq $ hash) {funzioni utente blabla} else {if (sha512 ($ password. "1") eq $ hash) {blabla admin functions} else {show password errata message}}  

IMPORTANTE: assicurati che qualcuno non possa modificare il proprio ultimo carattere della propria password. Ad esempio, assicurati che il modulo di registrazione, il modulo della password dimenticata e il modulo di modifica della password, aggiungano sempre uno 0 o 1 alla fine della password a seconda del loro stato reale. cookie di sessione laterale.

Ciò rende praticamente impossibile dedurre lo stato di amministratore senza decifrare con successo la password.

conoscere lo schema e cercare 1 interrompe il tuo sistema - se hai una tabella separata che elenca gli amministratori, perché non usarla invece di manipolare le password?e poi se hai questa tabella, come la proteggi dalla lettura insieme alla tabella menzionata nella domanda?
inoltre, questo è molto simile alla risposta di Satibel
Come?L'1 è la parte con hash della password.Sì, potresti dire al tuo hashcracker di aggiungere 1 alla password, ma non sapresti comunque quale account è admin, quindi dovresti comunque crackare tutti gli account.
Se accedo come amministratore, come fa il sistema a sapere di aggiungere 1 alla mia password fornita prima dell'hashing?
@schroeder Finché hash (password + '0')! = Hash (password + '1') funzionerà benissimo, anche se sembra piuttosto pericoloso sbagliare gravemente.E significa che non puoi reimpostare la password di un utente senza reimpostare i suoi diritti di accesso e problemi simili.
@schroeder Se controlli il codice di esempio, vedrai che proverà prima ad accedere come utente normale, se l'hash non corrisponde, metterà alla prova admin.Il trucco è che non è possibile sapere in anticipo quale utente è admin, senza conoscere la sua password.
@Voo Sì, sei vero che non puoi eseguire una "password dimenticata" su un utente senza che il suo diritto di accesso amministratore sia reimpostato su utente.Ma ehi, questa è in realtà una buona funzionalità di sicurezza, perché se alcuni hackerano la funzione di reimpostazione della password, ad esempio hackerando un account di posta elettronica, i diritti di amministratore sono comunque al sicuro.Quando si cambia la password, si sa già dalla sessione se l'utente connesso è admin o utente.
Quindi, aggiungere uno 0 per gli utenti non è necessario, puoi semplicemente aggiungere l'1 per gli amministratori, ma come fa il sistema a sapere che l'utente dovrebbe avere questo bit in più aggiunto in primo luogo?Perché non codificare semplicemente l'hash dell'amministratore nel codice di esempio?Il tuo suggerimento sembra non gestibile e certamente non scalabile.
@schroeder È necessario aggiungere 0 agli utenti, altrimenti corri il rischio che l'utente aggiunga 1 alla propria password e diventi amministratore.Codificando l'hash dell'amministratore, è possibile dedurre l'amministratore guardando il codice + db.Ma con la mia idea, non puoi dedurre chi è amministratore, anche con accesso a entrambi.Puoi provare a decifrare la password e controllare se 0 o 1 corrisponde all'hash.
@schroeder Cosa non è scalabile nella soluzione?Puoi estenderlo a tutte le autorizzazioni che desideri, anche consentendo i bitflag.È piuttosto fragile e presenta alcuni svantaggi ma risolve il problema dato.
Un altro problema con soluzioni come questa è che diventa difficile implementare un'interfaccia per amministratori di livello superiore per revocare lo stato di amministratore da altri utenti che diventano problematici al volo, poiché qualsiasi implementazione sana di ciò memorizzerebbe solo lo stato di amministratore stesso nei dati della sessione sulogin e quindi non è stato possibile controllare i ruoli su ogni richiesta pertinente, quindi la revoca dell'accesso amministratore richiede l'eliminazione forzata dei dati della sessione di accesso in modo che l'utente debba accedere nuovamente.
Questa è l'unica risposta, che risponde adeguatamente alla domanda.
cybernard
2017-05-04 06:19:08 UTC
view on stackexchange narkive permalink

Se il database lo supporta, configura un server di autenticazione LDAP o simile, quindi le credenziali non verranno archiviate localmente.

La domanda riguarda l'occultamento dell'autorizzazione, non dell'autenticazione - e rendere tale interrogazione da una fonte remota può peggiorare la situazione se non implementata correttamente (le informazioni sull'autorizzazione devono essere accessibili solo se l'autenticazione è riuscita!)
@rackandboneman Il server in questione non avrà credenziali sul server, quindi verranno nascoste.Se hai la tua rete e rendi il tuo server di autenticazione visibile a Internet, meriti di essere violato.Ovviamente devi usare TLS 2048 bit o più e blah blah o qualunque cosa ti permetta.
S.C.
2017-05-05 09:50:49 UTC
view on stackexchange narkive permalink

Ci sono diversi suggerimenti tecnici interessanti qui, ma va detto che anche se li implementate perfettamente questo approccio non vi farà letteralmente guadagnare nulla in caso di intrusione per i seguenti motivi:

  • Se qualcuno ha accesso al database (tramite sql injection o qualcosa del genere), è un dato di fatto che può fare praticamente tutto ciò che vuole sul tuo server con le autorizzazioni di qualsiasi utente con cui è in esecuzione il tuo servizio di database poiché la maggior parte dei sistemi di gestione del database forniscono funzionalità per manipolare file ed eseguire processi sul proprio host. Ciò significa che l'intruso può modificare le tue pagine web o l'elaborazione lato server per acquisire password in chiaro durante l'accesso e ottenere rapidamente password non crittografate per i tuoi utenti attivi. Presumo che il tuo account amministratore sia un utente attivo.
  • Se qualcuno ottiene l'accesso agli hash delle tue password, probabilmente non accederà a quelli che dovrebbero tentare di crackare per primi. Eseguiranno semplicemente un cracker di massa per elaborarli tutti in una volta e in ogni passaggio controllerà tutti gli hash nella tabella che stanno elaborando.
  • Anche se hai mantenuto l'hash della tua password amministratore in una tabella separata o completamente al di fuori del database, la compromissione di account meno privilegiati porterà probabilmente a un'escalation dei privilegi fintanto che l'intrusione non viene rilevata poiché l'intruso sarà in grado di impersonare utenti fidati per ottenere accesso a più informazioni (utilizzando un account moderatore per parlare con l'amministratore e avviare il furto di cookie o altre attività dannose, ad esempio).
  • Se il tuo sito ha funzionalità social, è molto probabile che esponga già altri modi per identificare gli utenti amministrativi.
Raphael Marco
2017-05-02 20:26:28 UTC
view on stackexchange narkive permalink

Se l'attaccante ha ottenuto l'accesso al database, può semplicemente creare il proprio hash bcrypt e sostituire quello nel database. Non è necessario decifrare l'hash.

Non se avessero solo accesso in lettura, o ad es.un dump di dati o qualcosa del genere.
Inoltre, anche se hanno accesso in scrittura, non li aiuterebbe a inserire hash bcrypt casuali nel database.Dovrebbero comprendere la crittografia del sistema di autorizzazione affinché possa accettare gli hash e, se possono farlo, possono semplicemente decrittografare gli hash esistenti molto più facilmente.
Non risponde alla domanda.Anche se ciò che proponi è vero, l'attaccante dovrebbe sapere quale sostituire.
@KernelStearns Anche io conosco la crittografia dello schema originale.Devi solo guardare l'hash.È bcrypt con un costo di 10.
@Schroeder Può sostituire tutti gli hash nella tabella (se ha accesso in scrittura) Quindi penso che questa sia una risposta valida alla domanda.
@AjayBrahmakshatriya solo se l'aggressore vuole annunciarsi a voce così alta.Se l'attaccante vuole essere più tattico (e silenzioso), è importante sapere quale account prendere di mira.Quindi, no, questa risposta * ignora e ignora * la domanda, non risponde.
@Schroeder Quello che volevo dire è che potrebbe sostituire uno per uno (e sostituire se non è amministratore).Questo è molto più semplice che cercare di decifrare ogni hash uno per uno.Quindi nascondere lo stato di amministratore non funziona davvero se l'attaccante ha accesso in scrittura su questa tabella.
@AjayBrahmakshatriya per un sistema con migliaia di utenti, è un bel po 'di lavoro.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...