Criptare i dati con MySQL/MariaDB - Parte 1
Scopriamo come rendere più sicuri i dati salvati in un database MariaDB
Storicamente, MySQL memorizza i dati in chiaro sul filesystem, esponendo potenzialmente i dati sensibili a rischi di sicurezza. Questo comportamento predefinito rappresentava una vulnerabilità significativa, poiché chiunque avesse accesso al filesystem poteva leggere i dati direttamente dai file di storage del database. Questa situazione richiedeva agli amministratori di database e agli sviluppatori di implementare soluzioni esterne o a livello di applicazione per proteggere i dati sensibili, aumentando la complessità e il carico di lavoro nella gestione della sicurezza dei dati.
In altre parole, in una configurazione standard di mysql è possibile visualizzare il contenuto dei file .idb contenenti i dati delle tabelle in questo modo:
root@myt:/var/lib/mysql/test_plain# strings user.ibd
infimum
supremum
mioutente
mioaltroutente
mioterzoutente
Con il passare del tempo, la necessità di garantire la sicurezza dei dati "at rest" (ossia dei dati memorizzati) è diventata sempre più cruciale. Le normative sulla protezione dei dati e le best practice di sicurezza hanno spinto verso l'adozione di misure di criptazione per prevenire accessi non autorizzati ai dati memorizzati. MySQL ha risposto a queste esigenze introducendo funzionalità di criptazione integrate, permettendo agli amministratori di database di criptare i dati senza dover ricorrere a soluzioni esterne.
Una delle innovazioni più significative in questo ambito è stata l'integrazione della funzione di criptazione dei dati salvati sul file system (Encrypt Data at Rest) nel motore di storage InnoDB. Questa funzionalità consente di criptare i file di dati direttamente sul filesystem, garantendo che i dati siano protetti anche se un malintenzionato riuscisse ad accedere ai file fisici del database. La criptazione dei dati a riposo in InnoDB utilizza chiavi di criptazione gestite dal server, semplificando la gestione delle chiavi e migliorando la sicurezza complessiva del sistema.
In questa serie di articoli vedremo come implementare questa soluzione.
Installare MySQL/MariaDB in Debian latest LTS
Per prima cosa ti occorre un server VPS su cui fare questa installazione. Questo howto si basa su Debian 12, che rappresenta l’ultima versione di Debian al tempo della scrittura di questo articolo e di conseguenza MariaDB versione 10.11.6
Per ottenere un server di sviluppo hai varie possibilità: puoi provare in locale su una tua macchina Linux, oppure puoi utilizzare un virtualizzatore come VirtualBox oppure se vuoi provare su una macchina professionale, scalabile in produzione in pochi click, puoi provare con uno dei nostri server con Debian 12 già installato ed aggiornato. Con le prime due soluzioni dovrai poi replicare successivamente le configurazioni sul server reale, mentre con un server VPS invece potrai tenere l’istanza piccola sintanto stai facendo le tue prove, per poi incrementarne le risorse o aggiungerne il backup quando sarai in produzione. Nel proseguo dell’howto daremo quindi per scontato che hai a disposizione una VPS Debian 12, con accesso di root.
Per prima cosa quindi devi assicurarti di avere aggiornato il sistema operativo:
# apt-get update
# apt-get upgrade
In seguito puoi installare il server mariadb:
# apt-get install mariadb-server
Ora bisogna rendere sicura l’installazione tramite il comando:
# mysql_secure_installation
Qui attraverso un comodo wizard potrete: impostare una password per l’utente root di mysql, rimuovere l’utente anonimo, disabilitare l’accesso remoto come root, rimuovere il database di test, e infine ricaricare i privilegi.
Fatto ciò potete verificare che l’installazione sia andata a buon fine:
# mysql --version
mysql Ver 15.1 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
e che la unit stia girando correttamente:
# systemctl status mariadb
● mariadb.service - MariaDB 10.11.6 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; preset: enabled)
Active: active (running) since Tue 2024-06-18 10:44:16 CDT; 23min ago
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Process: 514 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Process: 517 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 520 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set-environment _>
Process: 629 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 631 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
Main PID: 616 (mariadbd)
Status: "Taking your SQL requests now..."
Tasks: 12 (limit: 4645)
Memory: 248.8M
CPU: 1.473s
CGroup: /system.slice/mariadb.service
└─616 /usr/sbin/mariadbd
[...]
Verifica dati in chiaro sull’installazione di default
Iniziamo ad accedere al server mysql con l’account di root impostato pocanzi:
# mysql -u root -p
Password:
// inserire la password di root impostata pocanzi e sarete all'interno di mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 31
Server version: 10.11.6-MariaDB-0+deb12u1 Debian 12
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Ora procediamo a creare il database, la tabella e alcuni contenuti fittizi e infine usciamo dalla shell di mysql:
MariaDB [(none)]> CREATE DATABASE test_plain;
MariaDB [(none)]> USE test_plain;
MariaDB [(test_plain)]> CREATE TABLE user (id int NOT NULL AUTO_INCREMENT PRIMARY KEY, name text(255), lastname text(255));
MariaDB [(test_plain)]> INSERT INTO user(name,lastname) values('jane','doe');
MariaDB [(test_plain)]> INSERT INTO user(name,lastname) values('john','doe');
MariaDB [(test_plain)]> INSERT INTO user(name,lastname) values('paolino','paperino');
MariaDB [(test_plain)]> quit
Ora individuiamo sul filesystem dove sono i file dei dati di questa tabella. Se avete installato il server in modo standard, la posizione è la seguente:
// Path dei database di mysql
/var/lib/mysql/
// Path dello specifico database creato sopra
/var/lib/mysql/test_plain
// Path del file idb della tabella creata sopra
/var/lib/mysql/test_plain/user.idb
Il file .idb è il file in cui l’engine SQL, INNODB salva i dati presenti in tabella. INNODB è il sistema standard di salvataggio dei dati di Mysql al giorno d’oggi, ha preso il posto del precedente MyISAM. L’encrypt dei dati on-rest è supportato esclusivamente con INNODB.
A questo punto potete accedere a quel file nella modalità che preferite e vedrete che è possibile visualizzare i contenuti della tabella in chiaro. Ad esempio:
# strings /var/lib/mysql/test_plain/user.idb
infimum
supremum
janedoe
johndoe
paolinopaperino
Nella prossima parte vedremo assieme come criptare questi dati in modo sicuro e trasparente per la vostra applicazione.