Criptare transparentă (TDE) pentru tabele MySQL (Windows)

Data creării paginii :

Mediu de confirmare a funcționării

MySQL
  • MySQL 8.0 Ediția Comunității
Windows
  • ferestre 11

Mediu necesar

MySQL
  • MySQL 8.0 Ediția Comunității
  • MySQL 8.0 Enterprise Edition
Windows
  • ferestre 11
  • Windows 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

Condiție prealabilă

  • Baza de date MySQL trebuie instalată

Despre criptarea transparentă

Transparent Data Encryption (Enterprise Transparent Data Encryption) este o tehnologie care criptează așa cum sugerează și numele și este mai sigură decât să nu faci acest lucru. În mod normal, atunci când se efectuează criptarea, este adesea o povară pentru implementator, deoarece este necesar să efectueze procesarea criptării și decriptării. Semnificația acestui "transparent" este că poate fi criptat fără ca implementatorul să facă modificări la procesare. Prin urmare, este o măsură de securitate foarte eficientă, deoarece este criptată singură după doar o mică ajustare a setărilor la început.

Cu toate acestea, după cum sugerează expresia "nu este nevoie să faceți modificări", dacă vă conectați efectiv la baza de date, puteți vedea datele în mod normal, iar dacă obțineți înregistrările bazei de date din program, puteți vedea datele în mod normal. Dacă datele obținute sunt criptate, va fi necesar să se aducă modificări prelucrării, deci nu se va potrivi cu declarația "nu sunt necesare modificări ale prelucrării".

Deci, ce este mai exact criptarea transparentă în MySQL și "fișierele de bază de date stocate" sau "fișierele de tabel" sunt criptate. După cum voi verifica mai târziu, chiar dacă deschideți fișierul direct, acesta este criptat doar pentru ca conținutul să nu poată fi văzut, deci este necesar să-l operați astfel încât să nu se conecteze la baza de date în funcționare reală.

Creați un tabel în mod normal și verificați conținutul

Mai întâi, să creăm un tabel și o înregistrare în mod normal. Îl puteți crea cum doriți, dar de data aceasta voi rula SQL în Workbench pentru a-l crea. De data aceasta, intenționăm să configurăm criptarea transparentă pentru tabel, așa că vom crea o bază de date în mod normal.

CREATE DATABASE `test_database`

De asemenea, fac o masă în mod normal. Oricare ar fi conținutul coloanei, poate fi.

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;

Păstrați o înregistrare pentru a verifica criptarea.

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

Când creați o bază de date sau un tabel, acesta este creat în mod implicit în următoarele foldere:

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

ProgramData Folderul este un folder ascuns, așa că asigurați-vă că este vizibil în setările File Explorer.

În interiorul folderului se află un folder cu numele bazei de date pe care ați creat-o, așa că deschideți-l.

În interior sunt fișiere la nivel de tabel.

Deschideți acest fișier într-un editor de text, cum ar fi Notepad. Deoarece este un fișier binar, cred că există practic text pe care nu îl înțeleg bine. Dacă vă uitați în partea de jos, veți vedea textul înregistrării înregistrate.

Dacă nu este criptat în acest fel, puteți cunoaște conținutul înregistrării doar deschizând direct fișierul. Nu trebuie să vă conectați la baza de date pentru a ști ce este înăuntru.

Configurarea criptării transparente

Pentru a activa criptarea transparentă, trebuie să instalați un plugin. Mai întâi, verificați comanda pentru a vedea dacă pluginul este inclus.

Selectați MySQL 8.0 Command Line Client din meniul Start pentru a-l lansa.

După ce ați introdus parola și v-ați conectat, introduceți următoarea comandă:

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

Nu l-am instalat încă, așa că ar trebui să fie gol.

Acum să configurăm pluginul. Mai întâi, creați următoarele foldere: De fapt, locul sau numele pe care îl creați este în regulă. Specificați-l ca locație pentru a salva fișierul cheie mai târziu.

  • C:\ProgramData\MySQL\mysql-keyring

Apoi deschideți următorul fișier într-un editor de text.

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

Adăugați următorul text în spațiul de jos și salvați-l. Dacă nu puteți salva cu privilegii de administrator, îl puteți salva în altă locație și apoi puteți suprascrie fișierul.

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

Reporniți serviciul MySQL. Îl puteți reporni cu o comandă.

După repornire, fișierul va fi creat automat în folderul specificat.

Puteți rula din nou comanda Check Plugin pentru a verifica dacă pluginul este instalat.

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

Crearea unui tabel de criptare

Acum să creăm un tabel criptat. Creați un tabel similar cu cel pe care l-am avut înainte, dar acum adăugați la opțiuni ENCRYPTION='Y' . Această setare de criptare nu pare a fi configurabilă în GUI în acest moment, deci trebuie setată prin comandă.

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;

Apropo, înainte de a configura pluginul, chiar dacă încercați să creați un tabel de criptare, veți primi următoarea eroare.

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

Dacă nu aveți date, nu știți dacă sunt criptate, așa că voi încerca să pun date similare.

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 A fost creat un fișier tabel, așa că haideți să verificăm conținutul.

Fișierul a fost criptat și conținutul înregistrării nu poate fi verificat.

Deocamdată, nu mai trebuie să-mi fac griji că pot citi înregistrările din interior doar conectându-mă la server cu o terță parte și furând direct fișierul tabelului. Cred că este o setare de securitate ușoară, deoarece nu este nevoie să schimbați deloc implementarea.

Cu toate acestea, dacă vă conectați la baza de date, puteți vedea datele în mod normal. Dacă doriți să creșteți nivelul de securitate, trebuie să gestionați conturile de conectare la baza de date și să introduceți un mecanism de criptare separat.

Convertiți în tabele criptate pe parcurs

Dacă creați un tabel necriptat în primul rând, îl puteți converti ulterior într-un tabel criptat. În acest caz, îl puteți converti cu următorul SQL:

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

exemplu

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

Cu toate acestea, aveți grijă să nu rescrieți toate fișierele tabelului, deoarece va dura mult timp dacă există prea multe înregistrări.