à l'approche du lancement d'un nouveau cycle pour le cours nous avons préparé pour vous la traduction d'un article utile.

Le chiffrement transparent des donnĂ©es (Transparent Data Encryption, TDE) est apparu dans et MySQL il y a relativement longtemps. Mais vous ĂȘtes-vous dĂ©jĂ demandĂ© comment cela fonctionne en coulisses et quel impact TDE peut avoir sur votre serveur ? Dans cette sĂ©rie d'articles, nous examinerons comment TDE fonctionne en interne. Commençons par le stockage des clĂ©s, car cela est nĂ©cessaire pour tout chiffrement. Ensuite, nous analyserons en dĂ©tail comment le chiffrement fonctionne dans Percona Server for MySQL/MySQL et quelles fonctionnalitĂ©s supplĂ©mentaires sont disponibles dans Percona Server for MySQL.
MySQL Keyring
Le Keyring est un plugin qui permet au serveur de demander, de créer et de supprimer des clés dans un fichier local (keyring_file) ou sur un serveur distant (par exemple, dans HashiCorp Vault). Les clés sont toujours mises en cache localement pour accélérer leur récupération.
Les plugins peuvent ĂȘtre classĂ©s en deux catĂ©gories :
- Stockage local. Par exemple, un fichier local (nous appelons cela un stockage de clés basé sur des fichiers, file-based keyring).
- Stockage distant. Par exemple, le serveur Vault (nous appelons cela un stockage de clés basé sur un serveur, server-based keyring).
Cette distinction est importante car les différents types de stockage se comportent légÚrement différemment non seulement lors du stockage et de la récupération des clés, mais aussi au moment du démarrage.
En utilisant un stockage basĂ© sur des fichiers, tout le contenu du stockage est chargĂ© en cache au dĂ©marrage : l'identifiant de la clĂ©, l'utilisateur de la clĂ©, le type de clĂ© et la clĂ© elle-mĂȘme.
Dans le cas d'un stockage basĂ© sur un serveur (par exemple, le serveur Vault), seul l'identifiant de la clĂ© et l'utilisateur de la clĂ© sont chargĂ©s au dĂ©marrage, donc la rĂ©cupĂ©ration de toutes les clĂ©s ne ralentit pas le dĂ©marrage. Les clĂ©s sont chargĂ©es paresseusement. Autrement dit, la clĂ© elle-mĂȘme est chargĂ©e depuis Vault uniquement lorsqu'elle est rĂ©ellement nĂ©cessaire. Une fois chargĂ©e, la clĂ© est mise en cache en mĂ©moire afin qu'il ne soit pas nĂ©cessaire de la rĂ©cupĂ©rer Ă nouveau via des connexions TLS au serveur Vault. Ensuite, examinons les informations prĂ©sentes dans le stockage des clĂ©s.
Les informations de la clé contiennent les éléments suivants :
- identifiant de clĂ© â l'identifiant de la clĂ©, par exemple :
INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1 - type de clĂ© â le type de clĂ©, basĂ© sur l'algorithme de chiffrement utilisĂ©, valeurs possibles : «AES», «RSA» ou «DSA».
- longueur de clĂ© â la longueur de la clĂ© en octets, AES : 16, 24 ou 32, RSA 128, 256, 512 et DSA 128, 256 ou 384.
- user â propriĂ©taire de la clĂ©. Si la clĂ© est systĂšme, par exemple, Master Key, ce champ est vide. Si la clĂ© est créée Ă l'aide de keyring_udf, ce champ dĂ©signe le propriĂ©taire de la clĂ©.
- la clĂ© elle-mĂȘme
La clé est identifiée de maniÚre unique par une paire : key_id, user.
Il existe également des différences dans le stockage et la suppression des clés.
Le stockage de fichiers fonctionne plus rapidement. On pourrait supposer que le stockage de clĂ©s consiste simplement Ă Ă©crire une clĂ© une seule fois dans un fichier, mais ce n'est pas le cas â il y a plus d'opĂ©rations ici. Lors de toute modification du stockage de fichiers, une sauvegarde de tout le contenu est d'abord créée. Supposons que le fichier s'appelle my_biggest_secrets, dans ce cas, la sauvegarde sera my_biggest_secrets.backup. Ensuite, le cache est modifiĂ© (des clĂ©s sont ajoutĂ©es ou supprimĂ©es) et, si tout se passe bien, le cache est vidĂ© dans le fichier. Dans de rares cas, comme une panne du serveur, vous pouvez voir ce fichier de sauvegarde. Ce fichier de sauvegarde est supprimĂ© lors du prochain chargement des clĂ©s (gĂ©nĂ©ralement aprĂšs le redĂ©marrage du serveur).
Lors de la sauvegarde ou de la suppression d'une clé dans le stockage serveur, le stockage doit se connecter au serveur MySQL avec les commandes « envoyer la clé » / « demander la suppression de la clé » (« send the key » / « request key deletion »).
Revenons Ă la vitesse de dĂ©marrage du serveur. En plus du fait que la vitesse de dĂ©marrage est affectĂ©e par le stockage lui-mĂȘme, il y a aussi la question du nombre de clĂ©s Ă rĂ©cupĂ©rer dans le stockage lors du dĂ©marrage. Bien sĂ»r, c'est particuliĂšrement important pour les stockages de serveur. Lors du dĂ©marrage, le serveur vĂ©rifie quelle clĂ© est nĂ©cessaire pour les tables/bases de donnĂ©es cryptĂ©es et demande la clĂ© au stockage. Sur un serveur « propre » avec un Master Key â le chiffrement doit avoir une seule Master Key, qui doit ĂȘtre extraite du stockage. Cependant, un plus grand nombre de clĂ©s peut ĂȘtre nĂ©cessaire, par exemple, lorsqu'une sauvegarde est restaurĂ©e d'un serveur principal Ă un serveur de secours. Dans de tels cas, il convient de prĂ©voir une rotation des Master Key. Cela sera abordĂ© plus en dĂ©tail dans de futurs articles, bien que je souhaite ici noter qu'un serveur utilisant plusieurs Master Key peut dĂ©marrer un peu plus lentement, en particulier lors de l'utilisation d'un stockage de clĂ©s serveur.
Maintenant, parlons un peu davantage de keyring_file. Lorsque j'ai développé keyring_file, je m'inquiétais également de savoir comment vérifier les modifications apportées à keyring_file pendant que le serveur est en cours d'exécution. Dans la version 5.7, la vérification se faisait sur la base des statistiques du fichier, ce qui n'était pas une solution idéale, et dans la version 8.0, elle a été remplacée par un contrÎle de somme de contrÎle SHA256.
Lors du premier lancement, keyring_file calcule les statistiques du fichier et la somme de contrÎle, qui sont mémorisées par le serveur, et les modifications ne sont appliquées que si elles correspondent. Lorsque le fichier est modifié, la somme de contrÎle est mise à jour.
Nous avons déjà abordé de nombreuses questions concernant les magasins de clés. Cependant, il y a un autre sujet important qui est souvent oublié ou mal compris : la séparation des clés entre les serveurs.
Que veux-je dire par lĂ ? Chaque serveur (par exemple, Percona Server) dans le cluster doit avoir un espace distinct sur le serveur Vault, oĂč Percona Server doit stocker ses clĂ©s. Dans chaque Master Key stockĂ©, il y a un GUID du serveur Percona Server dans son identifiant. Pourquoi cela est-il important ? Imaginez que vous n'avez qu'un seul serveur Vault et que tous les Percona Server dans le cluster utilisent ce seul serveur Vault. Le problĂšme semble Ă©vident. Si tous les Percona Server utilisaient le Master Key sans identifiants uniques, par exemple, id = 1, id = 2, etc., tous les serveurs du cluster utiliseraient la mĂȘme clĂ© maĂźtre. Ce que garantit le GUID â la dĂ©limitation entre les serveurs. Pourquoi alors parler de sĂ©paration des clĂ©s entre les serveurs, s'il existe dĂ©jĂ un GUID unique ? Il y a un autre plugin â keyring_udf. Avec ce plugin, l'utilisateur de votre serveur peut stocker ses clĂ©s sur le serveur Vault. Le problĂšme se pose lorsque l'utilisateur crĂ©e une clĂ©, par exemple, sur le serveur server1, puis essaie de crĂ©er une clĂ© avec le mĂȘme identifiant sur server2, par exemple :
--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
--1 signifie que l'opération est réussie
--server2:
select keyring_key_store('ROB_1','AES',"543210987654321");
1Attendez. Les deux serveurs utilisent le mĂȘme serveur Vault, la fonction keyring_key_store ne devrait-elle pas Ă©chouer sur le serveur server2 ? Ătonnamment, si vous essayez de faire la mĂȘme chose sur un mĂȘme serveur, vous obtiendrez une erreur :
--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
select keyring_key_store('ROB_1','AES',"543210987654321");
0Correct, ROB_1 existe déjà .
Discutons d'abord du deuxiĂšme exemple. Comme mentionnĂ© prĂ©cĂ©demment, keyring_vault ou tout autre plugin de stockage (keyring) met en cache tous les identifiants de clĂ© en mĂ©moire. Ainsi, aprĂšs la crĂ©ation d'une nouvelle clĂ©, ROB_1 est ajoutĂ© Ă server1, et en plus d'envoyer cette clĂ© au Vault, la clĂ© est Ă©galement ajoutĂ©e au cache. Maintenant, lorsque nous tentons d'ajouter cette mĂȘme clĂ© une deuxiĂšme fois, keyring_vault vĂ©rifie si cette clĂ© existe dans le cache et renvoie une erreur.
Dans le premier cas, la situation est différente. Les serveurs server1 et server2 ont des caches distincts. AprÚs avoir ajouté ROB_1 au cache des clés sur le serveur server1 et au serveur Vault, le cache des clés sur server2 n'est pas synchronisé. Il n'y a pas de clé ROB_1 dans le cache sur server2. Ainsi, la clé ROB_1 est enregistrée dans keyring_key_store et sur le serveur Vault, ce qui écrase en fait (!) la valeur précédente. Maintenant, la clé ROB_1 sur le serveur Vault est égale à 543210987654321. Il est intéressant de noter que le serveur Vault ne bloque pas de telles actions et écrase facilement l'ancienne valeur.
Nous voyons maintenant pourquoi la sĂ©paration par serveurs sur Vault peut ĂȘtre importante â lorsque vous utilisez keyring_udf et souhaitez stocker des clĂ©s dans Vault. Comment assurer une telle sĂ©paration sur le serveur Vault ?
Il existe deux maniĂšres de sĂ©parer sur Vault. Vous pouvez crĂ©er diffĂ©rents points de montage pour chaque serveur ou utiliser diffĂ©rents chemins au sein d'un mĂȘme point de montage. La meilleure façon de le montrer est par des exemples. Commençons donc par des points de montage distincts :
--server1:
vault_url = http://127.0.0.1:8200
secret_mount_point = server1_mount
token = (...)
vault_ca = (...)
--server2:
vault_url = http://127.0.0.1:8200
secret_mount_point = server2_mount
token = (...)
vault_ca = (...)Ici, on peut voir que server1 et server2 utilisent différents points de montage. Lors de la séparation des chemins, la configuration ressemblera à ceci :
--server1:
vault_url = http://127.0.0.1:8200
secret_mount_point = mount_point/server1
token = (...)
vault_ca = (...)
--server2:
vault_url = http://127.0.0.1:8200
secret_mount_point = mount_point/server2
token = (...)
vault_ca = (...)Dans ce cas, les deux serveurs utilisent le mĂȘme point de montage «mount_point», mais des chemins diffĂ©rents. Lors de la crĂ©ation du premier secret sur le serveur server1 Ă ce chemin, le serveur Vault crĂ©e automatiquement le rĂ©pertoire «server1». Pour server2, c'est la mĂȘme chose. Quand vous supprimez le dernier secret dans mount_point/server1 ou mount_point/server2, le serveur Vault supprime Ă©galement ces rĂ©pertoires. Si vous utilisez la sĂ©paration des chemins, vous devez crĂ©er un seul point de montage et modifier les fichiers de configuration pour que les serveurs utilisent des chemins distincts. Le point de montage peut ĂȘtre créé Ă l'aide d'une requĂȘte HTTP. Avec CURL, cela peut se faire comme suit :
curl -L -H "X-Vault-Token: TOKEN" âcacert VAULT_CA
--data '{"type":"generic"}' --request POST VAULT_URL/v1/sys/mounts/SECRET_MOUNT_POINTTous les champs (TOKEN, VAULT_CA, VAULT_URL, SECRET_MOUNT_POINT) correspondent aux paramĂštres du fichier de configuration. Bien sĂ»r, vous pouvez utiliser les utilitaires Vault pour faire la mĂȘme chose. Mais il est plus simple d'automatiser la crĂ©ation du point de montage. J'espĂšre que ces informations vous seront utiles et que nous nous reverrons dans les prochains articles de cette sĂ©rie.
Lire aussi :
Source : habr.com
