Применение прозрачного шифрования (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
  • 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. Вы также можете перезапустить его с помощью команды.

При перезапуске файл автоматически создается в указанной папке.

Убедиться в том, что подключаемый модуль установлен, можно, выполнив команду check plug-in еще раз.

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

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