Ajout doc sur TDE et File Key Management Encryption plugin

This commit is contained in:
Eric Morino 2022-02-16 11:28:44 +01:00
parent 2dd00a9ca8
commit cd7f506310

View file

@ -1896,6 +1896,145 @@ mysql> show variables like '%ssl%';
17 rows in set (0.00 sec)
~~~
## Chiffrement de la base de données Transparent Data Encryption (TDE)
On peux chiffré les bases et les tables avec la méthode Transparent Data Encryption (TDE), cela ne neccessite aucun changement au niveau applicatif pour se connecter à la base de donnée, d'où le therme "Transparent", il existe plusieurs plugins pour faire cela :
* File Key Management Encryption
* Le fichier de clé est stocké dans MariaDB.
* La bonne pratique est de la stocké dans un montage séparé.
* AWS Key Management Encryption Plugin
* La clé est créé et stocké sur AWS, c'est un bon choix si on a une base de données managé chez AWS.
### Mise en place du chiffrement avec File Key Management Encryption
Dans une premier temps on doit créer un dossier où le fichier de clé sera stocké, puis on genère la clé :
~~~
$ mkdir -p /etc/mysql/encryption
$ echo "1;"$(openssl rand -hex 32) > /etc/mysql/encryption/keyfile
$ openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key
$ openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/encryption/keyfile.key -in /etc/mysql/encryption/keyfile -out /etc/mysql/encryption/keyfile.enc
~~~
Puis on supprime la clé originale non chiffré :
~~~
rm -f /etc/mysql/encryption/keyfile
~~~
et on donne les bon droits au dossier / fichiers, on présume ici que l'instance tourne avec l'utilisateur `mysql` :
~~~
$ chown -R mysql:mysql /etc/mysql
$ chmod -R 500 /etc/mysql
$ ls -lRt /etc/mysql
/etc/mysql:
total 0
dr-x------. 2 mysql mysql 44 Mar 22 17:45 encryption
/etc/mysql/encryption:
total 8
-r-x------. 1 mysql mysql 96 Mar 22 17:43 keyfile.enc
-r-x------. 1 mysql mysql 257 Mar 22 17:43 keyfile.key
~~~
Puis on rajoute ceci dans le fichier de configuration, soit dans la section `[mariadb]`, soit dans la section de notre instance, par exemple, `[mysqld1]` :
~~~
plugin_load_add = file_key_management
file_key_management_filename = /etc/mysql/encryption/keyfile.enc
file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key
file_key_management_encryption_algorithm = AES_CBC
innodb_encrypt_tables = FORCE
innodb_encrypt_log = ON
innodb_encrypt_temporary_tables = ON
encrypt_tmp_disk_tables = ON
encrypt_tmp_files = ON
encrypt_binlog = ON
aria_encrypt_tables = ON
innodb_encryption_threads = 4
innodb_encryption_rotation_iops = 2000
~~~
* Dans la première section de la configuration :
* `plugin_load_add` : on charge le plugin `file_key_management`
* `file_key_management_*` : on indique le chemin des clés
* `file_key_management_encryption_algorithm` : on defini l'algorithme de chiffrement, soit `AES_CBC` si MariaDB utilise le binaire `yaSSL` ou `wolfSSL`, soit `AES_CTR` mais ce dernier est disponible seulement si MariaDB utilise le binaire `OpenSSL`
* Dans la seconde section de la configuration :
* `innodb_encrypt_tables` : on force le chiffrement des bases / tables existantes.
* `innodb_encrypt_log` : on chiffre les redo logs
* `innodb_encrypt_temporary_tables` : on chiffre les tables temporaires.
* Autres paramètres intérréssants :
* `encrypt_binlog` : on chiffre les logs binaires.
* `encrypt_tmp_files` : on chiffre les fichiers temporaires.
Une fois la configuration en place, on redémarre MariaDB :
~~~
# systemctl restart mariadb
~~~
Puis on peux vérifié le chiffrement des bases / tables avec cette requête :
~~~
MariaDB [none]> SELECT CASE WHEN INSTR(NAME, '/') = 0
THEN '01-SYSTEM TABLESPACES'
ELSE CONCAT('02-', SUBSTR(NAME, 1, INSTR(NAME, '/')-1)) END
AS "Schema Name",
SUM(CASE WHEN ENCRYPTION_SCHEME > 0 THEN 1 ELSE 0 END) "Tables Encrypted",
SUM(CASE WHEN ENCRYPTION_SCHEME = 0 THEN 1 ELSE 0 END) "Tables Not Encrypted"
FROM information_schema.INNODB_TABLESPACES_ENCRYPTION
GROUP BY CASE WHEN INSTR(NAME, '/') = 0
THEN '01-SYSTEM TABLESPACES'
ELSE CONCAT('02-', SUBSTR(NAME, 1, INSTR(NAME, '/')-1)) END
ORDER BY 1;
;
+-----------------------+------------------+----------------------+
| Schema Name | Tables Encrypted | Tables Not Encrypted |
+-----------------------+------------------+----------------------+
| 01-SYSTEM TABLESPACES | 1 | 0 |
| 02-mysql | 4 | 0 |
+-----------------------+------------------+----------------------+
2 rows in set (0.002 sec)
~~~
Si on tente de lire un fichier .idb d'une table, voici ce qu'on obtient :
~~~
# cd /var/lib/mysql/mysql/
# strings transaction_registry.ibd | head -20
mPQ&
P.S|y
"h_S2$
m,uQ
I0$Y
AhZV
,tp"
Jb4\
TT v
))ok
hByc
- aG
GQQM
nLUZ$
Jb9q
)72B
`dDF'
f=Fb
4 PR
b?;(
~~~
## Optimisation avancée
Voir [/HowtoMySQL/Optimize]().