Прозрачно криптиране (TDE) за MySQL таблици (Windows)

Дата на създаване на страница :

Среда за потвърждение на операцията

MySQL
  • MySQL 8.0 Community Edition
Уиндоус
  • Windows 11

Необходима среда

MySQL
  • MySQL 8.0 Community Edition
  • MySQL 8.0 Enterprise Edition
Уиндоус
  • Windows 11
  • Windows 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

Предпоставка

  • MySQL база данни трябва да бъде инсталирана

Относно прозрачното криптиране

Прозрачното криптиране на данни (Enterprise Transparent Data Encryption) е технология, която криптира, както подсказва името, и е по-сигурна, отколкото да не го правите. Обикновено, когато се извършва криптиране, това често е тежест за изпълнителя, тъй като е необходимо да се извърши обработка на криптиране и декриптиране. Значението на това "прозрачно" е, че може да бъде криптирано, без изпълнителят да прави промени в обработката. Следователно, това е много ефективна мярка за сигурност, тъй като се криптира самостоятелно след малко настройка на настройките в началото.

Въпреки това, както подсказва фразата "няма нужда да правите никакви промени", ако действително влезете в базата данни, можете да видите данните нормално, а ако получите записите на базата данни от програмата, можете да видите данните нормално. Ако получените данни са криптирани, ще е необходимо да се направят промени в обработката, така че да не съответстват на твърдението "не се изискват промени в обработката".

И така, какво точно е прозрачно криптиране в MySQL и "съхранени файлове с бази данни" или "файлове с таблици" са криптирани. Както ще проверя по-късно, дори ако отворите файла директно, той е само криптиран, така че съдържанието да не се вижда, така че е необходимо да го работите, така че да не влиза в базата данни в реална работа.

Създайте таблица нормално и проверете съдържанието

Първо, нека създадем таблица и запис нормално. Можете да го създадете както искате, но този път ще стартирам SQL в Workbench, за да го създадам. Този път планираме да настроим прозрачно криптиране за таблицата, така че ще създадем база данни нормално.

CREATE DATABASE `test_database`

Също така правя маса нормално. Каквото и да е съдържанието на колоната, то може да бъде.

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;

Водете запис, за да проверите шифроването.

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:\ProgramData\MySQL\MySQL Server 8.0\Data

ProgramData Папката е скрита папка, така че се уверете, че е видима в настройките на File Explorer.

Вътре в папката има папка с името на базата данни, която сте създали, така че я отворете.

Вътре има файлове на ниво таблица.

Отворете този файл в текстов редактор, като например Notepad. Тъй като това е двоичен файл, мисля, че има основно текст, който не разбирам добре. Ако погледнете в долната част, ще видите текста на регистрирания запис.

Ако не е криптиран по този начин, можете да разберете съдържанието на записа само като отворите файла директно. Не е нужно да влизате в базата данни, за да знаете какво има вътре.

Настройване на прозрачно шифроване

За да активирате прозрачно криптиране, трябва да инсталирате плъгин. Първо проверете командата, за да видите дали плъгинът е включен.

Изберете MySQL 8.0 Command Row Client от менюто "Старт", за да го стартирате.

След като въведете паролата си и влезете, въведете следната команда:

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

Все още не съм го инсталирал, така че трябва да е празен.

Сега нека конфигурираме приставката. Първо създайте следните папки: Всъщност мястото или името, което създавате, са добре. Посочете го като местоположение, за да запишете ключовия файл по-късно.

  • C:\ProgramData\MySQL\mysql-ключодържател

След това отворете следния файл в текстов редактор.

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

Добавете следния текст в долното пространство и го запазете. Ако не можете да запишете с администраторски права, можете да го запишете на друго място и след това да презапишете файла.

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

Рестартирайте услугата MySQL. Можете да го рестартирате с команда.

След рестартиране файлът ще бъде автоматично създаден в посочената папка.

Можете да изпълните командата Check Plugin отново, за да проверите дали приставката е инсталирана.

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

Създаване на таблица за шифроване

Сега нека създадем криптирана таблица. Създайте таблица, подобна на тази, която имахме преди, но сега добавете към опциите ENCRYPTION='Y' . Тази настройка за криптиране изглежда не може да се конфигурира в графичния интерфейс в момента, така че трябва да бъде зададена с команда.

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;

Между другото, преди да настроите плъгина, дори и да се опитате да създадете таблица за криптиране, ще получите следната грешка.

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

Ако нямате данни, не знаете дали са криптирани, така че ще се опитам да сложа подобни данни.

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 Създаден е файл с таблица, така че нека проверим съдържанието.

Файлът е криптиран и съдържанието на записа не може да бъде проверено.

Засега вече не е нужно да се притеснявам, че мога да чета записите вътре само като вляза в сървъра с трета страна и открадна директно файла на таблицата. Мисля, че това е лесна настройка за сигурност, защото изобщо няма нужда да променяте реализацията.

Ако обаче влезете в базата данни, можете да видите данните нормално. Ако искате да повишите нивото на сигурност, трябва да управлявате акаунтите за влизане в базата данни и да въведете отделен механизъм за криптиране.

Конвертиране в криптирани таблици по пътя

Ако създадете нешифрована таблица на първо място, можете да я преобразувате в шифрована таблица по-късно. В този случай можете да го конвертирате със следния SQL:

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

пример

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

Внимавайте обаче да не пренапишете всички файлове на таблицата, тъй като ще отнеме много време, ако има твърде много записи.