Skaidrus MySQL lentelių šifravimas (TDE) ("Windows")
Operacijos patvirtinimo aplinka
- MySQL
-
- MySQL 8.0 bendruomenės leidimas
- Windows
-
- langai 11
Reikalinga aplinka
- MySQL
-
- MySQL 8.0 bendruomenės leidimas
- MySQL 8.0 Enterprise Edition
- Windows
-
- langai 11
- langai 10
- Windows serveris
-
- "Windows Server 2022"
- "Windows Server 2019"
- "Windows Server 2016"
- "Windows Server 2012 R2"
Prielaida
- Turi būti įdiegta MySQL duomenų bazė
Apie skaidrų šifravimą
Skaidrus duomenų šifravimas (Enterprise Transparent Data Encryption) yra technologija, kuri šifruoja, kaip rodo pavadinimas, ir yra saugesnė nei to nedaryti. Paprastai, kai atliekamas šifravimas, tai dažnai yra našta įgyvendintojui, nes būtina atlikti šifravimo ir iššifravimo apdorojimą. Šio "skaidraus" reikšmė yra ta, kad jį galima užšifruoti įgyvendintojui nekeičiant apdorojimo. Todėl tai labai veiksminga saugumo priemonė, nes ji užšifruojama savaime, pradžioje šiek tiek pakoregavus nustatymus.
Tačiau, kaip rodo frazė "nereikia daryti jokių pakeitimų", jei iš tikrųjų prisijungiate prie duomenų bazės, galite matyti duomenis normaliai, o jei gaunate duomenų bazės įrašus iš programos, galite matyti duomenis normaliai. Jei gauti duomenys yra užšifruoti, reikės atlikti apdorojimo pakeitimus, todėl jie neatitiks teiginio "apdorojimui nereikia jokių pakeitimų".
Taigi, kas tiksliai yra skaidrus šifravimas MySQL, o "saugomi duomenų bazės failai" arba "lentelės failai" yra užšifruoti. Kaip patikrinsiu vėliau, net jei atidarote failą tiesiogiai, jis yra tik užšifruotas, kad nebūtų matomas turinys, todėl būtina jį valdyti taip, kad jis neprisijungtų prie duomenų bazės.
Įprastai sukurkite lentelę ir patikrinkite jos turinį
Pirmiausia sukurkime lentelę ir įrašą įprastai. Galite jį sukurti, kaip norite, bet šį kartą aš paleidžiu SQL Workbench, kad jį sukurčiau. Šį kartą planuojame nustatyti skaidrų lentelės šifravimą, todėl įprastai sukursime duomenų bazę.
CREATE DATABASE `test_database`
Aš taip pat įprastai gaminu lentelę. Kad ir koks būtų stulpelio turinys, jis gali būti.
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;
Išsaugokite įrašą, kad patikrintumėte š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ę, ji pagal numatytuosius nustatymus sukuriama šiuose aplankuose:
- C:\ProgramData\MySQL\MySQL Server 8.0\Data
ProgramData
Aplankas yra paslėptas aplankas, todėl įsitikinkite, kad jis matomas "File Explorer" nustatymuose.
Aplanko viduje yra aplankas su sukurtos duomenų bazės pavadinimu, todėl atidarykite jį.
Viduje yra lentelės lygio failai.
Atidarykite šį failą teksto rengyklėje, pvz., Notepad. Kadangi tai yra dvejetainis failas, manau, kad iš esmės yra tekstas, kurio gerai nesuprantu. Jei pažvelgsite į apačią, pamatysite užregistruoto įrašo tekstą.
Jei jis nėra užšifruotas tokiu būdu, įrašo turinį galite sužinoti tiesiog tiesiogiai atidarę failą. Jums nereikia prisijungti prie duomenų bazės, kad sužinotumėte, kas yra viduje.
Skaidraus šifravimo nustatymas
Norėdami įjungti skaidrų šifravimą, turite įdiegti papildinį. Pirmiausia patikrinkite komandą, kad sužinotumėte, ar papildinys įtrauktas.
Meniu Pradėti pasirinkite MySQL 8.0 komandų eilutės klientas, kad jį paleistumėte.
Įvedę slaptažodį ir prisijungę, įveskite šią komandą:
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Aš jo dar neįdiegiau, todėl jis turėtų būti tuščias.
Dabar sukonfigūruokime papildinį. Pirmiausia sukurkite šiuos aplankus: Tiesą sakant, jūsų sukurta vieta ar vardas yra gerai. Nurodykite ją kaip vietą, kurioje vėliau galėsite įrašyti rakto failą.
- C:\ProgramData\MySQL\mysql-keyring
Tada atidarykite šį failą teksto rengyklėje.
- C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
Pridėkite šį tekstą į apatinę vietą 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ą. Galite jį paleisti iš naujo naudodami komandą.
Paleidus iš naujo, failas bus automatiškai sukurtas nurodytame aplanke.
Galite dar kartą paleisti komandą Tikrinti papildinį, kad patikrintumėte, ar papildinys įdiegtas.
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
Šifravimo lentelės kūrimas
Dabar sukurkime užšifruotą lentelę.
Sukurkite lentelę, panašią į tą, kurią turėjome anksčiau, bet dabar pridėkite prie parinkčių ENCRYPTION='Y'
.
Atrodo, kad šiuo metu šio šifravimo nustatymo GUI negalima konfigūruoti, 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š nustatydami papildinį, net jei bandysite sukurti šifravimo lentelę, gausite šią klaidą.
Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully. キーリングからマスターキーが見つかりません。キーリングが正常にロードされ、初期化されているかどうかをサーバーログで確認してください。
Jei neturite duomenų, nežinote, ar jie užšifruoti, todėl pabandysiu įdėti panaš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
Sukurtas lentelės failas, todėl patikrinkime turinį.
Failas užšifruotas ir įrašo turinio patikrinti negalima.
Kol kas man nebereikia jaudintis dėl galimybės skaityti įrašus viduje tiesiog prisijungus prie serverio su trečiąja šalimi ir pavogti lentelės failą tiesiogiai. Manau, kad tai lengvas saugumo nustatymas, nes nereikia keisti įgyvendinimo.
Tačiau jei prisijungiate prie duomenų bazės, duomenis galite matyti įprastai. Jei norite padidinti saugumo lygį, turite valdyti duomenų bazės prisijungimo paskyras ir įdiegti atskirą šifravimo mechanizmą.
Pakeliui konvertuokite į užšifruotas lenteles
Jei pirmiausia sukursite neužš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 būkite atsargūs ir neperrašykite visų lentelės failų, nes tai užtruks ilgai, jei bus per daug įrašų.