Transparentné šifrovanie (TDE) pre tabuľky MySQL (Windows)
Prostredie na potvrdenie prevádzky
- MySQL
-
- Komunitné vydanie MySQL 8.0
- Windows
-
- Okná 11
Požadované prostredie
- MySQL
-
- Komunitné vydanie MySQL 8.0
- MySQL 8.0 Enterprise Edition
- Windows
-
- Okná 11
- Windows 10
- Windows Server
-
- Windows Server 2022
- Windows Server 2019
- Windows Server 2016
- Windows Server 2012 R2
Predpokladom
- Musí byť nainštalovaná databáza MySQL
Informácie o transparentnom šifrovaní
Transparentné šifrovanie údajov (Enterprise Transparent Data Encryption) je technológia, ktorá šifruje, ako už názov napovedá, a je bezpečnejšia, ako to nerobiť. Za normálnych okolností je pri vykonávaní šifrovania často záťažou pre implementátora, pretože je potrebné vykonať šifrovanie a dešifrovanie. Význam tohto "transparentného" je, že ho možno zašifrovať bez toho, aby implementátor vykonal akékoľvek zmeny v spracovaní. Ide teda o veľmi účinné bezpečnostné opatrenie, pretože sa šifruje sám o sebe už po malom doladení nastavení na začiatku.
Ako však naznačuje fráza "nie je potrebné robiť žiadne zmeny", ak sa skutočne prihlásite do databázy, môžete vidieť údaje normálne, a ak získate databázové záznamy z programu, môžete ich vidieť normálne. Ak sú získané údaje šifrované, bude potrebné vykonať zmeny v spracovaní, takže sa nebudú zhodovať s tvrdením "v spracovaní nie sú potrebné žiadne zmeny".
Čo presne je teda transparentné šifrovanie v MySQL a "uložené databázové súbory" alebo "tabuľkové súbory" sú šifrované. Ako skontrolujem neskôr, aj keď súbor otvoríte priamo, je len zašifrovaný tak, aby nebolo vidieť obsah, takže je potrebné ho ovládať tak, aby sa v skutočnej prevádzke neprihlásil do databázy.
Vytvorte tabuľku normálne a skontrolujte obsah
Najprv vytvoríme tabuľku a záznam normálne. Môžete si ho vytvoriť, ako chcete, ale tentoraz spustím SQL v Workbench, aby som ho vytvoril. Tentokrát plánujeme nastaviť transparentné šifrovanie tabuľky, takže databázu vytvoríme normálne.
CREATE DATABASE `test_database`
Tiež normálne robím stôl. Nech už je obsah stĺpca akýkoľvek, môže byť.
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;
Uchovávajte záznam a skontrolujte šifrovanie.
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');
Keď vytvoríte databázu alebo tabuľku, predvolene sa vytvorí v nasledujúcich priečinkoch:
- C:\ProgramData\MySQL\MySQL Server 8.0\Data
ProgramData
Priečinok je skrytý priečinok, preto sa uistite, že je viditeľný v nastaveniach Prieskumníka.
Vo vnútri priečinka sa nachádza priečinok s názvom databázy, ktorú ste vytvorili, preto ho otvorte.
Vo vnútri sú súbory na úrovni tabuľky.
Otvorte tento súbor v textovom editore, ako je napríklad Poznámkový blok. Keďže ide o binárny súbor, myslím si, že je tam v podstate text, ktorému dobre nerozumiem. Ak sa pozriete dole, uvidíte text registrovaného záznamu.
Ak nie je zašifrovaný týmto spôsobom, môžete zistiť obsah záznamu jednoduchým otvorením súboru. Nemusíte sa prihlasovať do databázy, aby ste vedeli, čo je vo vnútri.
Nastavenie transparentného šifrovania
Ak chcete povoliť transparentné šifrovanie, musíte nainštalovať doplnok. Najprv skontrolujte príkaz, aby ste zistili, či je doplnok zahrnutý.
Vyberte MySQL 8.0 Command Line Client z ponuky Štart a spustite ho.
Po zadaní hesla a prihlásení zadajte nasledujúci príkaz:
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Ešte som ho nenainštaloval, takže by mal byť prázdny.
Teraz nakonfigurujme doplnok. Najprv vytvorte nasledujúce priečinky: V skutočnosti je miesto alebo názov, ktoré vytvoríte, v poriadku. Zadajte ho ako umiestnenie na uloženie súboru kľúča neskôr.
- C:\ProgramData\MySQL\mysql-keyring
Potom otvorte nasledujúci súbor v textovom editore.
- C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
Pridajte nasledujúci text do spodného priestoru a uložte ho. Ak nemôžete uložiť s oprávneniami správcu, môžete ho uložiť do iného umiestnenia a potom súbor prepísať.
early-plugin-load=keyring_file.dll
keyring_file_data=C:\ProgramData\MySQL\mysql-keyring\keyring
Reštartujte službu MySQL. Môžete ho reštartovať pomocou príkazu.
Po reštarte sa súbor automaticky vytvorí v zadanom priečinku.
Môžete znova spustiť príkaz Skontrolovať doplnok a overiť, či je doplnok nainštalovaný.
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Vytvorenie šifrovacej tabuľky
Teraz vytvoríme šifrovanú tabuľku.
Vytvorte tabuľku podobnú tej, ktorú sme mali predtým, ale teraz pridajte k možnostiam ENCRYPTION='Y'
.
Zdá sa, že toto nastavenie šifrovania nie je momentálne konfigurovateľné v grafickom používateľskom rozhraní, takže ho musíte nastaviť príkazom.
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;
Mimochodom, pred nastavením doplnku, aj keď sa pokúsite vytvoriť šifrovaciu tabuľku, sa zobrazí nasledujúca chyba.
Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully. キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。
Ak nemáte dáta, neviete, či sú šifrované, takže sa pokúsim vložiť podobné údaje.
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
Bol vytvorený súbor tabuľky, takže poďme skontrolovať jeho obsah.
Súbor bol zašifrovaný a obsah záznamu nie je možné overiť.
Zatiaľ sa už nemusím obávať, že budem môcť čítať záznamy vo vnútri len prihlásením sa na server s treťou stranou a priamou krádežou súboru tabuľky. Myslím si, že je to jednoduché nastavenie zabezpečenia, pretože nie je potrebné vôbec meniť implementáciu.
Ak sa však prihlásite do databázy, dáta vidíte normálne. Ak chcete zvýšiť úroveň zabezpečenia, musíte spravovať prihlasovacie účty do databázy a zaviesť samostatný šifrovací mechanizmus.
Konverzia na šifrované tabuľky
Ak v prvom rade vytvoríte nezašifrovanú tabuľku, môžete ju neskôr skonvertovať na šifrovanú tabuľku. V takom prípade ho môžete previesť pomocou nasledujúceho SQL:
use <データベース名>;
ALTER TABLE <テーブル名> ENCRYPTION='Y';
príklad
use test_database;
ALTER TABLE plain_user ENCRYPTION='Y';
Dávajte si však pozor, aby ste neprepísali všetky súbory tabuliek, pretože ak bude príliš veľa záznamov, bude to trvať dlho.