Framtvinga transparent kryptering (TDE) på MySQL-tabeller (Windows-version)

Sidan uppdaterad :
Datum för skapande av sida :

Omvärld

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

Förutsättningar

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

  • En databas för MySQL är installerad.

Om transparent kryptering

Enterprise Transparent Data Encryption, som namnet antyder, är en krypteringsteknik som är säkrare än något som inte gör det. Normalt, vid kryptering, är det ofta en börda för implementeraren eftersom det är nödvändigt att utföra kryptering och dekrypteringsbearbetning. Innebörden av detta namn "transparent" är att det kan krypteras utan att implementeraren gör några ändringar i processen. Därför, om du gör några ändringar i inställningarna i början, kommer resten att krypteras utan tillstånd, så det är en mycket effektiv säkerhetsåtgärd.

Men som frasen "inget behov av att ändra något" antyder, om du faktiskt loggar in i databasen kan du se data normalt, och om du hämtar databasposten från programmet kan du se data normalt. Om den inhämtade informationen är krypterad kommer det att vara nödvändigt att ändra processen, så den kommer inte att matcha formuleringen "Inget behov av att ändra processen".

Sedan, i MySQL, krypteras vad som exakt är transparent kryptering, "lagrade databasfiler" eller "tabellfiler" är föremål för kryptering. Som vi kommer att kontrollera senare, även om du öppnar filen direkt, krypterar den den bara så att du inte kan se innehållet, så det är nödvändigt att använda den så att den inte är inloggad i databasen i verklig drift.

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

Först ska vi skapa en tabell och poster normalt. Du kan skapa den hur du vill, men i det här fallet skapar vi den genom att köra SQL i Workbench. I det här fallet planerar vi att ange transparent kryptering för tabellen, så att vi skapar databasen normalt.

CREATE DATABASE `test_database`

Bordet är också gjort normalt. Innehållet i kolumnen kan vara vad 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;

Jag kommer också att lägga in en slumpmässig post 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 mapp.

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

ProgramData Mappen är dold, så gör den synlig i inställningarna för Utforskaren.

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

Inuti finns en tabell-för-tabell-fil.

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

Om den inte krypteras på det här sättet kommer innehållet i posten att vara känt även om filen öppnas direkt. Du behöver inte logga in i databasen för att veta vad som finns inuti.

Konfigurera transparenta krypteringsinställningar

Om du vill aktivera transparent kryptering måste du installera ett plugin-program. Kontrollera först om plugin-programmet ingår i kommandot.

Starta den genom att välja "MySQL 8.0 Command Line Client" från Start-menyn.

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

Eftersom du inte har installerat den ännu bör den vara tom.

Nu ska vi ställa in plugin-programmet. Skapa först följande mappar: Faktum är att det inte spelar någon roll var du skapar det eller vilket namn det är. Ange den plats där du vill 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 tomma utrymmet längst ner 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 också starta om den med kommandot.

När du startar om skapas filen automatiskt i den angivna mappen.

Du kan kontrollera att plugin-programmet är installerat genom att köra kommandot check plug-in igen.

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

Skapa en krypterad tabell

Nu ska vi skapa en krypterad tabell. Skapa en tabell som liknar den föregående, men lägg den här gången till alternativen ENCRYPTION='Y' . Den här krypteringsinställningen verkar inte vara möjlig i det grafiska användargränssnittet just nu, så den måste ställas in med ett 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;

Förresten, innan plugin-programmet konfigureras, även om du försöker skapa en krypterad tabell, kommer följande fel att visas.

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 några data vet du inte om det är krypterat, så jag ska försöka lägga in samma 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 Eftersom tabellfilen har skapats ska vi kontrollera innehållet.

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

För närvarande behöver du inte längre oroa dig för att en tredje part läser posterna inuti bara genom att logga in på servern och stjäla tabellfilen direkt. Det finns inget behov av att ändra implementeringen alls, så jag tycker att det är en enkel säkerhetsinställning.

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

Konvertera till en krypterad tabell längs vägen

Om du först skapar en okrypterad tabell 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';

Observera dock att det tar tid om det finns många poster eftersom alla tabellfiler skrivs om.