Застосування прозорого шифрування (TDE) до таблиць MySQL (версія для Windows)

Сторінка оновлюється :
Дата створення сторінки :

Робоче середовище

MySQL
  • MySQL 8.0 Community Edition
Вікна
  • Вікна 11

Передумови

MySQL
  • MySQL 8.0 Community Edition
  • MySQL 8.0 Enterprise Edition
Вікна
  • Вікна 11
  • Вікна 10
Windows Server
  • Windows Server 2022
  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2

Передумовою

  • Встановлено базу даних для MySQL.

Про прозоре шифрування

Корпоративне прозоре шифрування даних, як випливає з назви, — це технологія шифрування, яка є безпечнішою, ніж будь-що, що цього не робить. Зазвичай, при шифруванні це часто є тягарем для реалізатора, оскільки необхідно виконати обробку шифрування та дешифрування. Значення цієї назви «прозорий» полягає в тому, що його можна зашифрувати без внесення будь-яких змін до процесу реалізатором. Тому, якщо ви внесете кілька змін до налаштувань на початку, решта буде зашифрована без дозволу, тому це дуже ефективний захід безпеки.

Однак, як випливає з фрази «не потрібно нічого змінювати», якщо ви дійсно увійдете в базу даних, ви зможете нормально побачити дані, а якщо ви отримаєте запис бази даних з програми, ви зможете побачити дані в звичайному режимі. Якщо отримані дані зашифровані, необхідно буде змінити процес, тому він не буде відповідати формулюванню «Не потрібно змінювати процес».

Потім в 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 Папка прихована, тому зробіть її видимою в налаштуваннях провідника.

У папці є папка з ім'ям створеної вами бази даних, тому відкрийте її.

Усередині є табличний файл.

Відкрийте цей файл у текстовому редакторі, наприклад Блокноті. Оскільки це двійковий файл, я думаю, що в ньому в основному є рядок тексту, який я погано розумію. Якщо ви подивитеся внизу, то побачите текст зареєстрованого запису.

Якщо він не зашифрований таким чином, вміст запису буде відомий, навіть якщо файл відкрито безпосередньо. Вам не потрібно входити в базу даних, щоб дізнатися, що всередині.

Налаштування параметрів прозорого шифрування

Щоб увімкнути прозоре шифрування, потрібно встановити плагін. Спочатку перевірте, чи входить плагін до команди.

Запустіть його, вибравши «MySQL 8.0 Command Line Client» у меню «Пуск».

Після введення пароля та входу в систему введіть наступну команду:

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

Оскільки ви ще не встановили його, він повинен бути порожнім.

Тепер давайте налаштуємо плагін. Спочатку створіть такі папки: Насправді не має значення, де ви його створюєте і яка це назва. Укажіть його як місце, де ви хочете зберегти файл ключа пізніше.

  • C:\ProgramData\MySQL\mysql-keyring

Далі відкриваємо в текстовому редакторі наступний файл:

  • 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. Ви також можете перезапустити його за допомогою команди.

При перезавантаженні файл автоматично створюється в зазначеній папці.

Переконатися, що плагін інстальовано, можна ще раз виконати команду перевірки плагіна.

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

Однак, будь ласка, зверніть увагу, що це займе час, якщо записів багато, оскільки всі файли таблиць перезаписуються.