Chiffrement MySQL: keystore

A la veille du début d'un nouvel ensemble pour le cours "Bases de données", nous avons préparé une traduction d'un article utile pour vous.






Le chiffrement transparent des donnĂ©es (TDE) existe depuis longtemps dans Percona Server pour MySQL et MySQL. Mais vous ĂȘtes-vous dĂ©jĂ  demandĂ© comment cela fonctionne sous le capot et quel impact TDE peut avoir sur votre serveur? Dans cette sĂ©rie d'articles, nous examinerons le fonctionnement de TDE en interne. Commençons par le stockage des clĂ©s, car cela est nĂ©cessaire pour que tout cryptage fonctionne. Ensuite, nous examinerons de plus prĂšs le fonctionnement du chiffrement dans Percona Server pour MySQL / MySQL et quelles fonctionnalitĂ©s supplĂ©mentaires sont disponibles dans Percona Server pour MySQL.



Porte-clés MySQL



Les keyring sont des plugins qui permettent au serveur d'interroger, de créer et de supprimer des clés dans un fichier local (keyring_file) ou sur un serveur distant (comme dans HashiCorp Vault). Les clés sont toujours mises en cache localement pour accélérer la récupération.



Les plugins peuvent ĂȘtre divisĂ©s en deux catĂ©gories:



  • Stockage local. Par exemple, un fichier local (nous appelons cela un trousseau de clĂ©s basĂ© sur un fichier).
  • Stockage Ă  distance. Par exemple Vault Server (nous appelons ce trousseau de clĂ©s basĂ© sur le serveur).


Cette séparation 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 également lors du démarrage.



Lors de l'utilisation d'un stockage de fichiers, au dĂ©marrage, tout le contenu du stockage est chargĂ© dans le cache: ID de clĂ©, utilisateur de clĂ©, type de clĂ© et la clĂ© elle-mĂȘme.



Dans le cas d'un coffre-fort principal (tel qu'un serveur Vault), seuls l'ID de clĂ© et l'utilisateur clĂ© sont chargĂ©s au dĂ©marrage, donc l'obtention 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 Ă  partir de Vault uniquement lorsqu'elle est rĂ©ellement nĂ©cessaire. Une fois chargĂ©e, la clĂ© est mise en cache dans la mĂ©moire afin qu'Ă  l'avenir, il ne soit plus nĂ©cessaire d'y accĂ©der via des connexions TLS au serveur Vault. Ensuite, regardons quelles informations sont prĂ©sentes dans le magasin de clĂ©s.



Les informations clés contiennent les éléments suivants:



  • key id — , :

    INNODBKey-764d382a-7324-11e9-ad8f-9cb6d0d5dc99-1
  • key type — , , : «AES», «RSA» «DSA».
  • key length — , AES: 16, 24 32, RSA 128, 256, 512 DSA 128, 256 384.
  • user — . , , Master Key, . keyring_udf, .


La clé est identifiée de maniÚre unique par la paire: key_id, user.



Il existe également des différences dans le stockage et la disposition des clés.



Le stockage des fichiers est plus rapide. On pourrait supposer qu'un stockage de clés est une simple écriture unique d'une clé dans un fichier, mais non - il y a plus d'opérations en cours ici. Toute modification du stockage de fichiers créera d'abord une sauvegarde de tout le contenu. Supposons que le fichier s'appelle my_biggest_secrets, alors la sauvegarde sera my_biggest_secrets.backup. Ensuite, le cache est modifié (les clés sont ajoutées ou supprimées), et si tout réussit, le cache est vidé dans un fichier. Dans de rares cas, comme une panne de serveur, vous pouvez voir ce fichier de sauvegarde. Le fichier de sauvegarde est supprimé la prochaine fois que les clés sont chargées (généralement aprÚs un redémarrage du serveur).



Lors de la sauvegarde ou de la suppression d'une clé dans le référentiel du serveur, le référentiel doit se connecter au serveur MySQL avec les commandes "envoyer la clé" / "demander la suppression de la clé".



Revenons Ă  la vitesse de dĂ©marrage du serveur. Outre le fait que le stockage lui-mĂȘme affecte la vitesse de lancement, il y a Ă©galement la question du nombre de clĂ©s du stockage dont vous avez besoin au dĂ©marrage. Bien sĂ»r, cela est particuliĂšrement important pour le stockage back-end. Au dĂ©marrage, le serveur vĂ©rifie quelle clĂ© est requise pour les tables / tablespaces chiffrĂ©s et demande la clĂ© au stockage. Sur un serveur «propre» avec chiffrement par clĂ© principale, il doit y avoir une clĂ© principale, qui doit ĂȘtre rĂ©cupĂ©rĂ©e du stockage. Cependant, plus de clĂ©s peuvent ĂȘtre nĂ©cessaires, par exemple, lors de la restauration d'une sauvegarde du serveur principal vers un serveur de sauvegarde. Dans de tels cas, une rotation de clĂ© principale doit ĂȘtre fournie. Cela sera discutĂ© plus en dĂ©tail dans les prochains articles, bien que j'aimerais souligner ici que le serveur,l'utilisation de plusieurs clĂ©s principales peut prendre un peu plus de temps Ă  dĂ©marrer, en particulier lors de l'utilisation d'un magasin de clĂ©s cĂŽtĂ© serveur.



Parlons maintenant un peu plus de keyring_file. Lorsque je développais keyring_file, je me demandais également comment vérifier les changements de keyring_file pendant que le serveur fonctionnait. Dans la version 5.7, la vérification était effectuée sur la base des statistiques de fichiers, ce qui n'était pas une solution idéale, et dans la version 8.0, elle était remplacée par une somme de contrÎle SHA256.



La premiÚre fois que vous exécutez keyring_file, les statistiques du fichier et la somme de contrÎle sont calculées et mémorisées par le serveur, et les modifications ne sont appliquées que si elles correspondent. La somme de contrÎle est mise à jour lorsque le fichier est modifié.



Nous avons déjà couvert de nombreuses questions sur les keystores. Cependant, il existe un autre sujet important souvent oublié ou mal compris: le partage des clés entre les serveurs.



Ce que je veux dire? Chaque serveur (par exemple, le serveur Percona) du cluster doit avoir un emplacement distinct sur le serveur Vault oĂč le serveur Percona doit stocker ses clĂ©s. Chaque clĂ© principale stockĂ©e dans le rĂ©fĂ©rentiel contient le GUID du serveur Percona dans son identifiant. Pourquoi c'est important? Imaginez que vous n'ayez qu'un seul serveur Vault et que tous les serveurs Percona du cluster utilisent ce serveur Vault unique. Le problĂšme semble Ă©vident. Si tous les serveurs Percona utilisaient la clĂ© principale sans identificateurs uniques, tels que id = 1, id = 2, etc., alors tous les serveurs du cluster utiliseraient la mĂȘme clĂ© principale. C'est ce que fournit le GUID - la distinction entre les serveurs. Pourquoi alors parler de partage de clĂ©s entre serveurs alors qu'un GUID unique existe dĂ©jĂ ? 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 produit lorsqu'un utilisateur crĂ©e une clĂ©, par exemple, sur serveur1, puis essaie de crĂ©er une clĂ© avec le mĂȘme ID sur serveur2, par exemple:



--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
--1   
--server2:
select keyring_key_store('ROB_1','AES',"543210987654321");
1


Attendre. Les deux serveurs utilisent le mĂȘme serveur Vault, la fonction keyring_key_store ne devrait-elle pas Ă©chouer sur server2? Fait intĂ©ressant, si vous essayez de faire la mĂȘme chose sur le mĂȘme serveur, vous obtenez une erreur:



--server1:
select keyring_key_store('ROB_1','AES',"123456789012345");
1
select keyring_key_store('ROB_1','AES',"543210987654321");
0


C'est vrai, ROB_1 existe déjà.



Discutons d'abord du deuxiĂšme exemple. Comme nous l'avons dit prĂ©cĂ©demment, keyring_vault ou tout autre plugin de trousseau de clĂ©s mettra en cache tous les ID de clĂ© en mĂ©moire. Ainsi, aprĂšs avoir crĂ©Ă© une nouvelle clĂ©, ROB_1 est ajoutĂ© au serveur1, et en plus d'envoyer cette clĂ© Ă  Vault, la clĂ© est Ă©galement ajoutĂ©e au cache. Maintenant, lorsque nous essayons d'ajouter la 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. Server1 et server2 ont des caches séparés. AprÚs avoir ajouté ROB_1 aux caches de clés sur server1 et Vault, les caches de clés sur server2 ne sont pas synchronisés. Il n'y a pas de clé ROB_1 dans le cache sur server2. Ainsi, la clé ROB_1 est écrite dans le keyring_key_store et sur le serveur Vault, qui écrase (!) La valeur précédente. Désormais, la clé ROB_1 sur le serveur Vault est 543210987654321. Fait intéressant, le serveur Vault ne bloque pas de telles actions et écrase facilement l'ancienne valeur.



Nous pouvons maintenant voir pourquoi la division entre les serveurs d'un coffre-fort peut ĂȘtre importante - lorsque vous utilisez keyring_udf et que vous souhaitez stocker des clĂ©s dans un coffre-fort. Comment fournissez-vous cette sĂ©paration sur le serveur Vault?



Il existe deux façons de se diviser en Vault. Vous pouvez crĂ©er diffĂ©rents points de montage pour chaque serveur ou utiliser des chemins diffĂ©rents dans le mĂȘme point de montage. Ceci est mieux illustrĂ© par des exemples. Jetons donc un coup d'Ɠil aux points de montage individuels en premier:



--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 = sever2_mount
token = (...)
vault_ca = (...)


Ici, vous pouvez voir que serveur1 et serveur2 utilisent des points de montage différents. Lors du fractionnement 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/sever2
token = (...)
vault_ca = (...)


Dans ce cas, les deux serveurs utilisent le mĂȘme point de montage, mais des chemins diffĂ©rents. Lorsque le premier secret est crĂ©Ă© sur le serveur1 le long de ce chemin, le coffre-fort crĂ©e automatiquement le rĂ©pertoire «serveur1». Pour server2, tout est pareil. Lorsque vous supprimez le dernier secret dans mount_point / server1 ou mount_point / server2, le serveur Vault supprime Ă©galement ces rĂ©pertoires. Dans le cas oĂč vous utilisez la division de chemin, vous n'avez qu'Ă  crĂ©er un point de montage et modifier les fichiers de configuration afin que les serveurs utilisent des chemins sĂ©parĂ©s. Un point de montage peut ĂȘtre crĂ©Ă© Ă  l'aide d'une requĂȘte HTTP. Avec CURL, cela peut ĂȘtre fait comme ceci:



curl -L -H "X-Vault-Token: TOKEN" –cacert VAULT_CA
--data '{"type":"generic"}' --request POST VAULT_URL/v1/sys/mounts/SECRET_MOUNT_POINT


Tous les champs (TOKEN, VAULT_CA, VAULT_URL, SECRET_MOUNT_POINT) correspondent aux paramĂštres du fichier de configuration. Vous pouvez bien sĂ»r utiliser les utilitaires Vault pour faire de mĂȘme. Mais cela facilite l'automatisation de la crĂ©ation du point de montage. J'espĂšre que vous trouverez ces informations utiles et nous vous verrons dans les prochains articles de cette sĂ©rie.





Lire la suite:






All Articles