Prima di decidere su tali questioni di sicurezza, è necessario valutare il modello di minaccia. Senza avere idea di cosa si stia difendendo, è probabile che qualsiasi misura adottata abbia scarso valore.
Ora, ci sono alcune cose di cui potresti preoccuparti in questo contesto:
- Attaccanti che ottengono l'accesso fisico ai tuoi dati (ad es. Irruzione nel data center, furto di nastri di backup, ecc.)
- Attaccanti che ottengono l'accesso in lettura al database non elaborato
- Attaccanti che compromettono l'applicazione, ad es. Tramite iniezione SQL, sovraccarichi del buffer, ecc.
Per il primo scenario, l'archiviazione del database e di tutti i backup su volumi crittografati dovrebbe funzionare, a condizione che il server sia senza testa: rubare il server o i nastri richiederebbe quindi di interrompere la crittografia a livello del disco.
Per il secondo scenario, la crittografia dei dati del database aiuta, ma solo se non si memorizzano le chiavi o le passphrase richieste ovunque.
Nel terzo scenario, tutto dipende dal contesto in cui si verifica l'attacco: se si tratta, ad esempio, di un attacco XSS o CSRF, un utente malintenzionato può fare tutto ciò che l'utente legittimo può fare e la crittografia dei dati non aiuta affatto .
Il modello di minaccia, quindi, è un utente malintenzionato che ottiene l'accesso in lettura al database non elaborato, trovando le credenziali di accesso e riuscendo a accedere al server del database dall'esterno o ottenendo l'accesso root al server del database. Un percorso tipico è innanzitutto ottenere l'accesso alla shell sul server Web; da lì, un utente malintenzionato può quindi leggere le credenziali di accesso dal file di configurazione e connettersi al database.
Un'ulteriore considerazione è dove conservi le chiavi e le passphrase, specialmente se stai usando una piattaforma con un modello di esecuzione senza stato come PHP. Idealmente, il cliente deve digitare la propria passphrase quando richiesto e tenerlo solo in memoria, o ancora meglio, eseguire la decodifica lato client (ma ciò non è spesso fattibile). Su una piattaforma stateless, lo stato viene generalmente portato avanti utilizzando sessioni, memcache, database o file flat; ma tutti questi sono molto più vulnerabili che mantenere lo stato nella memoria di un'applicazione Web stateful. Evitare questo è un problema di gallina e uovo, perché se si crittografa lo stato prima di persisterlo, si è appena creato un altro segreto che è necessario ricordare in modo sicuro. Ricordare la passphrase sul client e inviarla insieme ad ogni richiesta che ne ha bisogno potrebbe essere la soluzione meno orribile in quel momento;