24. Chiffrement des données au repos
MIRAJ peut chiffrer tout ce qu'il écrit sur disque : tables, valeurs longues, journal, index vectoriels, définitions des vues, déclencheurs, routines et événements. Un disque, une copie du dossier de données ou une sauvegarde volés ne livrent alors rien de lisible sans la phrase secrète du dossier.
Le chiffrement est :
- réservé aux éditions Entreprise et Cluster : les éditions Express et Developer ne le contiennent pas, et refusent d'ouvrir un dossier chiffré (erreur 9001 ou 9048) ;
- décidé à l'initialisation du dossier de données : il s'active sur un dossier neuf et ne s'ajoute pas à un dossier qui contient déjà des bases ;
- réglable par base et par table une fois le dossier chiffré (
ENCRYPTION = 'Y' | 'N').
24.1 Ce qui est protégé, et ce qui ne l'est pas#
Le chiffrement au repos protège contre :
- le vol ou la perte d'un disque, d'une machine arrêtée dont la phrase n'est pas conservée sur place, ou d'un support de sauvegarde ;
- la copie du dossier de données ou d'une sauvegarde par quelqu'un qui n'a pas la phrase ;
- un hébergeur ou un prestataire qui accède aux disques sans accéder au serveur en marche.
Il ne protège pas contre :
- un attaquant administrateur de la machine pendant que le serveur tourne : les données sont en clair dans sa mémoire, comme pour tout serveur de bases de données ;
- le vol de la machine entière quand la phrase est conservée sur cette machine pour le démarrage automatique (24.3) : le fichier de phrase se lit alors avec la machine ;
- les exports que vous demandez vous-même :
SELECT … INTO OUTFILE, scripts demiraj-dump, résultats envoyés aux clients (protégez le réseau par TLS, chapitre 11).
24.2 Initialiser un dossier chiffré#
Le chiffrement se demande au premier démarrage sur un dossier vide, avec une phrase secrète de 12 caractères au moins :
$env:MIRAJ_ENCRYPTION_PASSPHRASE = "une longue phrase que vous seul connaissez"
miraj-server.exe --root D:\donnees --log --data-encryption ONou, serveur arrêté, avec l'outil miraj-keyring (24.7), qui demande la phrase deux fois sans l'afficher :
miraj-keyring init --root D:\donneesLe dossier reçoit alors son trousseau miraj\keyring.mrk. Dès lors, le dossier est chiffré pour toujours : à chaque démarrage, le serveur exige la phrase, que data_encryption soit posé ou non.
--data-encryption ON sur un dossier qui contient déjà des bases est refusé : le chiffrement ne s'ajoute pas à des données existantes. Pour chiffrer une installation existante, créez un dossier chiffré neuf et restaurez-y vos bases avec miraj-dump (chapitre 18).
Gardez la phrase secrète en lieu sûr. Sans elle, ni le dossier de données ni ses sauvegardes ne peuvent être relus : il n'existe aucun moyen de récupération.
24.3 Fournir la phrase au démarrage#
Le serveur lit la phrase, dans cet ordre :
- la variable d'environnement
MIRAJ_ENCRYPTION_PASSPHRASE; - le fichier désigné par
--encryption-passphrase-file(ou la variableencryption_passphrase_filedemiraj_config.xml).
La phrase ne se donne jamais sur la ligne de commande ni en clair dans miraj_config.xml.
Démarrage automatique (Windows). La tâche planifiée qui démarre le serveur au boot ne peut rien demander au clavier. Écrivez le fichier de phrase protégé par DPAPI pour cette machine, puis indiquez-le au serveur :
miraj-keyring write-passphrase-file --root D:\donnees --to C:\ProgramData\MIRAJ\phrase.mrp
icacls C:\ProgramData\MIRAJ\phrase.mrp /inheritance:r /grant:r "*S-1-5-18:F" "*S-1-5-32-544:F"et dans miraj_config.xml :
<encryption_passphrase_file>C:\ProgramData\MIRAJ\phrase.mrp</encryption_passphrase_file>Le fichier n'est lisible que sur cette machine (le compte SYSTEM de la tâche le relit) ; la commande icacls le réserve à SYSTEM et aux administrateurs. Rappel (24.1) : ce mode protège les disques et les sauvegardes volés, pas la machine entière.
Linux et macOS. Le fichier de phrase contient la phrase en texte ; il doit n'être lisible que par son propriétaire (droits 0600), sinon le serveur refuse de démarrer.
24.4 Choisir ce qui est chiffré#
Sur un dossier chiffré, par défaut, tout est chiffré (default_table_encryption = ON). La clause ENCRYPTION permet d'exclure ou d'inclure une base ou une table :
-- Base dont les nouvelles tables et les définitions sont en clair
CREATE DATABASE catalogue_public DEFAULT ENCRYPTION = 'N';
-- Table chiffrée dans cette base malgré tout
CREATE TABLE catalogue_public.tarifs_negocies (id INT PRIMARY KEY, prix DECIMAL(10,2)) ENCRYPTION = 'Y';
-- Changer après coup : la table est réécrite dans le nouveau mode
ALTER TABLE catalogue_public.tarifs_negocies ENCRYPTION = 'N';
-- Base : réglage par défaut des tables créées ensuite, et chiffrement de ses définitions
ALTER DATABASE catalogue_public DEFAULT ENCRYPTION = 'Y';| Élément | Chiffré si |
|---|---|
Fichier d'une table (.mrj, .dmrj) et ses valeurs longues (.bmrj, .dbmrj), graphe vectoriel (.vmrj) | la table est ENCRYPTION = 'Y' |
Journal de la base (journal.mrl) | toujours, sur un dossier chiffré |
Vues, déclencheurs, routines, événements (.mrv, .mrt, .mrp, .mre) | la base est DEFAULT ENCRYPTION = 'Y' |
Comptes (accounts.mra) | toujours (coffre des comptes, chapitre 10) |
ALTER DATABASE … ENCRYPTION ne change pas les tables existantes : il fixe le réglage des tables créées ensuite et réécrit les fichiers des définitions. ALTER TABLE … ENCRYPTION réécrit la table et ses valeurs longues.
Les noms des bases et des tables restent visibles (ce sont des noms de dossiers et de fichiers).
Affichage. SHOW CREATE TABLE montre ENCRYPTION='Y' pour une table chiffrée ; SHOW CREATE DATABASE montre DEFAULT ENCRYPTION='Y' ; les colonnes information_schema.TABLES.CREATE_OPTIONS et information_schema.SCHEMATA.DEFAULT_ENCRYPTION le disent aussi. Les variables @@data_encryption et @@default_table_encryption (lecture seule) donnent l'état du serveur.
Sur un serveur non chiffré, ENCRYPTION = 'N' est accepté sans effet et ENCRYPTION = 'Y' est refusé (erreur 9049).
24.5 Changer la phrase, faire tourner la clé#
Changer la phrase secrète (serveur arrêté) : seul le trousseau est réécrit, les données ne bougent pas.
miraj-keyring change-passphrase --root D:\donnees --write-passphrase-file C:\ProgramData\MIRAJ\phrase.mrpLes sauvegardes faites avant gardent l'ancienne phrase (leur trousseau est celui du moment de la sauvegarde, 24.6).
Faire tourner la clé maîtresse (serveur démarré, privilège ENCRYPTION_KEY_ADMIN) :
ALTER INSTANCE ROTATE MASTER KEY;Une clé maîtresse neuve remplace l'ancienne ; les clés de chaque base sont réenveloppées, les données ne sont pas réécrites. L'opération supporte un arrêt brutal : une rotation interrompue est terminée au démarrage suivant.
24.6 Sauvegardes#
BACKUP DATABASE et miraj-backup copient les fichiers tels qu'ils sont : la copie d'une base chiffrée est chiffrée. Elle emporte le trousseau (keyring.mrk, protégé par la phrase) et son manifeste indique la clé maîtresse (master_key).
miraj-backup verifycontrôle une copie chiffrée sans la phrase (tailles, sommes de contrôle, journal, enveloppes des tables) ;--deepne décode pas le contenu des tables chiffrées sans clé.- La restauration demande un serveur qui a la même clé maîtresse : le serveur d'origine, ou un dossier initialisé à partir de son trousseau. Une copie chiffrée restaurée sur un serveur non chiffré, ou d'une autre clé, reste indisponible (la base est signalée illisible).
Le hors-ligne (miraj-backup --root, miraj-dump --root) lit la phrase comme le serveur : variable MIRAJ_ENCRYPTION_PASSPHRASE, ou encryption_passphrase_file du miraj_config.xml du dossier.
24.7 miraj-keyring#
miraj-keyring s'utilise serveur arrêté (il prend le verrou du dossier).
| Commande | Rôle |
|---|---|
status --root <dossier> | dossier chiffré ou non, clé maîtresse, paramètres de dérivation |
init --root <dossier> [--write-passphrase-file <f>] | chiffre un dossier neuf |
change-passphrase --root <dossier> [--write-passphrase-file <f>] | remplace la phrase |
write-passphrase-file --root <dossier> --to <f> | écrit le fichier de phrase du démarrage automatique |
La phrase actuelle vient de MIRAJ_ENCRYPTION_PASSPHRASE, de --passphrase-file, sinon d'une saisie masquée ; une nouvelle phrase, de --new-passphrase-file ou d'une saisie répétée.
24.8 Journaux du serveur#
Sur un dossier chiffré, server.log et le journal des requêtes lentes (slow.log) masquent les valeurs : les littéraux des requêtes deviennent ? et les valeurs citées par les messages d'erreur '?'. Les noms des tables et des colonnes restent lisibles.
24.9 Bibliothèque embarquée#
La DLL ouvre un dossier chiffré par miraj_server_open_encrypted(root, options, passphrase, create_encrypted, &server) ; create_encrypted non nul initialise chiffré un dossier neuf. miraj_server_open suffit si la phrase est dans MIRAJ_ENCRYPTION_PASSPHRASE.
24.10 Fonctionnement#
Pour les administrateurs qui veulent savoir ce qui est fait :
- la phrase secrète est dérivée par Argon2id (64 Mio, 3 passes) ; la clé obtenue enveloppe la clé maîtresse du dossier (
keyring.mrk), qui enveloppe à son tour une clé de données par base (base.mro, dans le dossier de la base) ; - tout est chiffré en AES-256-GCM, qui authentifie ce qu'il chiffre : un octet modifié, un bloc ou une page déplacés sont refusés à la lecture ;
- chaque fichier garde ses sommes de contrôle, calculées sur le chiffré :
CHECK TABLEet la vérification des sauvegardes détectent les dégâts sans la clé ; - le surcoût est faible sur un processeur récent (instructions AES), et la dérivation de la phrase ajoute une fraction de seconde au démarrage.
24.11 Limites#
- Cluster : le chiffrement ne se combine pas encore avec un nœud de cluster ; le serveur refuse de démarrer si les deux sont demandés.
- Table disque (
ENGINE = Aria) :ALTER TABLE … ENCRYPTIONest refusé tant que la table range déjà des valeurs longues (.dbmrj) dans l'autre mode ; passez-la d'abord en mémoire (ENGINE = MIRAJ), puis de nouveau sur disque. - Restauration sur un autre serveur : elle demande la même clé maîtresse (24.6).
- Le chiffrement ne s'ajoute pas à un dossier existant (24.2).