Criptare i dati con MySQL/MariaDB - Parte 2
Passare da dati in chiaro a dati criptati in filesystem
Nella precedente parte disponibile qui abbiamo visto come installare mariadb ultima versione su debian 12 stabile, e come quest’ultimo nella sua configurazione di default salvi su filesystem i dati in chiaro. Oggi vedremo come rendere più sicuri i dati presenti “on-rest” sul server mysql, criptandoli tramite AES-256-CBC.
Vantaggi di criptare i dati a livello Database
Quando si parla di crittazione dei dati, si possono scegliere principalmente due strade: criptare i dati attraverso l’applicazione, oppure applicarli direttamente a livello database. Entrambe queste soluzioni hanno vantaggi e svantaggi. Noi in questo articolo ci concentriamo sulla crittazione lato database.
Vantaggi:
Prestazioni: I database possono utilizzare ottimizzazioni interne per eseguire criptazione/decriptazione in modo più efficiente.
Sicurezza Integrata: I database moderni offrono funzionalità di gestione delle chiavi e criptazione trasparente dei dati (TDE), riducendo il rischio di gestione delle chiavi.
Semplicità: Rimuove la complessità della criptazione dal codice dell'applicazione, riducendo il rischio di errori di implementazione.
Svantaggi:
Dipendenza dal Database: Legare la criptazione al database specifico può ridurre la portabilità e rendere più difficile il passaggio a un altro sistema di database.
Flessibilità Limitata: Meno controllo su come e quando i dati vengono criptati, specialmente se si utilizzano funzionalità di criptazione trasparente.
Costo: Alcuni database possono richiedere licenze aggiuntive per funzionalità avanzate di criptazione.
Utilizzando MariaDB, non sono previsti costi di licenza poichè viene fornito il data-encrypt “on rest” già nella versione community.
Come attivare l'encryption dei dati su MySQL/MariaDB
Ora che abbiamo preso visione dei principali vantaggi di questo sistema, procediamo con la sua attivazione.
Per prima cosa creiamo una directory di lavoro, all’interno della quale inseriremo le chiavi necessarie per eseguire la crittazione dei dati.
mkdir -p /etc/mysql/encryption
cd /etc/mysql/encryption
qui dentro generare 4 chiavi random (ne basta solo una, però in questo modo se vogliamo criptare i dati in database con chiavi diverse in seguito vedremo che potremo specificare chiavi specifiche per determinate tabelle):
# generazione delle chiavi random
echo "1;"$(openssl rand -hex 32) > keys
echo "2;"$(openssl rand -hex 32) >> keys
echo "3;"$(openssl rand -hex 32) >> keys
echo "4;"$(openssl rand -hex 32) >> keys
# e controlliamo che le chiavi siano state generate correttamente tramite
cat keys
# output di esempio
1;d87bd3a4eddbf6ca7312b35f49930833507a7e3470a65a5c0e99525815025afe
2;e916611f0e7d091c33913f3bebd70f475b40dd7fe2f7f63d384ebf4a74181ecf
3;3d69be819dfcf68eb0333651d4d8e88592b56bff59f5e85c774e61129b3b5138
4;e7b0144fa62372278ac25218eb52c61ff8a993c25ec9d2a9edca3aa0355ae0b8
Ora generiamo una password che verrà utilizzata per criptare le chiavi sopra riportate
openssl rand -hex 128 > password_file
Successivamente criptiamo tramite aes-256-cbc le chiavi usando la password sopra generata
openssl enc -aes-256-cbc -md sha1 -pass file:password_file -in keys -out keys.enc
Ora aggiorniamo la configurazione di mariadb per fargli utilizzare la modalità di encrypt dei dati tramite le chiavi sopra generate. Creare il file /etc/mysql/mariadb.conf.d/encryption.cnf
e incollarci il seguente contenuto.
Per semplicità di lettura ho commentato in modo molto verboso le varie configurazioni, qualora alcune di esse non siano chiare contattateci, sapremo darvi maggiori informazioni in merito:
[mariadb]
# Plugin che determina come vengono gestite le chiavi di crittazione da parte di MySQL/MariaDB # rif. https://mariadb.com/kb/en/file-key-management-encryption-plugin/
plugin_load_add = file_key_management
# File che contiene le chiavi criptate generate sopra
file_key_management_filename = /etc/mysql/encryption/keys.enc
# File che contiene la password di decrittazione delle sopracitate chiavi
file_key_management_filekey = FILE:/etc/mysql/encryption/password_file
# Encryption schema utilizzato. Supporta bene solo aes_cbc, non variare.
file_key_management_encryption_algorithm = aes_cbc
# Chiave utilizzata di default per l'encrypt dei dati (è una delle 4 sopra citate)
innodb_default_encryption_key_id = 1
# Qui viene determinato il modo in cui mysql cripta i dati.
# Per il momento la teniamo disattivata per forzare il crypt delle tabelle a mano. Maggiori dettagli di seguito
# rif. https://mariadb.com/kb/en/innodb-enabling-encryption/
# innodb_encrypt_tables = ON
# Qui si abilita l'encrypt dei log
# rif. https://mariadb.com/kb/en/innodb-system-variables/#innodb_encrypt_log
innodb_encrypt_log = ON
# Stabilisce quanto thread vengono utilizzati per l'encrypt dei dati
# rif. https://mariadb.com/kb/en/innodb-system-variables/#innodb_encryption_threads
innodb_encryption_threads = 4
# (opzionale) Qualora si voglia abilitare l'encrypt anche per lo storage engine Aria abilitare # la seguente variabile
aria_encrypt_tables = ON
# Abilita l'encrypt anche per le tabelle e file temporanei oltre che i log binari
encrypt-tmp-disk-tables = 1
encrypt-tmp-files = 1
encrypt_binlog = ON
Come vedete, la variabile innodb_encrypt_tables
al momento è commentata. Tale variabile determina il comportamento di mariadb per quanto concerne la modalità di encrypt delle tabelle. Verrà spiegata in dettaglio nella prossima parte.
Dal momento che è di fondamentale importanza che le chiavi vengano preservate in modo sicuro, di seguito ne restringiamo i permessi il più possibile
chown -R mysql:root /etc/mysql/encryption
chmod 500 /etc/mysql/encryption/
chmod 400 /etc/mysql/encryption/keys.enc
chmod 400 /etc/mysql/encryption/password_file
chmod 644 /etc/mysql/mariadb.conf.d/encryption.cnf
Ora riavviare il server mysql/mariadb per essere certi che le modifiche vengano prese in carico
service mysql restart
(oppure) service mariadb restart
La configurazione è terminata.
Nella prossima parte vedremo alcuni esempi di tabelle criptate, e le varie modalità di encrypt dei dati a seconda di come configureremo il nostro server sql.