Transparent kryptering (TDE) för MySQL-tabeller (Windows)

Datum för skapande av sida :

Miljö för driftbekräftelse

MySQL (på engelska)
  • MySQL 8.0 Community Edition
Windows
  • Windows 11 (på engelska)

Erforderlig miljö

MySQL (på engelska)
  • MySQL 8.0 Community Edition
  • MySQL 8.0 Enterprise Edition
Windows
  • Windows 11 (på engelska)
  • Windows 10 (på engelska)
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

förutsättning

  • MySQL-databasen måste vara installerad

Om transparent kryptering

Transparent Data Encryption (Enterprise Transparent Data Encryption) är en teknik som krypterar som namnet antyder, och det är säkrare än att inte göra detta. Normalt, när kryptering utförs, är det ofta en börda för implementeraren eftersom det är nödvändigt att utföra kryptering och dekrypteringsbearbetning. Innebörden av denna "transparent" är att den kan krypteras utan att implementeraren gör några ändringar i behandlingen. Därför är det en mycket effektiv säkerhetsåtgärd eftersom den krypteras på egen hand efter bara lite justering av inställningarna i början.

Men som frasen "inget behov av att göra några ändringar" antyder, om du faktiskt loggar in i databasen kan du se data normalt, och om du får databasposterna från programmet kan du se data normalt. Om de erhållna uppgifterna är krypterade kommer det att vara nödvändigt att göra ändringar i behandlingen, så det kommer inte att stämma överens med uttalandet "inga ändringar krävs för behandlingen".

Så, vad exakt är transparent kryptering i MySQL, och "lagrade databasfiler" eller "tabellfiler" krypteras. Som jag kommer att kontrollera senare, även om du öppnar filen direkt, är den bara krypterad så att innehållet inte kan ses, så det är nödvändigt att använda den så att den inte loggar in i databasen i faktisk drift.

Skapa en tabell på normalt sätt och kontrollera innehållet

Först ska vi skapa en tabell och en post som vanligt. Du kan skapa den hur du vill, men den här gången kör jag SQL i Workbench för att skapa den. Den här gången planerar vi att konfigurera transparent kryptering för tabellen, så att vi skapar en databas som vanligt.

CREATE DATABASE `test_database`

Jag gör också en tabell som vanligt. Oavsett vad kolumninnehållet är kan det vara 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;

För ett register för att kontrollera 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 skapar en databas eller tabell skapas den som standard i följande mappar:

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

ProgramData Mappen är en dold mapp, så se till att den är synlig i File Explorer-inställningarna.

Inuti mappen finns en mapp med namnet på databasen du skapade, så öppna den.

Inuti finns filer på tabellnivå.

Öppna den här filen i en textredigerare, till exempel Anteckningar. Eftersom det är en binär fil tror jag att det i princip är text som jag inte förstår bra. Om du tittar längst ner ser du texten i den registrerade posten.

Om den inte är krypterad på det här sättet kan du känna till innehållet i posten bara genom att öppna filen direkt. Du behöver inte logga in i databasen för att veta vad som finns inuti.

Konfigurera transparent kryptering

För att aktivera transparent kryptering måste du installera ett plugin. Kontrollera först kommandot för att se om plugin-programmet ingår.

Välj MySQL 8.0 Command Line Client från Start-menyn för att starta den.

När du har angett ditt lösenord och loggat in anger du följande kommando:

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

Jag har inte installerat det ännu, så det borde vara tomt.

Låt oss nu konfigurera plugin-programmet. Skapa först följande mappar: Faktum är att platsen eller namnet du skapar är bra. Ange den som en plats för att spara nyckelfilen senare.

  • C: \\ ProgramData \ MySQL \\ mysql-nyckelring

Öppna sedan följande fil i en textredigerare.

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

Lägg till följande text i det nedre utrymmet och spara den. Om du inte kan spara med administratörsbehörighet kan du spara den på en annan plats och sedan skriva över filen.

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

Starta om MySQL-tjänsten. Du kan starta om den med ett kommando.

Efter omstart kommer filen automatiskt att skapas i den angivna mappen.

Du kan köra kommandot Kontrollera plugin-program igen för att kontrollera att plugin-programmet är installerat.

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

Skapa en krypteringstabell

Nu ska vi skapa en krypterad tabell. Skapa en tabell som liknar den vi hade tidigare, men lägg nu till i alternativen ENCRYPTION='Y' . Den här krypteringsinställningen verkar inte vara konfigurerbar i användargränssnittet just nu, så den måste ställas in med kommandot.

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;

Förresten, innan du ställer in plugin-programmet, även om du försöker skapa en krypteringstabell, kommer du att få följande fel.

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

Om du inte har data vet du inte om den är krypterad, så jag ska försöka lägga in liknande 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 En tabellfil har skapats, så låt oss kontrollera innehållet.

Filen har krypterats och innehållet i posten kan inte verifieras.

För närvarande behöver jag inte längre oroa mig för att kunna läsa posterna inuti bara genom att logga in på servern med en tredje part och stjäla tabellfilen direkt. Jag tycker att det är en enkel säkerhetsinställning eftersom det inte finns något behov av att ändra implementeringen alls.

Men om du loggar in i databasen kan du se data normalt. Om du vill öka säkerhetsnivån måste du hantera databasinloggningskonton och införa en separat krypteringsmekanism.

Konvertera till krypterade tabeller längs vägen

Om du skapar en okrypterad tabell från början kan du konvertera den till en krypterad tabell senare. I så fall kan du konvertera den med följande SQL:

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

exempel

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

Var dock försiktig så att du inte skriver om alla tabellfiler, eftersom det tar lång tid om det finns för många poster.