Håndhæv gennemsigtig kryptering (TDE) på MySQL-tabeller (Windows-version)

Side opdateret :
Dato for oprettelse af side :

Driftsmiljø

MySQL
  • MySQL 8.0 Community Edition
Windows
  • Windows 11

Forudsætninger

MySQL
  • MySQL 8.0 Community Edition
  • MySQL 8.0 Enterprise Edition
Windows
  • Windows 11
  • Windows 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

forudsætning

  • En database til MySQL er installeret.

Om gennemsigtig kryptering

Enterprise Transparent Data Encryption, som navnet antyder, er en krypteringsteknologi, der er mere sikker end noget, der ikke gør det. Normalt er det ved kryptering ofte en byrde for implementatoren, fordi det er nødvendigt at udføre kryptering og dekrypteringsbehandling. Betydningen af dette navn "gennemsigtig" er, at det kan krypteres, uden at implementatoren foretager ændringer i processen. Derfor, hvis du foretager et par ændringer i indstillingerne i starten, krypteres resten uden tilladelse, så det er en meget effektiv sikkerhedsforanstaltning.

Men som sætningen "ingen grund til at ændre noget" antyder, hvis du rent faktisk logger ind på databasen, kan du se dataene normalt, og hvis du får databaseposten fra programmet, kan du se dataene normalt. Hvis de erhvervede data er krypteret, er det nødvendigt at ændre processen, så den ikke svarer til ordlyden "Ingen grund til at ændre processen".

Derefter krypteres i MySQL, hvad der præcist er gennemsigtig kryptering, "lagrede databasefiler" eller "tabelfiler" er underlagt kryptering. Som vi vil kontrollere senere, selvom du åbner filen direkte, krypterer den den kun, så du ikke kan se indholdet, så det er nødvendigt at betjene den, så den ikke er logget ind på databasen i faktisk drift.

Opret en tabel normalt, og kontroller indholdet

Lad os først oprette en tabel og poster normalt. Du kan oprette det, som du vil, men i dette tilfælde opretter vi det ved at udføre SQL i Workbench. I dette tilfælde planlægger vi at indstille gennemsigtig kryptering til tabellen, så vi opretter databasen normalt.

CREATE DATABASE `test_database`

Bordet er også lavet normalt. Indholdet af kolonnen kan være hvad som helst.

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;

Jeg vil også indsætte en tilfældig post for at kontrollere krypteringen.

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');

Når du opretter en database eller tabel, oprettes den som standard i følgende mappe.

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

ProgramData Mappen er skjult, så gør den synlig i Explorer-indstillingerne.

Der er en mappe med navnet på den database, du oprettede i mappen, så åbn den.

Inde er der en tabel-for-tabel fil.

Åbn denne fil i en teksteditor som Notesblok. Da det er en binær fil, tror jeg, at der dybest set er en tekstlinje, som jeg ikke forstår godt. Hvis du ser nederst, vil du se teksten i den registrerede post.

Hvis det ikke er krypteret på denne måde, vil indholdet af posten være kendt, selvom filen åbnes direkte. Du behøver ikke at logge ind på databasen for at vide, hvad der er indeni.

Konfiguration af gennemsigtige krypteringsindstillinger

For at aktivere gennemsigtig kryptering skal du installere et plug-in. Kontroller først, om plug-in'et er inkluderet i kommandoen.

Start det ved at vælge "MySQL 8.0 Command Line Client" fra Start-menuen.

Når du har indtastet din adgangskode og logget ind, skal du indtaste følgende kommando:

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

Da du ikke har installeret det endnu, skal det være tomt.

Lad os nu konfigurere plug-in'et. Opret først følgende mapper: Faktisk betyder det ikke noget, hvor du opretter det, eller hvilket navn det er. Angiv det som den placering, hvor du vil gemme nøglefilen senere.

  • C:\ProgramData\MySQL\mysql-nøglering

Åbn derefter følgende fil i en teksteditor:

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

Tilføj følgende tekst til det tomme rum nederst, og gem det. Hvis du ikke kan gemme med administratorrettigheder, kan du gemme den et andet sted og derefter overskrive filen.

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

Genstart MySQL-tjenesten. Du kan også genstarte den med kommandoen.

Når du genstarter, oprettes filen automatisk i den angivne mappe.

Du kan kontrollere, at plug-in'en er installeret, ved at køre kommandoen check plug-in igen.

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

Oprette en krypteret tabel

Lad os nu oprette en krypteret tabel. Opret en tabel, der ligner den forrige, men denne gang tilføj til ENCRYPTION='Y' indstillingerne. Denne krypteringsindstilling ser ikke ud til at være mulig i GUI'en på nuværende tidspunkt, så den skal indstilles med en kommando.

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;

Forresten, før plug-in er konfigureret, selvom du forsøger at oprette en krypteret tabel, vises følgende fejl.

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

Hvis du ikke har nogen data, ved du ikke, om de er krypteret, så jeg vil prøve at lægge de samme data.

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 Da tabelfilen er oprettet, lad os kontrollere indholdet.

Filen er krypteret, og indholdet af posten kan ikke bekræftes.

I øjeblikket behøver du ikke længere bekymre dig om, at en tredjepart læser posterne inde bare ved at logge ind på serveren og stjæle tabelfilen direkte. Der er slet ingen grund til at ændre implementeringen, så jeg synes, det er en nem sikkerhedsindstilling.

Men hvis du logger ind på databasen, kan du se dataene normalt. Hvis du vil øge sikkerhedsniveauet, skal du administrere databasens loginkonto godt og introducere en separat krypteringsmekanisme.

Konverter til en krypteret tabel undervejs

Hvis du først opretter en ukrypteret tabel, kan du konvertere den til en krypteret tabel senere. I så fald kan du konvertere det med følgende SQL:

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

eksempel

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

Bemærk dog, at det vil tage tid, hvis der er mange poster, fordi alle tabelfilerne omskrives.