Appliquer le chiffrement transparent (TDE) sur les tables MySQL (version Windows)

Page mise à jour :
Date de création de la page :

Environnement d’exploitation

MySQL (en anglais)
  • MySQL 8.0 Édition Communauté
Windows
  • Fenêtres 11

Conditions préalables

MySQL (en anglais)
  • MySQL 8.0 Édition Communauté
  • MySQL 8.0 Édition Entreprise
Windows
  • Fenêtres 11
  • Fenêtres 10
Serveur Windows
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

condition préalable

  • Une base de données pour MySQL est installée.

À propos du chiffrement transparent

Enterprise Transparent Data Encryption, comme son nom l’indique, est une technologie de cryptage qui est plus sûre que tout ce qui ne l’est pas. Normalement, lors du chiffrement, c’est souvent une charge pour l’implémenteur car il est nécessaire d’effectuer le traitement de chiffrement et de déchiffrement. La signification de ce nom « transparent » est qu’il peut être chiffré sans que l’implémenteur n’apporte de modifications au processus. Par conséquent, si vous apportez quelques modifications aux paramètres au début, le reste sera crypté sans autorisation, il s’agit donc d’une mesure de sécurité très efficace.

Cependant, comme le suggère l’expression « pas besoin de changer quoi que ce soit », si vous vous connectez réellement à la base de données, vous pouvez voir les données normalement, et si vous obtenez l’enregistrement de la base de données du programme, vous pouvez voir les données normalement. Si les données acquises sont cryptées, il sera nécessaire de modifier le processus, de sorte qu’elles ne correspondront pas à la formulation « Pas besoin de modifier le processus ».

Ensuite, dans MySQL, ce qui est exactement le cryptage transparent est crypté, les « fichiers de base de données stockés » ou les « fichiers de table » sont soumis au cryptage. Comme nous le vérifierons plus tard, même si vous ouvrez le fichier directement, il ne le crypte que pour que vous ne puissiez pas voir le contenu, il est donc nécessaire de l’utiliser pour qu’il ne soit pas connecté à la base de données en fonctionnement réel.

Créez un tableau normalement et vérifiez le contenu

Tout d’abord, créons une table et des enregistrements normalement. Vous pouvez le créer comme vous le souhaitez, mais dans ce cas, nous allons le créer en exécutant SQL dans Workbench. Dans ce cas, nous prévoyons de définir un chiffrement transparent pour la table, nous allons donc créer la base de données normalement.

CREATE DATABASE `test_database`

La table est également faite normalement. Le contenu de la colonne peut être n’importe quoi.

CREATE TABLE `plain_user` (
  `id` int NOT NULL,
  `name` varchar(32) ,
  `age` int ,
  `address` varchar(256) ,
  `phone` varchar(32) ,
  `email` varchar(128) ,
  `remarks` varchar(1024) ,
  `height` decimal(5, 2) ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

Je vais également mettre un enregistrement aléatoire pour vérifier le cryptage.

INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('1','名前1','11','宮城県仙台市1','000-0000-0001','example1@example.com','備考1','170.00');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('2','名前2','12','宮城県仙台市2','000-0000-0002','example2@example.com','備考2','171.01');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('3','名前3','13','宮城県仙台市3','000-0000-0003','example3@example.com','備考3','172.02');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('4','名前4','14','宮城県仙台市4','000-0000-0004','example4@example.com','備考4','173.03');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('5','名前5','15','宮城県仙台市5','000-0000-0005','example5@example.com','備考5','174.04');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('6','名前6','16','宮城県仙台市6','000-0000-0006','example6@example.com','備考6','175.05');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('7','名前7','17','宮城県仙台市7','000-0000-0007','example7@example.com','備考7','176.06');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('8','名前8','18','宮城県仙台市8','000-0000-0008','example8@example.com','備考8','177.07');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('9','名前9','19','宮城県仙台市9','000-0000-0009','example9@example.com','備考9','178.08');
INSERT INTO `test_database`.`plain_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('10','名前10','20','宮城県仙台市10','000-0000-0010','example10@example.com','備考10','179.09');

Lorsque vous créez une base de données ou une table, elle est créée dans le dossier suivant par défaut.

  • C :\ProgramData\MySQL\MySQL Server 8.0\Data

ProgramData Le dossier est masqué, alors rendez-le visible dans les paramètres de l’Explorateur.

Il y a un dossier avec le nom de la base de données que vous avez créée dans le dossier, alors ouvrez-le.

À l’intérieur, il y a un fichier table par table.

Ouvrez ce fichier dans un éditeur de texte tel que le Bloc-notes. Comme il s’agit d’un fichier binaire, je pense qu’il y a essentiellement une ligne de texte que je ne comprends pas bien. Si vous regardez en bas, vous verrez le texte de l’enregistrement enregistré.

S’il n’est pas crypté de cette manière, le contenu de l’enregistrement sera connu même si le fichier est ouvert directement. Vous n’avez pas besoin de vous connecter à la base de données pour savoir ce qu’elle contient.

Configuration des paramètres de chiffrement transparent

Pour activer le chiffrement transparent, vous devez installer un plug-in. Tout d’abord, vérifiez si le plug-in est inclus avec la commande.

Démarrez-le en sélectionnant « MySQL 8.0 Command Line Client » dans le menu Démarrer.

Après avoir saisi votre mot de passe et vous être connecté, entrez la commande suivante :

SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';

Comme vous ne l’avez pas encore installé, il devrait être vide.

Maintenant, configurons le plug-in. Tout d’abord, créez les dossiers suivants : En fait, peu importe où vous le créez ou quel est son nom. Spécifiez-le comme l’emplacement où vous souhaitez enregistrer le fichier de clé ultérieurement.

  • C :\ProgramData\MySQL\trousseau-de-clés mysql

Ensuite, ouvrez le fichier suivant dans un éditeur de texte :

  • C :\ProgramData\MySQL\MySQL Server 8.0\my.ini

Ajoutez le texte suivant dans l’espace vide en bas et enregistrez-le. Si vous ne pouvez pas enregistrer avec des privilèges d’administrateur, vous pouvez l’enregistrer dans un autre emplacement, puis écraser le fichier.

early-plugin-load=keyring_file.dll
keyring_file_data=C:\ProgramData\MySQL\mysql-keyring\keyring

Redémarrez le service MySQL. Vous pouvez également le redémarrer avec la commande.

Lorsque vous redémarrez, le fichier est automatiquement créé dans le dossier spécifié.

Vous pouvez vérifier que le plug-in est installé en exécutant à nouveau la commande check plug-in.

SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';

Création d’une table chiffrée

Créons maintenant une table chiffrée. Créez un tableau similaire au précédent, mais cette fois-ci ajoutez des ENCRYPTION='Y' options. Ce paramètre de chiffrement ne semble pas être possible dans l’interface graphique pour le moment, il doit donc être défini à l’aide d’une commande.

CREATE TABLE `encrypt_user` (
  `id` int NOT NULL,
  `name` varchar(32) ,
  `age` int ,
  `address` varchar(256) ,
  `phone` varchar(32) ,
  `email` varchar(128) ,
  `remarks` varchar(1024) ,
  `height` decimal(5, 2) ,
PRIMARY KEY (`id`)
) ENCRYPTION='Y' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

D’ailleurs, avant que le plug-in ne soit configuré, même si vous essayez de créer une table chiffrée, l’erreur suivante s’affiche.

Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully.
キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。

Si vous n’avez pas de données, vous ne savez pas si elles sont cryptées, donc je vais essayer de mettre les mêmes données.

INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('1','名前1','11','宮城県仙台市1','000-0000-0001','example1@example.com','備考1','170.00');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('2','名前2','12','宮城県仙台市2','000-0000-0002','example2@example.com','備考2','171.01');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('3','名前3','13','宮城県仙台市3','000-0000-0003','example3@example.com','備考3','172.02');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('4','名前4','14','宮城県仙台市4','000-0000-0004','example4@example.com','備考4','173.03');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('5','名前5','15','宮城県仙台市5','000-0000-0005','example5@example.com','備考5','174.04');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('6','名前6','16','宮城県仙台市6','000-0000-0006','example6@example.com','備考6','175.05');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('7','名前7','17','宮城県仙台市7','000-0000-0007','example7@example.com','備考7','176.06');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('8','名前8','18','宮城県仙台市8','000-0000-0008','example8@example.com','備考8','177.07');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('9','名前9','19','宮城県仙台市9','000-0000-0009','example9@example.com','備考9','178.08');
INSERT INTO `test_database`.`encrypt_user` (`id`,`name`,`age`,`address`,`phone`,`email`,`remarks`,`height`) VALUES ('10','名前10','20','宮城県仙台市10','000-0000-0010','example10@example.com','備考10','179.09');

encrypt_user Puisque le fichier table a été créé, vérifions le contenu.

Le fichier a été chiffré et le contenu de l’enregistrement ne peut pas être vérifié.

Pour l’instant, vous n’avez plus à vous soucier de la lecture des enregistrements par un tiers simplement en vous connectant au serveur et en volant directement le fichier de la table. Il n’est pas nécessaire de modifier l’implémentation, donc je pense que c’est un paramètre de sécurité facile.

Cependant, si vous vous connectez à la base de données, vous pouvez voir les données normalement. Si vous souhaitez augmenter le niveau de sécurité, vous devez bien gérer le compte de connexion à la base de données et introduire un mécanisme de cryptage distinct.

Convertir en table chiffrée en cours de route

Si vous créez initialement une table non chiffrée, vous pouvez la convertir en table chiffrée ultérieurement. Dans ce cas, vous pouvez le convertir avec le code SQL suivant :

use <データベース名>;
ALTER TABLE <テーブル名> ENCRYPTION='Y';

exemple

use test_database;
ALTER TABLE plain_user ENCRYPTION='Y';

Cependant, veuillez noter que cela prendra du temps s’il y a beaucoup d’enregistrements car tous les fichiers de table sont réécrits.