Прозрачное шифрование (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
Папка является скрытой папкой, поэтому убедитесь, что она видна в настройках проводника.
Внутри папки находится папка с названием созданной вами базы данных, поэтому откройте ее.
Внутри находятся файлы табличного уровня.
Откройте этот файл в текстовом редакторе, таком как Блокнот. Поскольку это двоичный файл, я думаю, что в основном есть текст, который я не очень хорошо понимаю. Если вы посмотрите на нижнюю часть, то увидите текст зарегистрированной записи.
Если он не зашифрован таким образом, вы можете узнать содержимое записи, просто открыв файл напрямую. Вам не нужно входить в базу данных, чтобы знать, что внутри.
Настройте прозрачное шифрование
Чтобы включить прозрачное шифрование, вам необходимо установить плагин. Во-первых, проверьте команду, включен ли плагин.
Выберите 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';
Однако будьте осторожны и не переписывайте все табличные файлы, так как это займет много времени, если записей будет слишком много.