Прозрачно криптиране (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';
Внимавайте обаче да не пренапишете всички файлове на таблицата, тъй като ще отнеме много време, ако има твърде много записи.