I file di database di MySQL sono crittografati?

10

Sto provando a memorizzare in modo sicuro le credenziali dell'utente in un database MySQL che è ospitato su un server diverso dall'applicazione (la comunicazione tra i due è sicura).

Ho inizialmente pensato che senza una conoscenza di username / password per MySQL, nessuno potesse accedere e leggere i dati. Tuttavia, mi sono reso conto che potrebbe esserci uno scenario in cui un utente malintenzionato potrebbe ottenere l'accesso a questo server SQL e creare semplicemente una copia dei file di database che si trovano sul disco.

I file di database MySQL archiviati su disco sono crittografati?

Posso leggere direttamente i dati da questi file senza conoscere il mio nome utente / password MySQL? Sto considerando di crittografare e decodificare le credenziali nell'applicazione e di memorizzare solo la versione crittografata nel DB, ma è necessario?

    
posta leopik 30.10.2016 - 11:31
fonte

4 risposte

13

Are MySQL database files that are stored on disk encrypted?

No, non lo sono.

Puoi (relativamente) testarlo facilmente spostando . ibd o . myd file in un altro sistema, dove è ancora possibile leggerli. Oppure puoi semplicemente aprirli e probabilmente vedrai almeno parte del contenuto delle tabelle in testo semplice.

Alcuni motori MySQL forniscono crittografia opzionale, come innodb . MySQL Enterprise Edition fornisce anche la crittografia opzionale.

    
risposta data 30.10.2016 - 13:17
fonte
6

Could I directly read the data from these files without knowing my MySQL username/password?

Hai scommesso.

I am considering to encrypt and decrypt the credentials in the application and store only the encrypted version in the DB, but is this necessary?

Non archiviare le password in chiaro nel tuo database e non utilizzare la crittografia simmetrica (se lo fai, quindi quando la chiave viene rubata insieme alle password crittografate, hai perso).

Il modo di memorizzare le password (ovunque - non importa se le memorizzi in file flat, database o da qualche altra parte ...) è quello di salarle e cancellarle usando una funzione di hash sicura. Una funzione di hash prende una stringa di input e restituisce una stringa a lunghezza fissa di lunghezza fissa come output. Memorizzi questa stringa dall'aspetto casuale nel tuo database.

Quando si desidera verificare se qualcuno ha inserito la password corretta, si esegue la password tramite la funzione hash e si controlla la stringa risultante con la stringa nel database.

In questo modo, le password non sono esposte (le funzioni di hash sono funzioni a senso unico, il che significa che non è possibile invertire la funzione di hash senza uno sforzo tremendo).

Si noti che il semplice hashing della password non è sufficiente. È necessario concatenare un valore salt random alla password prima di eseguire l'hashing e quindi memorizzare sia l'output della funzione hash AND il valore salt nel database. È necessario fare questo per diversi motivi:    1. Se non lo fai, le password identiche daranno un identico       valore hash    2. Qualcuno con un po 'di tempo sulle sue mani potrebbe precalcolare un tavolo di       password hash (tabelle arcobaleno). Usando un valore di sale lo fa       operazione molto più costosa.

Ci sono funzioni di hash disponibili per le password di hashing, per esempio bcrypt. Usa uno di loro invece di rotolare il tuo. NON utilizzare una funzione di hash standard come md5 o sha1. Sono tutti progettati per essere veloci, il che è l'opposto di quello che si desidera in una funzione di hash della password (per rendere più violenti gli attacchi di forza bruta sul file della password quando viene rubato).

    
risposta data 30.10.2016 - 16:10
fonte
1

where an attacker could gain access to this SQL

A questo punto hanno già aggirato la maggior parte dei controlli di sicurezza e hanno accesso ai dati, che di solito è l'obiettivo dell'attacco (il furto delle credenziali viene solitamente effettuato con l'obiettivo di ottenere l'accesso ai dati). Le password degli utenti dovrebbero essere cancellate in modo sicuro (le password native di mysql sono conservate nel database ma probabilmente verranno mantenute non criptate nell'applicazione).

Qualsiasi tipo di crittografia trasparente, come LUKS o FUSE, sarà anche trasparente per un utente malintenzionato con accesso al server in esecuzione.

Potrebbero esserci alcune cose che potresti considerare, come i nomi utente di hashing per renderle più anonime (considera l'attacco di Ashley Maddison) ma senza capire cosa stai ancora cercando di proteggere in questa fase del gioco, è difficile da consigliare. Ti suggerisco di trarre maggiori benefici concentrando la tua attenzione su come impedire a un aggressore di arrivare a questo punto / rilevare un potenziale compromesso del server.

    
risposta data 30.10.2016 - 17:18
fonte
1
Are MySQL database files that are stored on disk encrypted?

No. MySQL no, per impostazione predefinita crittografa i suoi file. Non sei chiaro sul tipo di dati che stai crittografando, ma sembra che la soluzione migliore nel tuo caso sia una soluzione di crittografia basata su colonne. Ciò consentirà di crittografare colonne selezionate contenenti informazioni sensibili e definire criteri / chiavi di crittografia per ogni colonna.

Una buona soluzione dovrebbe anche consentire di avere il controllo sul ciclo di vita dei tasti enc / dec.

Tutto questo può essere molto utile soprattutto per la conformità a qualsiasi serio regolamento privato sulla protezione dei dati.

Questa soluzione "MyDiamo" è un'opzione valida per la crittografia basata su colonne e il prezzo è abbastanza ragionevole.

Se si desidera la crittografia a livello di file, si consiglia di utilizzare la crittografia MySQL Enterprise come suggerito sopra.

    
risposta data 15.12.2016 - 03:57
fonte

Leggi altre domande sui tag