Ajout doc sur TDE et File Key Management Encryption plugin
This commit is contained in:
parent
2dd00a9ca8
commit
cd7f506310
139
HowtoMySQL.md
139
HowtoMySQL.md
|
@ -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]().
|
||||
|
|
Loading…
Reference in a new issue