Pregledno šifriranje (TDE) za tabele MySQL (Windows)

Datum ustvarjanja strani :

Okolje za potrditev delovanja

MySQL
  • Izdaja skupnosti MySQL 8.0
Windows
  • Okna 11

Zahtevano okolje

MySQL
  • Izdaja skupnosti MySQL 8.0
  • Izdaja MySQL 8.0 Enterprise
Windows
  • Okna 11
  • Operacijski sistem Windows 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

Pogoj

  • Nameščena mora biti zbirka podatkov MySQL

O preglednem šifriranju

Transparentno šifriranje podatkov (Enterprise Transparent Data Encryption) je tehnologija, ki šifrira, kot že ime pove, in je varnejša kot ne. Običajno je pri izvajanju šifriranja pogosto breme za izvajalca, ker je potrebno opraviti obdelavo šifriranja in dešifriranja. Pomen tega "preglednega" je, da ga je mogoče šifrirati, ne da bi izvajalec spremenil obdelavo. Zato je zelo učinkovit varnostni ukrep, saj je šifriran sam po samo malem prilagajanju nastavitev na začetku.

Vendar, kot nakazuje besedna zveza »ni potrebe po spremembah«, če se dejansko prijavite v bazo podatkov, lahko podatke vidite normalno, in če dobite zapise baze podatkov iz programa, lahko podatke vidite normalno. Če so pridobljeni podatki šifrirani, bo treba spremeniti obdelavo, tako da se ne bodo ujemali z izjavo "spremembe obdelave niso potrebne".

Torej, kaj točno je pregledno šifriranje v MySQL, in "shranjene datoteke baze podatkov" ali "datoteke tabele" so šifrirane. Kot bom preveril kasneje, tudi če datoteko odprete neposredno, je šifrirana samo tako, da vsebine ni mogoče videti, zato jo je treba upravljati tako, da se v dejanskem delovanju ne prijavi v bazo podatkov.

Ustvarite tabelo običajno in preverite vsebino

Najprej običajno ustvarimo tabelo in zapis. Ustvarite ga lahko, kakor želite, toda tokrat bom zagnal SQL v Workbenchu, da ga ustvarim. Tokrat načrtujemo vzpostavitev preglednega šifriranja za tabelo, tako da bomo normalno ustvarili bazo podatkov.

CREATE DATABASE `test_database`

Tudi običajno naredim mizo. Ne glede na vsebino stolpca, je lahko.

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;

Vodite evidenco, da preverite šifriranje.

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

Ko ustvarite zbirko podatkov ali tabelo, je privzeto ustvarjena v teh mapah:

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

ProgramData Mapa je skrita mapa, zato se prepričajte, da je vidna v nastavitvah Raziskovalca.

V mapi je mapa z imenom baze podatkov, ki ste jo ustvarili, zato jo odprite.

V notranjosti so datoteke na ravni tabele.

Odprite to datoteko v urejevalniku besedila, kot je Beležnica. Ker gre za binarno datoteko, mislim, da je v bistvu besedilo, ki ga ne razumem dobro. Če pogledate na dnu, boste videli besedilo registriranega zapisa.

Če ni šifriran na ta način, lahko vsebino zapisa poznate tako, da datoteko odprete neposredno. Ni se vam treba prijaviti v bazo podatkov, da bi vedeli, kaj je v njej.

Nastavitev preglednega šifriranja

Če želite omogočiti pregledno šifriranje, morate namestiti vtičnik. Najprej preverite ukaz, da preverite, ali je vtičnik vključen.

V meniju Start izberite Odjemalec ukazne vrstice MySQL 8.0, da ga zaženete.

Ko vnesete geslo in se prijavite, vnesite naslednji ukaz:

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

Še ga nisem namestil, zato bi moral biti prazen.

Zdaj pa konfigurirajmo vtičnik. Najprej ustvarite te mape: Pravzaprav je kraj ali ime, ki ga ustvarite, v redu. Določite ga kot mesto, kjer želite pozneje shraniti datoteko s ključem.

  • C:\ProgramData\MySQL\mysql-keyring

Nato odprite naslednjo datoteko v urejevalniku besedil.

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

Dodajte naslednje besedilo v spodnji prostor in ga shranite. Če ne morete shraniti s skrbniškimi pravicami, jo lahko shranite na drugo mesto in nato prepišete datoteko.

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

Znova zaženite storitev MySQL. Z ukazom ga lahko znova zaženete.

Po ponovnem zagonu bo datoteka samodejno ustvarjena v določeni mapi.

Znova lahko zaženete ukaz Preveri vtičnik, da preverite, ali je vtičnik nameščen.

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

Ustvarjanje šifrirne tabele

Zdaj pa ustvarimo šifrirano tabelo. Ustvarite tabelo, podobno tisti, ki smo jo imeli prej, zdaj pa dodajte možnosti ENCRYPTION='Y' . Zdi se, da te nastavitve šifriranja trenutno ni mogoče konfigurirati v grafičnem uporabniškem vmesniku, zato jo je treba nastaviti z ukazom.

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;

Mimogrede, pred nastavitvijo vtičnika, tudi če poskusite ustvariti tabelo šifriranja, boste prejeli naslednjo napako.

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

Če nimate podatkov, ne veste, ali so šifrirani, zato bom poskusil dati podobne podatke.

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 Datoteka tabele je bila ustvarjena, zato preverimo vsebino.

Datoteka je šifrirana in vsebine zapisa ni mogoče preveriti.

Za zdaj mi ni več treba skrbeti, da bi lahko prebral zapise v notranjosti samo tako, da se prijavite na strežnik s tretjo osebo in neposredno ukradem datoteko tabele. Mislim, da je to enostavna varnostna nastavitev, ker sploh ni potrebe po spreminjanju izvajanja.

Če pa se prijavite v bazo podatkov, lahko podatke vidite normalno. Če želite povečati raven varnosti, morate upravljati račune za prijavo v bazo podatkov in uvesti ločen mehanizem šifriranja.

Pretvorite v šifrirane tabele

Če najprej ustvarite nešifrirano tabelo, jo lahko pozneje pretvorite v šifrirano tabelo. V tem primeru ga lahko pretvorite z naslednjim SQL-jem:

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

primer

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

Vendar bodite previdni, da ne prepišete vseh datotek tabele, saj bo trajalo dolgo časa, če je zapisov preveč.