Transparentní šifrování (TDE) pro tabulky MySQL (Windows)
Prostředí pro potvrzení provozu
- MySQL
-
- MySQL 8.0 Community Edition
- Windows
-
- Systém Windows 11
Požadované prostředí
- MySQL
-
- MySQL 8.0 Community Edition
- MySQL 8.0 Enterprise Edition
- Windows
-
- Systém Windows 11
- Systém Windows 10
- Windows Server
-
- Windows Server 2022
- Windows Server 2019
- Windows Server 2016
- Windows Server 2012 R2
předpoklad
- Musí být nainstalována MySQL databáze
O transparentním šifrování
Transparentní šifrování dat (Enterprise Transparent Data Encryption) je technologie, která šifruje, jak název napovídá, a je bezpečnější než nedělat to. Za normálních okolností je to při provádění šifrování často zátěž pro implementátora, protože je nutné provést zpracování šifrování a dešifrování. Význam tohoto "transparentního" spočívá v tom, že může být zašifrován, aniž by implementátor provedl jakékoli změny ve zpracování. Jedná se tedy o velmi účinné bezpečnostní opatření, protože je zašifrováno samo o sobě již po malém doladění nastavení na začátku.
Jak však napovídá fráze "není třeba provádět žádné změny", pokud se do databáze skutečně přihlásíte, můžete data vidět normálně, a pokud získáte databázové záznamy z programu, můžete data vidět normálně. Pokud jsou získaná data šifrována, bude nutné provést změny ve zpracování, takže nebude odpovídat tvrzení "ve zpracování nejsou vyžadovány žádné změny".
Co přesně je tedy transparentní šifrování v MySQL a "uložené databázové soubory" nebo "soubory tabulek" jsou šifrovány. Jak si ověřím později, i když soubor otevřete přímo, je pouze zašifrovaný, aby nebyl vidět jeho obsah, takže je nutné jej provozovat tak, aby se při skutečném provozu nepřihlašoval do databáze.
Vytvořte tabulku normálně a zkontrolujte její obsah
Nejprve vytvořme tabulku a záznam normálně. Můžete si ho vytvořit, jak chcete, ale tentokrát ho spustím SQL ve Workbenchi. Tentokrát plánujeme nastavit transparentní šifrování pro tabulku, takže budeme databázi vytvářet normálně.
CREATE DATABASE `test_database`
Také normálně vytvářím tabulku. Ať už je obsah sloupce jakýkoli, může být.
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;
Uschovejte si 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ích složkách:
- C:\ProgramData\MySQL\MySQL Server 8.0\Data
ProgramData
Složka je skrytá, takže se ujistěte, že je viditelná v nastavení Průzkumníka souborů.
Uvnitř složky je složka s názvem databáze, kterou jste vytvořili, takže ji otevřete.
Uvnitř jsou soubory na úrovni tabulky.
Otevřete tento soubor v textovém editoru, jako je například Poznámkový blok. Vzhledem k tomu, že se jedná o binární soubor, myslím, že je to v podstatě text, kterému dobře nerozumím. Pokud se podíváte do spodní části, uvidíte text evidovaného záznamu.
Pokud není takto zašifrován, můžete obsah záznamu znát pouhým otevřením souboru přímo. Nemusíte se přihlašovat do databáze, abyste věděli, co je uvnitř.
Nastavení transparentního šifrování
Chcete-li povolit transparentní šifrování, musíte nainstalovat zásuvný modul. Nejprve zkontrolujte příkaz, abyste zjistili, zda je zásuvný modul zahrnut.
Výběrem možnosti Klient příkazového řádku MySQL 8.0 z nabídky Start jej spusťte.
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%';
Ještě jsem ji nenainstaloval, takže by měla být prázdná.
Nyní nakonfigurujeme plugin. Nejprve vytvořte následující složky: Ve skutečnosti je místo nebo název, který vytvoříte, v pořádku. Určete jej jako umístění pro pozdější uložení souboru klíče.
- C:\ProgramData\MySQL\mysql-keyring
Poté otevřete následující soubor v textovém editoru.
- C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
Do spodního prostoru přidejte následující text a uložte jej. Pokud nemůžete uložit soubor s oprávněními správce, můžete jej 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 restartovat pomocí příkazu.
Po restartu se soubor automaticky vytvoří v určené složce.
Můžete znovu spustit příkaz Zkontrolovat zásuvný modul a ověřit, zda je zásuvný modul nainstalován.
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Vytvoření šifrovací tabulky
Nyní vytvoříme zašifrovanou tabulku.
Vytvořte tabulku podobnou té, kterou jsme měli dříve, ale nyní přidejte k možnostem ENCRYPTION='Y'
.
Zdá se, že toto nastavení šifrování není v současné době v grafickém uživatelském rozhraní konfigurovatelné, takže je nutné jej nastavit 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 nastavením pluginu, i když se pokusíte vytvořit šifrovací 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 data, nevíte, jestli jsou zašifrovaná, tak se pokusím dát podobná 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
Byl vytvořen soubor tabulky, pojďme se tedy podívat na jeho obsah.
Soubor byl zašifrován a obsah záznamu nelze ověřit.
Prozatím se již nemusím starat o to, že bych si mohl přečíst záznamy uvnitř jen tím, že se přihlásím na server s třetí stranou a soubor tabulky přímo ukradnu. Myslím, že je to jednoduché nastavení zabezpečení, protože není potřeba vůbec měnit implementaci.
Pokud se však do databáze přihlásíte, můžete data vidět normálně. Pokud chcete zvýšit úroveň zabezpečení, musíte spravovat přihlašovací účty k databázi a zavést samostatný šifrovací mechanismus.
Převod na šifrované tabulky po cestě
Pokud v první řadě vytvoříte nezašifrovanou tabulku, můžete ji později převést na zaš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';
Dávejte však pozor, abyste nepřepsali všechny soubory tabulek, protože pokud bude záznamů příliš mnoho, bude to trvat dlouho.