Impuneți criptarea transparentă (TDE) pe tabelele MySQL (versiunea Windows)

Pagina actualizată :
Data creării paginii :

Mediu de operare

MySQL
  • MySQL 8.0 Community Edition
Windows
  • Ferestre 11

Cerințe preliminare

MySQL
  • MySQL 8.0 Community Edition
  • MySQL 8.0 Enterprise Edition
Windows
  • Ferestre 11
  • Ferestre 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

Condiție prealabilă

  • Este instalată o bază de date pentru MySQL.

Despre criptarea transparentă

Enterprise Transparent Data Encryption, după cum sugerează și numele, este o tehnologie de criptare care este mai sigură decât orice altceva care nu o face. În mod normal, atunci când criptați, este adesea o povară pentru implementator, deoarece este necesar să efectuați procesarea criptării și decriptării. Semnificația acestui nume "transparent" este că poate fi criptată fără ca implementatorul să facă modificări procesului. Prin urmare, dacă faceți câteva modificări la setări la început, restul va fi criptat fără permisiune, deci este o măsură de securitate foarte eficientă.

Cu toate acestea, după cum sugerează expresia "nu este nevoie să schimbați nimic", dacă vă conectați efectiv la baza de date, puteți vedea datele în mod normal, iar dacă obțineți înregistrarea bazei de date din program, puteți vedea datele în mod normal. Dacă datele achiziționate sunt criptate, va fi necesar să modificați procesul, deci nu se va potrivi cu formularea "Nu este nevoie să schimbați procesul".

Apoi, în MySQL, ceea ce este exact criptarea transparentă este criptată, "fișierele bazei de date stocate" sau "fișierele de tabel" sunt supuse criptării. După cum vom verifica mai târziu, chiar dacă deschideți fișierul direct, acesta îl criptează doar astfel încât să nu puteți vedea conținutul, deci este necesar să îl operați astfel încât să nu fie conectat 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 înregistrări în mod normal. Îl puteți crea oricum doriți, dar în acest caz, îl vom crea executând SQL în Workbench. În acest caz, intenționăm să setăm criptarea transparentă pentru tabel, așa că vom crea baza de date în mod normal.

CREATE DATABASE `test_database`

Masa este, de asemenea, făcută în mod normal. Conținutul coloanei poate fi orice.

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;

De asemenea, voi pune o înregistrare aleatorie 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ătorul folder.

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

ProgramData Folderul este ascuns, deci faceți-l vizibil în setările Explorer.

Există un folder cu numele bazei de date pe care ați creat-o în dosar, deci deschideți-l.

În interior există un fișier tabel cu 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 o linie de text pe care nu o î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, conținutul înregistrării va fi cunoscut chiar dacă fișierul este deschis direct. Nu trebuie să vă conectați la baza de date pentru a afla ce se află în interior.

Configurarea setărilor de criptare transparentă

Pentru a activa criptarea transparentă, trebuie să instalați un plug-in. Mai întâi, verificați dacă plug-in-ul este inclus în comandă.

Porniți-l selectând "MySQL 8.0 Command Line Client" din meniul Start.

După introducerea parolei și autentificare, introduceți următoarea comandă:

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

Deoarece nu l-ați instalat încă, ar trebui să fie gol.

Acum, să configurăm plug-in-ul. Mai întâi, creați următoarele foldere: De fapt, nu contează unde îl creați sau ce nume este. Specificați-l ca locație în care doriți să salvați fișierul cheie mai târziu.

  • C:\ProgramData\MySQL\mysql-breloc

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 gol din partea de jos și salvați-l. Dacă nu puteți salva cu privilegii de administrator, aveți posibilitatea să îl salvați în altă locație și apoi să suprascrieți fișierul.

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

Reporniți serviciul MySQL. De asemenea, îl puteți reporni cu comanda.

Când reporniți, fișierul este creat automat în folderul specificat.

Puteți verifica dacă plug-in-ul este instalat executând din nou comanda de verificare a plug-in-ului.

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

Crearea unui tabel criptat

Acum să creăm un tabel criptat. Creați un tabel similar cu cel precedent, dar de data aceasta adăugați la ENCRYPTION='Y' opțiuni. Această setare de criptare nu pare a fi posibilă în GUI în acest moment, deci trebuie setată cu o 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 configurarea plug-in-ului, chiar dacă încercați să creați un tabel criptat, va fi afișată 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 aceleași date.

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 Deoarece fișierul tabel a fost creat, să verificăm conținutul.

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

Pentru moment, nu mai trebuie să vă faceți griji cu privire la o terță parte care citește înregistrările din interior doar conectându-vă la server și furând direct fișierul tabelului. Nu este nevoie să schimbați deloc implementarea, deci cred că este o setare ușoară de securitate.

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 bine contul de conectare la baza de date și să introduceți un mecanism separat de criptare.

Conversia într-un tabel criptat pe parcurs

Dacă inițial creați un tabel necriptat, î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, rețineți că va dura ceva timp dacă există multe înregistrări, deoarece toate fișierele tabelului sunt rescrise.