Chiffrement transparent (TDE) pour les tables MySQL (Windows)
Environnement de confirmation de l’opération
- MySQL
-
- MySQL 8.0 Édition Communauté
- Windows
-
- Windows 11
Environnement requis
- MySQL
-
- MySQL 8.0 Édition Communauté
- MySQL 8.0 Édition Entreprise
- Windows
-
- Windows 11
- Windows 10
- Serveur Windows
-
- Windows Server 2022
- Windows Server 2019
- Windows Server 2016
- Windows Server 2012 R2
condition préalable
- La base de données MySQL doit être installée
À propos du chiffrement transparent
Le chiffrement transparent des données (Enterprise Transparent Data Encryption) est une technologie qui crypte comme son nom l’indique, et c’est plus sûr que de ne pas le faire. Normalement, lorsque le chiffrement est effectué, il s’agit souvent d’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 « transparent » est qu’il peut être crypté sans que l’implémenteur n’apporte de modifications au traitement. Par conséquent, il s’agit d’une mesure de sécurité très efficace car elle est cryptée par elle-même après juste quelques ajustements des paramètres au début.
Cependant, comme le suggère l’expression « pas besoin d’apporter de modifications », si vous vous connectez réellement à la base de données, vous pouvez voir les données normalement, et si vous obtenez les enregistrements de base de données du programme, vous pouvez voir les données normalement. Si les données obtenues sont cryptées, il sera nécessaire d’apporter des modifications au traitement, de sorte qu’elles ne correspondront pas à l’énoncé « aucune modification n’est requise au traitement ».
Alors, qu’est-ce que le cryptage transparent dans MySQL, et les « fichiers de base de données stockés » ou les « fichiers de table » sont cryptés. Comme je le vérifierai plus tard, même si vous ouvrez le fichier directement, il n’est crypté que pour que le contenu ne soit pas visible, il est donc nécessaire de le faire fonctionner pour qu’il ne se connecte pas à la base de données en fonctionnement réel.
Créez normalement un tableau et vérifiez le contenu
Tout d’abord, créons normalement une table et un enregistrement. Vous pouvez le créer comme vous le souhaitez, mais cette fois-ci, je vais exécuter SQL dans Workbench pour le créer. Cette fois, nous prévoyons de mettre en place un cryptage transparent pour la table, nous allons donc créer une base de données normalement.
CREATE DATABASE `test_database`
Je fais aussi une table normalement. Quel que soit le contenu de la colonne, il peut l’être.
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;
Conservez un enregistrement 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 par défaut dans les dossiers suivants :
- C :\ProgramData\MySQL\MySQL Server 8.0\Data
ProgramData
Le dossier est un dossier caché, assurez-vous donc qu’il est visible dans les paramètres de l’explorateur de fichiers.
À l’intérieur du dossier se trouve un dossier avec le nom de la base de données que vous avez créée, alors ouvrez-le.
À l’intérieur se trouvent des fichiers au niveau de la 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 du 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, vous pouvez connaître le contenu de l’enregistrement simplement en ouvrant directement le fichier. Vous n’avez pas besoin de vous connecter à la base de données pour savoir ce qu’il y a à l’intérieur.
Mettre en place un chiffrement transparent
Pour activer le cryptage transparent, vous devez installer un plugin. Tout d’abord, vérifiez la commande pour voir si le plugin est inclus.
Sélectionnez MySQL 8.0 Command Line Client dans le menu Démarrer pour le lancer.
Une fois que vous avez entré votre mot de passe et que vous vous êtes connecté, entrez la commande suivante :
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Je ne l’ai pas encore installé, il devrait donc être vide.
Configurons maintenant le plugin. Tout d’abord, créez les dossiers suivants : En fait, le lieu ou le nom que vous créez est bien. Spécifiez-le comme emplacement pour enregistrer le fichier de clé plus tard.
- C :\ProgramData\MySQL\mysql-keyring
Ouvrez ensuite le fichier suivant dans un éditeur de texte.
- C :\ProgramData\MySQL\MySQL Server 8.0\my.ini
Ajoutez le texte suivant à l’espace inférieur et enregistrez-le. Si vous ne pouvez pas l’enregistrer avec des privilèges d’administrateur, vous pouvez l’enregistrer à 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 le redémarrer à l’aide d’une commande.
Après le redémarrage, le fichier sera automatiquement créé dans le dossier spécifié.
Vous pouvez exécuter à nouveau la commande Vérifier le plug-in pour vérifier que le plug-in est installé.
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Création d’une table de chiffrement
Créons maintenant une table chiffrée.
Créez une table similaire à celle que nous avions auparavant, mais ajoutez-la maintenant aux options ENCRYPTION='Y'
.
Ce paramètre de chiffrement ne semble pas être configurable dans l’interface graphique pour le moment, il doit donc être défini par 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 de configurer le plugin, même si vous essayez de créer une table de cryptage, vous recevrez l’erreur suivante.
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 des données similaires.
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
Un fichier de table a été créé, alors vérifions son contenu.
Le fichier a été crypté et le contenu de l’enregistrement ne peut pas être vérifié.
Pour l’instant, je n’ai plus à me soucier de pouvoir lire les enregistrements à l’intérieur simplement en me connectant au serveur avec un tiers et en volant directement le fichier de table. Je pense qu’il s’agit d’un paramètre de sécurité facile car il n’est pas nécessaire de modifier l’implémentation du tout.
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 gérer les comptes de connexion à la base de données et introduire un mécanisme de cryptage distinct.
Convertissez en tables chiffrées en cours de route
Si vous créez une table non chiffrée en premier lieu, 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';
Attention toutefois à ne pas réécrire tous les fichiers de table, car cela prendra beaucoup de temps s’il y a trop d’enregistrements.