Прозоре шифрування (TDE) для таблиць MySQL (Windows)

Дата створення сторінки :

Середовище підтвердження роботи

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

Необхідне середовище

MySQL
  • MySQL 8.0 Community Edition
  • MySQL 8.0 Enterprise Edition
Вікна
  • Вікна 11
  • Вікна 10
Сервер Windows
  • 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 Папка є прихованою, тому переконайтеся, що вона видима в налаштуваннях Провідника файлів.

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

Усередині знаходяться файли на рівні таблиці.

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

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

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

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

Виберіть 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';

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