Transparante versleuteling (TDE) afdwingen op MySQL-tabellen (Windows-versie)

Pagina bijgewerkt :
Aanmaakdatum van pagina :

Werkomgeving

Mijn SQL
  • MySQL 8.0 Community-editie
Ramen
  • Vensters 11

Voorwaarden

Mijn SQL
  • MySQL 8.0 Community-editie
  • MySQL 8.0 Enterprise-editie
Ramen
  • Vensters 11
  • Vensters 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

voorwaarde

  • Er is een database voor MySQL geïnstalleerd.

Informatie over transparante versleuteling

Enterprise Transparent Data Encryption is, zoals de naam al aangeeft, een versleutelingstechnologie die veiliger is dan alles wat dat niet doet. Normaal gesproken is het bij het versleutelen vaak een last voor de uitvoerder omdat het nodig is om versleuteling en decoderingsverwerking uit te voeren. De betekenis van deze naam "transparant" is dat het kan worden versleuteld zonder dat de uitvoerder wijzigingen in het proces aanbrengt. Daarom, als u in het begin een paar wijzigingen in de instellingen aanbrengt, wordt de rest zonder toestemming versleuteld, dus het is een zeer effectieve beveiligingsmaatregel.

Echter, zoals de uitdrukking "het is niet nodig om iets te wijzigen" suggereert, als u daadwerkelijk inlogt op de database, kunt u de gegevens normaal zien, en als u het databaserecord van het programma krijgt, kunt u de gegevens normaal zien. Als de verkregen gegevens versleuteld zijn, zal het nodig zijn om het proces te wijzigen, zodat het niet overeenkomt met de formulering "Het is niet nodig om het proces te wijzigen".

Vervolgens wordt in MySQL wat precies transparante codering is, versleuteld, "opgeslagen databasebestanden" of "tabelbestanden" zijn onderworpen aan codering. Zoals we later zullen controleren, zelfs als u het bestand rechtstreeks opent, versleutelt het het alleen zodat u de inhoud niet kunt zien, dus het is noodzakelijk om het zo te bedienen dat het niet wordt ingelogd op de database in de werkelijke werking.

Maak normaal een tabel en controleer de inhoud

Laten we eerst een tabel maken en normaal opnemen. Je kunt het maken zoals je wilt, maar in dit geval maken we het door SQL uit te voeren in Workbench. In dit geval zijn we van plan om transparante versleuteling voor de tabel in te stellen, zodat we de database normaal zullen maken.

CREATE DATABASE `test_database`

De tafel is ook normaal gemaakt. De inhoud van de column kan van alles zijn.

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;

Ik zal ook een willekeurig record invoeren om de codering te controleren.

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

Wanneer u een database of tabel maakt, wordt deze standaard in de volgende map gemaakt.

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

ProgramData De map is verborgen, dus maak deze zichtbaar in de instellingen van de Verkenner.

Er is een map met de naam van de database die je hebt gemaakt in de map, dus open deze.

Binnenin is er een tabel-voor-tabel bestand.

Open dit bestand in een teksteditor zoals Kladblok. Omdat het een binair bestand is, denk ik dat er in feite een regel tekst is die ik niet goed begrijp. Als je onderaan kijkt, zie je de tekst van het geregistreerde record.

Als het niet op deze manier is versleuteld, is de inhoud van het record bekend, zelfs als het bestand rechtstreeks wordt geopend. U hoeft niet in te loggen op de database om te weten wat erin staat.

Instellingen voor transparante versleuteling configureren

Om transparante versleuteling in te schakelen, moet u een plug-in installeren. Controleer eerst of de plug-in bij de opdracht is inbegrepen.

Start het door "MySQL 8.0 Command Line Client" te selecteren in het menu Start.

Nadat u uw wachtwoord hebt ingevoerd en bent ingelogd, voert u de volgende opdracht in:

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

Aangezien je het nog niet hebt geïnstalleerd, zou het leeg moeten zijn.

Laten we nu de plug-in instellen. Maak eerst de volgende mappen: In feite maakt het niet uit waar je het maakt of welke naam het heeft. Geef het op als de locatie waar u het sleutelbestand later wilt opslaan.

  • C:\ProgramData\MySQL\mysql-keyring

Open vervolgens het volgende bestand in een tekstverwerker:

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

Voeg de volgende tekst toe aan de lege ruimte onderaan en sla deze op. Als u niet kunt opslaan met beheerdersrechten, kunt u het bestand op een andere locatie opslaan en het bestand overschrijven.

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

Start de MySQL-service opnieuw. U kunt het ook opnieuw opstarten met de opdracht.

Wanneer u opnieuw opstart, wordt het bestand automatisch gemaakt in de opgegeven map.

U kunt controleren of de plug-in is geïnstalleerd door de opdracht plug-in controleren opnieuw uit te voeren.

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

Een versleutelde tabel maken

Laten we nu een versleutelde tabel maken. Maak een tabel die lijkt op de vorige, maar voeg deze keer toe aan de ENCRYPTION='Y' opties. Deze encryptie-instelling lijkt op dit moment niet mogelijk te zijn in de GUI, dus deze moet worden ingesteld met een commando.

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;

Trouwens, voordat de plug-in wordt geconfigureerd, zelfs als u een versleutelde tabel probeert te maken, wordt de volgende fout weergegeven.

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

Als je geen gegevens hebt, weet je niet of ze versleuteld zijn, dus ik zal proberen dezelfde gegevens te plaatsen.

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 Aangezien het tabelbestand is gemaakt, laten we de inhoud controleren.

Het bestand is versleuteld en de inhoud van het record kan niet worden geverifieerd.

Voorlopig hoeft u zich geen zorgen meer te maken dat een derde partij de records binnenin leest door gewoon in te loggen op de server en het tabelbestand rechtstreeks te stelen. Het is helemaal niet nodig om de implementatie te veranderen, dus ik denk dat het een gemakkelijke beveiligingsinstelling is.

Als u echter inlogt op de database, kunt u de gegevens normaal zien. Als u het beveiligingsniveau wilt verhogen, moet u het inlogaccount van de database goed beheren en een apart coderingsmechanisme invoeren.

Converteer onderweg naar een versleutelde tabel

Als u in eerste instantie een niet-versleutelde tabel maakt, kunt u deze later converteren naar een versleutelde tabel. In dat geval kun je het converteren met de volgende SQL:

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

voorbeeld

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

Houd er echter rekening mee dat het enige tijd zal duren als er veel records zijn, omdat alle tabelbestanden worden herschreven.