Vynucení transparentního šifrování (TDE) v tabulkách MySQL (verze pro Windows)
Provozní prostředí
- MySQL
-
- MySQL 8.0 Community Edition
- Windows
-
- Systém Windows 11
Požadavky
- MySQL
-
- MySQL 8.0 Community Edition
- MySQL 8.0 Enterprise Edition
- Windows
-
- Systém Windows 11
- Windows 10
- Windows Server
-
- Windows Server 2022
- Windows Server 2019
- Windows Server 2016
- Windows Server 2012 R2
předpoklad
- Je nainstalována databáze pro MySQL.
O transparentním šifrování
Enterprise Transparent Data Encryption, jak název napovídá, je šifrovací technologie, která je bezpečnější než cokoli, co ji nemá. Za normálních okolností je to při šifrování často zátěž pro implementátora, protože je nutné provést šifrování a dešifrovací zpracování. Význam tohoto názvu "transparentní" spočívá v tom, že může být zašifrován, aniž by implementátor provedl jakékoli změny v procesu. Pokud tedy na začátku provedete několik změn v nastavení, zbytek bude zašifrován bez povolení, takže se jedná o velmi účinné bezpečnostní opatření.
Jak však napovídá fráze "není třeba nic měnit", pokud se skutečně přihlásíte do databáze, můžete data vidět normálně, a pokud získáte databázový záznam z programu, můžete data vidět normálně. Pokud jsou získaná data šifrována, bude nutné změnit proces, takže nebude odpovídat formulaci "Není třeba proces měnit".
V MySQL je pak zašifrováno to, co přesně je transparentní šifrování, "uložené databázové soubory" nebo "tabulkové soubory" podléhají šifrování. Jak si ověříme později, i když soubor přímo otevřete, pouze jej zašifruje, abyste neviděli jeho obsah, takže je nutné jej provozovat tak, aby nebyl přihlášen do databáze ve skutečném provozu.
Normálně vytvořte tabulku a zkontrolujte její obsah
Nejprve vytvoříme tabulku a budeme normálně nahrávat. Můžete ho vytvořit, jak chcete, ale v tomto případě ho vytvoříme spuštěním SQL ve Workbenchi. V tomto případě plánujeme nastavit transparentní šifrování tabulky, takže databázi vytvoříme normálně.
CREATE DATABASE `test_database`
Stůl je také vyroben normálně. Obsah sloupce může být jakýkoli.
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;
Vložím také náhodný záznam pro kontrolu šifrování.
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');
Když vytvoříte databázi nebo tabulku, vytvoří se ve výchozím nastavení v následující složce.
- C:\ProgramData\MySQL\MySQL Server 8.0\Data
ProgramData
Složka je skrytá, proto ji zviditelněte v nastavení Průzkumníka.
Ve složce je složka s názvem databáze, kterou jste vytvořili, tak ji otevřete.
Uvnitř je soubor tabulka po tabulce.
Otevřete tento soubor v textovém editoru, jako je Poznámkový blok. Vzhledem k tomu, že se jedná o binární soubor, myslím, že je tam v podstatě řádek textu, kterému dobře nerozumím. Pokud se podíváte do spodní části, uvidíte text registrovaného záznamu.
Pokud není tímto způsobem zašifrován, bude obsah záznamu znám i v případě, že je soubor otevřen přímo. Nemusíte se přihlašovat do databáze, abyste věděli, co je uvnitř.
Konfigurace nastavení transparentního šifrování
Chcete-li povolit transparentní šifrování, musíte nainstalovat zásuvný modul. Nejprve zkontrolujte, zda je zásuvný modul součástí příkazu.
Spusťte jej výběrem "MySQL 8.0 Command Line Client" z nabídky Start.
Po zadání hesla a přihlášení zadejte následující příkaz:
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Vzhledem k tomu, že jste jej ještě nenainstalovali, měl by být prázdný.
Nyní nastavíme zásuvný modul. Nejprve vytvořte následující složky: Ve skutečnosti nezáleží na tom, kde jej vytvoříte nebo jaký je název. Zadejte jej jako umístění, kam chcete soubor klíče uložit později.
- C:\ProgramData\MySQL\mysql-keyring
Dále otevřete následující soubor v textovém editoru:
- C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
Na prázdné místo v dolní části přidejte následující text a uložte jej. Pokud nemůžete uložit s oprávněními správce, můžete soubor uložit do jiného umístění a poté soubor přepsat.
early-plugin-load=keyring_file.dll
keyring_file_data=C:\ProgramData\MySQL\mysql-keyring\keyring
Restartujte službu MySQL. Můžete jej také restartovat příkazem.
Po restartování se soubor automaticky vytvoří v zadané složce.
Chcete-li ověřit, zda je modul plug-in nainstalován, opětovným spuštěním příkazu check plug-in.
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Vytvoření šifrované tabulky
Nyní vytvoříme šifrovanou tabulku.
Vytvořte tabulku podobnou té předchozí, ale tentokrát přidejte možnosti ENCRYPTION='Y'
.
Zdá se, že toto nastavení šifrování není v tuto chvíli v grafickém uživatelském rozhraní možné, takže musí být nastaveno příkazem.
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;
Mimochodem, před konfigurací zásuvného modulu, i když se pokusíte vytvořit šifrovanou tabulku, zobrazí se následující chyba.
Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully. キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。
Pokud nemáte žádná data, nevíte, jestli jsou šifrovaná, takže se pokusím dát stejná 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
Vzhledem k tomu, že byl vytvořen soubor tabulky, zkontrolujeme jeho obsah.
Soubor byl zašifrován a obsah záznamu nelze ověřit.
Prozatím se již nemusíte obávat, že by záznamy uvnitř četla třetí strana pouhým přihlášením na server a přímým odcizením souboru tabulky. Implementaci není potřeba vůbec měnit, takže si myslím, že je to snadné nastavení zabezpečení.
Pokud se však přihlásíte do databáze, můžete data normálně zobrazit. Pokud chcete zvýšit úroveň zabezpečení, musíte dobře spravovat přihlašovací účet k databázi a zavést samostatný šifrovací mechanismus.
Převod na šifrovanou tabulku
Pokud původně vytvoříte nešifrovanou tabulku, můžete ji později převést na šifrovanou tabulku. V takovém případě jej můžete převést pomocí následujícího SQL:
use <データベース名>;
ALTER TABLE <テーブル名> ENCRYPTION='Y';
příklad
use test_database;
ALTER TABLE plain_user ENCRYPTION='Y';
Mějte však na paměti, že pokud existuje mnoho záznamů, bude to nějakou dobu trvat, protože všechny soubory tabulky jsou přepsány.