Gennemsigtig kryptering (TDE) til MySQL-tabeller (Windows)

Dato for oprettelse af side :

Miljø til bekræftelse af handling

MySQL
  • MySQL 8.0 Community Edition
Windows
  • Windows 11

Påkrævet miljø

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

  • MySQL-databasen skal være installeret

Om gennemsigtig kryptering

Transparent Data Encryption (Enterprise Transparent Data Encryption) er en teknologi, der krypterer, som navnet antyder, og det er mere sikkert end ikke at gøre dette. Normalt, når kryptering udføres, er det ofte en byrde for implementereren, fordi det er nødvendigt at udføre kryptering og dekrypteringsbehandling. Betydningen af dette "gennemsigtige" er, at det kan krypteres, uden at implementereren foretager ændringer i behandlingen. Derfor er det en meget effektiv sikkerhedsforanstaltning, fordi den er krypteret alene efter blot en lille justering af indstillingerne i begyndelsen.

Men som sætningen "ingen grund til at foretage ændringer" antyder, hvis du rent faktisk logger ind på databasen, kan du se dataene normalt, og hvis du henter databaseposterne fra programmet, kan du se dataene normalt. Hvis de indhentede data er krypteret, vil det være nødvendigt at foretage ændringer i behandlingen, så den ikke stemmer overens med udsagnet "der kræves ingen ændringer i behandlingen".

Så hvad er egentlig gennemsigtig kryptering i MySQL, og "lagrede databasefiler" eller "tabelfiler" er krypteret. Som jeg vil tjekke senere, selvom du åbner filen direkte, er den kun krypteret, så indholdet ikke kan ses, så det er nødvendigt at betjene det, så det ikke logger ind på databasen i faktisk drift.

Opret en tabel normalt og kontroller indholdet

Lad os først oprette en tabel og en post normalt. Du kan oprette det, som du vil, men denne gang kører jeg SQL i Workbench for at oprette det. Denne gang planlægger vi at opsætte gennemsigtig kryptering til tabellen, så vi opretter en database normalt.

CREATE DATABASE `test_database`

Jeg laver også et bord normalt. Uanset hvad kolonneindholdet er, kan det være det.

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;

Hold en optegnelse 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 mapper:

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

ProgramData Mappen er en skjult mappe, så sørg for, at den er synlig i File Explorer-indstillingerne.

Inde i mappen er der en mappe med navnet på den database, du har oprettet, så åbn den.

Indeni er filer på tabelniveau.

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

Hvis det ikke er krypteret på denne måde, kan du kende indholdet af posten blot ved at åbne filen direkte. Du behøver ikke at logge ind i databasen for at vide, hvad der er indeni.

Konfigurere gennemsigtig kryptering

For at aktivere gennemsigtig kryptering skal du installere et plugin. Kontroller først kommandoen for at se, om plugin'et er inkluderet.

Vælg MySQL 8.0 Command Line Client fra Start-menuen for at starte den.

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

Jeg har ikke installeret det endnu, så det burde være tomt.

Lad os nu konfigurere plugin'et. Opret først følgende mapper: Faktisk er det sted eller navn, du opretter, fint. Angiv den som en placering for at gemme nøglefilen senere.

  • C:\ProgramData\MySQL\mysql-keyring

Åbn derefter følgende fil i en teksteditor.

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

Tilføj følgende tekst til det nederste område, og gem den. Hvis du ikke kan gemme med administratorrettigheder, kan du gemme den på en anden placering og derefter overskrive arkivet.

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

Genstart MySQL-tjenesten. Du kan genstarte den med en kommando.

Efter genstart oprettes filen automatisk i den angivne mappe.

Du kan køre kommandoen Check Plugin igen for at kontrollere, at plugin'et er installeret.

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

Oprettelse af en krypteringstabel

Lad os nu oprette en krypteret tabel. Opret en tabel, der ligner den, vi havde før, men tilføj nu til mulighederne ENCRYPTION='Y' . Denne krypteringsindstilling ser ikke ud til at kunne konfigureres i GUI'en på nuværende tidspunkt, så den skal indstilles med 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 du konfigurerer pluginet, selvom du prøver at oprette en krypteringstabel, vil du modtage 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 data, ved du ikke, om de er krypteret, så jeg vil prøve at lægge lignende 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 Der er oprettet en tabelfil, så lad os tjekke indholdet.

Filen er blevet krypteret, og indholdet af posten kan ikke verificeres.

Indtil videre behøver jeg ikke længere at bekymre mig om at kunne læse optegnelserne indeni blot ved at logge ind på serveren med en tredjepart og stjæle tabelfilen direkte. Jeg synes, det er en nem sikkerhedsindstilling, fordi der ikke er behov for at ændre implementeringen overhovedet.

Men hvis du logger ind i databasen, kan du se dataene normalt. Hvis du vil øge sikkerhedsniveauet, skal du administrere databaselogin-konti og indføre en separat krypteringsmekanisme.

Konverter til krypterede tabeller undervejs

Hvis du opretter en ukrypteret tabel i første omgang, 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';

Pas dog på ikke at omskrive alle tabelfilerne, da det vil tage lang tid, hvis der er for mange poster.