Įgalinkite skaidrų šifravimą (TDE) MySQL lentelėse ("Windows" versija)

Puslapis atnaujintas :
Puslapio sukūrimo data :

Darbo aplinka

MySQL
  • MySQL 8.0 bendruomenės leidimas
Windows
  • Langai 11

Būtinosios sąlygos

MySQL
  • MySQL 8.0 bendruomenės leidimas
  • "MySQL 8.0 Enterprise" leidimas
Windows
  • Langai 11
  • Langai 10
"Windows" serveris
  • "Windows Server 2022"
  • "Windows Server 2019"
  • "Windows Server 2016"
  • "Windows Server 2012 R2"

Prielaida

  • Įdiegta MySQL duomenų bazė.

Apie skaidrų šifravimą

Įmonės skaidrus duomenų šifravimas, kaip rodo pavadinimas, yra šifravimo technologija, kuri yra saugesnė už viską, kas to nedaro. Paprastai, šifruojant, tai dažnai yra našta įgyvendintojui, nes būtina atlikti šifravimą ir iššifravimo apdorojimą. Šio pavadinimo "skaidrus" reikšmė yra ta, kad jis gali būti užšifruotas be jokių proceso pakeitimų. Todėl, jei pradžioje atliksite keletą nustatymų pakeitimų, likusi dalis bus užšifruota be leidimo, todėl tai yra labai veiksminga saugumo priemonė.

Tačiau, kaip rodo frazė "nereikia nieko keisti", jei iš tikrųjų prisijungiate prie duomenų bazės, duomenis galite matyti įprastai, o jei gaunate duomenų bazės įrašą iš programos, duomenis galite matyti įprastai. Jei gauti duomenys yra užšifruoti, reikės pakeisti procesą, todėl jis neatitiks formuluotės "Nereikia keisti proceso".

Tada MySQL užšifruojamas tai, kas tiksliai yra skaidrus šifravimas, šifruojami "saugomi duomenų bazės failai" arba "lentelės failai". Kaip patikrinsime vėliau, net jei atidarysite failą tiesiogiai, jis tik užšifruoja jį, kad nematytumėte turinio, todėl būtina jį naudoti taip, kad jis nebūtų prisijungęs prie duomenų bazės faktiškai veikiant.

Paprastai sukurkite lentelę ir patikrinkite turinį

Pirmiausia sukurkime lentelę ir įrašus įprastai. Galite sukurti jį taip, kaip norite, bet šiuo atveju mes jį sukursime vykdydami SQL Workbench. Tokiu atveju planuojame nustatyti skaidrų lentelės šifravimą, todėl duomenų bazę sukursime įprastai.

CREATE DATABASE `test_database`

Stalas taip pat gaminamas normaliai. Stulpelio turinys gali būti bet koks.

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;

Taip pat įdėsiu atsitiktinį įrašą, kad patikrinčiau šifravimą.

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

Kai kuriate duomenų bazę arba lentelę, pagal numatytuosius nustatymus ji sukuriama šiame aplanke.

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

ProgramData Aplankas yra paslėptas, todėl padarykite jį matomą "Explorer" nustatymuose.

Aplanke yra aplankas su duomenų bazės, kurią sukūrėte aplanke, pavadinimu, todėl atidarykite jį.

Viduje yra failas pagal lentelę.

Atidarykite šį failą teksto rengyklėje, pvz., "Notepad". Kadangi tai yra dvejetainis failas, manau, kad iš esmės yra teksto eilutė, kurios gerai nesuprantu. Jei pažvelgsite į apačią, pamatysite užregistruoto įrašo tekstą.

Jei jis nėra užšifruotas tokiu būdu, įrašo turinys bus žinomas, net jei failas bus atidarytas tiesiogiai. Jums nereikia prisijungti prie duomenų bazės, kad žinotumėte, kas yra viduje.

Skaidrių šifravimo nustatymų konfigūravimas

Norėdami įjungti skaidrų šifravimą, turite įdiegti priedą. Pirmiausia patikrinkite, ar papildinys įtrauktas į komandą.

Paleiskite jį meniu Pradėti pasirinkdami "MySQL 8.0 komandų eilutės klientas".

Įvedę slaptažodį ir prisijungę, įveskite šią komandą:

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

Kadangi jo dar neįdiegėte, jis turėtų būti tuščias.

Dabar nustatykime papildinį. Pirmiausia sukurkite šiuos aplankus: Tiesą sakant, nesvarbu, kur jį sukuriate ar koks tai vardas. Nurodykite jį kaip vietą, kurioje vėliau norite išsaugoti rakto failą.

  • C:\ProgramData\MySQL\mysql-raktų pakabukas

Tada teksto rengyklėje atidarykite šį failą:

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

Pridėkite šį tekstą į tuščią vietą apačioje ir išsaugokite jį. Jei negalite įrašyti naudodami administratoriaus teises, galite įrašyti jį kitoje vietoje ir perrašyti failą.

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

Iš naujo paleiskite "MySQL" paslaugą. Taip pat galite jį paleisti iš naujo naudodami komandą.

Kai paleidžiate iš naujo, failas automatiškai sukuriamas nurodytame aplanke.

Galite patikrinti, ar papildinys įdiegtas, dar kartą paleisdami komandą tikrinti.

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

Užšifruotos lentelės kūrimas

Dabar sukurkime užšifruotą lentelę. Sukurkite lentelę, panašią į ankstesnę, tačiau šį kartą pridėkite prie ENCRYPTION='Y' parinkčių. Atrodo, kad šis šifravimo nustatymas šiuo metu nėra įmanomas GUI, todėl jį reikia nustatyti komanda.

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;

Beje, prieš konfigūruojant papildinį, net jei bandysite sukurti užšifruotą lentelę, bus rodoma ši klaida.

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

Jei neturite jokių duomenų, nežinote, ar jie užšifruoti, todėl pabandysiu įdėti tuos pačius duomenis.

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 Kadangi lentelės failas buvo sukurtas, patikrinkime turinį.

Failas buvo užšifruotas, o įrašo turinio negalima patikrinti.

Kol kas jums nebereikia jaudintis, kad trečioji šalis perskaitys viduje esančius įrašus tiesiog prisijungusi prie serverio ir tiesiogiai pavogusi lentelės failą. Visiškai nereikia keisti įgyvendinimo, todėl manau, kad tai lengva saugumo aplinka.

Tačiau jei prisijungiate prie duomenų bazės, duomenis galite matyti įprastai. Jei norite padidinti saugumo lygį, turite gerai valdyti duomenų bazės prisijungimo paskyrą ir įdiegti atskirą šifravimo mechanizmą.

Pakeliui konvertuokite į užšifruotą lentelę

Jei iš pradžių sukuriate nešifruotą lentelę, vėliau galėsite ją konvertuoti į užšifruotą lentelę. Tokiu atveju galite konvertuoti jį naudodami šį SQL:

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

pavyzdys

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

Tačiau atminkite, kad tai užtruks, jei bus daug įrašų, nes visi lentelės failai bus perrašyti.