Protezione delle password del DB


18

Osservando la struttura della maggior parte dei siti Web basati su PHP / MySQL che ho visto, sembra che non sia terribilmente difficile discernere la password del database se si scava un po ', poiché c'è sempre un file di installazione o configurazione che memorizza le informazioni per la registrazione nel DB. A parte la precauzione di base per assicurarsi che i privilegi del mio database siano adeguatamente limitati per le richieste remote, quali opzioni sono disponibili che potrei implementare nei miei progetti per proteggere queste informazioni?


1
Per chiarire: stai chiedendo di archiviare le credenziali per accedere al database dal sito Web e non come archiviare correttamente le password per gli utenti del sito Web all'interno del database, giusto?
Joe

Corretta; è quello a cui sto arrivando.
Kaji,

Risposte:


10

Non è una risposta diretta sull'archiviazione delle password, ma generalmente utilizzo almeno due connessioni al database durante la creazione di webapp: una è utilizzata il 99% delle volte per attività correlate all'utente, con privilegi limitati e l'altra è utilizzata per la funzionalità "admin" (elimina utenti, ecc.).

In alcuni casi, in cui sto installando il pacchetto di qualcun altro, installerò due istanze ... un'istanza pubblica che ha accesso al database solo per fare le cose di tipo utente generale, e una seconda istanza che è limitata IP a la mia sottorete locale (possibilmente anche su una macchina diversa) che deve essere utilizzata per qualsiasi attività di tipo "admin". Nessuno dei due ha accesso alla modifica delle tabelle, ecc., Tuttavia ... Preferirei accedere agli strumenti del database nativo piuttosto che consentire alla webapp di eseguire le proprie attività di aggiornamento che non sono state verificate.

Puoi prenderlo ancora di più e aggiungere ulteriori connessioni specificamente per determinate attività ... quindi le attività di creazione e gestione della password dell'utente passano attraverso un utente che ha privilegi extra sulle tabelle degli utenti, l'accesso ha i privilegi del database per l'autenticazione e non molto altro , eccetera.

In questo modo, se c'è un attacco di sql injection, sulla maggior parte delle pagine web non può davvero fare nulla di significativo - non può vedere gli hash delle password, non può aggiungere un nuovo utente amministratore (non che sarebbero in grado di fare comunque), ecc. Non sarà comunque d'aiuto se riusciranno a ottenere una shell sul tuo computer, ma li rallenterà.


1
Facciamo qualcosa di simile. Tuttavia, generalmente creiamo un nuovo account per ogni utente / applicazione del database invece di farlo per funzionalità. Questo risolve due problemi per noi: 1) possiamo differenziare l'utilizzo del database in strumenti come OEM (ovvero, possiamo vedere chi sta martellando il database con granularità) e 2) possiamo personalizzare individualmente ciò che ogni utente vede e ha accesso all'interno del Banca dati.
ScottCher,


4

Sono un grande fan dell'utilizzo dell'autenticazione "Ident" di PostgreSQL su socket locali ogni volta che posso. In questo modo, gli utenti locali vengono mappati direttamente agli utenti Unix / Windows del computer locale e non devo preoccuparmi di archiviare le password. Tuttavia, non penso che questa sia un'opzione in MySQL.

Laddove il database e il server Web si trovano su due macchine separate, utilizzo le password MD5 su SSL: se un ostile ha accesso al mio server frontend, è solo una questione di tempo prima che capisca come comunica con il database.


3

Se si utilizza .NET Framework, è possibile esaminare le stringhe di connessione crittografate. Non so se una cosa del genere sia possibile in altre lingue / framework, ma sarebbe un'altra garanzia per assicurarsi che le connessioni non vengano compromesse.

Al di fuori dell'utilizzo di stringhe di connessione crittografate, l'utilizzo di LDAP / Kerberos / Active Directory sarà l'opzione più sicura.


3

Se le tue password sono memorizzate in testo semplice, usa gli hash (MD5, SHA), Luke!


L'OP non chiede informazioni sulla memorizzazione delle password degli utenti. Ma sì, sicuramente hash le tue password utente, ma non utilizzare mai MD5 o la famiglia SHA per farlo! Usa bcrypt o PBKDF2. Altrimenti ti troverai presto nelle notizie come queste aziende che hanno usato MD5 e SHA1 e quindi esposto i loro utenti a semplici attacchi di forza bruta.
Nick Chammas,

Certo, la salatura e altre tecniche sono necessarie oltre all'hashish. E non si dovrebbe mai implementare lui stesso (le stesse) cripto-primitivi, ma piuttosto usare alcune librerie di criptovalute ampiamente testate.
Yasir Arsanukaev,

2

A seconda del linguaggio di programmazione, è possibile crittografare le credenziali di accesso, ma se si esegue un linguaggio interpretato, non è possibile assicurarsi che qualcuno non riesca a capire le credenziali se accedono al sistema.

Se stai eseguendo C ++ o simili, ti consiglio di creare / trovare una funzione di crittografia / decrittografia salata ed eseguire le credenziali attraverso quella e archiviare l'hash risultante come file sul sistema.

Se stai eseguendo PHP o simili, ti consiglio di scrivere un wrapper per mcrypt_encrypt()e salare le credenziali, quindi eseguire un po 'di offuscamento del codice per rallentare eventuali hacker se ottengono l'accesso al sistema.


Se si crittografano le credenziali, è necessario qualche altro segreto per decrittografarle di nuovo. O in alternativa, il modulo crittografato diventa il segreto, quindi un utente malintenzionato potrebbe utilizzarlo. Mancano alcuni dettagli.
Peter Eisentraut,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.