Spec-Zone.ru › MariaDB

Включение шифрования InnoDB

Для включения шифрования данных в покое для таблиц с использованием движков хранения InnoDB, сначала необходимо настроить сервер для использования плагина Управление ключами шифрования. После этого можно включить шифрование, установив системную переменную innodb_encrypt_tables для шифрования InnoDB системных и файловых табличных пространств и установив системную переменную innodb_encrypt_log для шифрования журнала переигрывания InnoDB Redo Log.

Установка этих системных переменных включает функцию шифрования для таблиц InnoDB на вашем сервере. Для использования этой функции необходимо использовать параметр таблицы ENCRYPTION_KEY_ID для указания используемого ключа шифрования и параметр таблицы ENCRYPTED для включения шифрования.

При шифровании любых таблиц InnoDB рекомендуется также включить шифрование журнала переигрывания. Если у вас есть зашифрованные таблицы InnoDB, но журнал переигрывания не зашифрован, данные, записанные в зашифрованную таблицу, могут быть найдены незашифрованными в журнале переигрывания.

Включение шифрования для автоматически зашифрованных табличных пространств

Системная переменная innodb_encrypt_tables управляет конфигурацией автоматического шифрования таблиц InnoDB. Она имеет следующие возможные значения:

Параметр Описание
OFF Отключает шифрование таблиц.
ON Включает шифрование таблиц, но позволяет создавать незашифрованные таблицы.
FORCE Включает шифрование таблиц и не позволяет создавать незашифрованные таблицы. Добавлено в MariaDB 10.1.4.

Когда innodb_encrypt_tables установлено в значение ON, таблицы InnoDB по умолчанию автоматически зашифрованы. Например, следующие операторы создают зашифрованную таблицу и подтверждают, что она зашифрована:

SET GLOBAL innodb_encryption_threads=4;

SET GLOBAL innodb_encrypt_tables=ON;

SET SESSION innodb_default_encryption_key_id=100;

CREATE TABLE tab1 (
   id int PRIMARY KEY,
   str varchar(50)
);

SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID
FROM information_schema.INNODB_TABLESPACES_ENCRYPTION
WHERE NAME='db1/tab1';
+----------+-------------------+----------------+
| NAME     | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------+-------------------+----------------+
| db1/tab1 |                 1 |            100 |
+----------+-------------------+----------------+

Когда innodb_encrypt_tables установлено в значение ON, незашифрованную таблицу InnoDB можно создать, установив параметр таблицы ENCRYPTED в значение NO для таблицы. Например, следующие операторы создают незашифрованную таблицу и подтверждают, что она не зашифрована:

SET GLOBAL innodb_encryption_threads=4;

SET GLOBAL innodb_encrypt_tables=ON;

SET SESSION innodb_default_encryption_key_id=100;

CREATE TABLE tab1 (
   id int PRIMARY KEY,
   str varchar(50)
) ENCRYPTED=NO;

SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID
FROM information_schema.INNODB_TABLESPACES_ENCRYPTION
WHERE NAME='db1/tab1';
+----------+-------------------+----------------+
| NAME     | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------+-------------------+----------------+
| db1/tab1 |                 0 |            100 |
+----------+-------------------+----------------+

Когда innodb_encrypt_tables установлено в значение FORCE, таблицы InnoDB по умолчанию автоматически зашифрованы, и создание незашифрованных таблиц InnoDB запрещено. В этом случае, если вы установите параметр таблицы ENCRYPTED в значение NO для таблицы, возникнет ошибка. Например:

SET GLOBAL innodb_encryption_threads=4;

SET GLOBAL innodb_encrypt_tables='FORCE';

SET SESSION innodb_default_encryption_key_id=100;

CREATE TABLE tab1 (
   id int PRIMARY KEY,
   str varchar(50)
) ENCRYPTED=NO;
ERROR 1005 (HY000): Can't create table `db1`.`tab1` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+----------------------------------------------------------------------+
| Level   | Code | Message                                                              |
+---------+------+----------------------------------------------------------------------+
| Warning |  140 | InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1                     |
| Warning |  140 | InnoDB: ENCRYPTED=NO cannot be used with innodb_encrypt_tables=FORCE |
| Error   | 1005 | Can't create table `db1`.`tab1` (errno: 140 "Wrong create options")  |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB      |
+---------+------+----------------------------------------------------------------------+
4 rows in set (0.00 sec)

Когда innodb_encrypt_tables установлено в значение ON или FORCE, необходимо убедиться, что innodb_encryption_threads установлено в ненулевое значение, чтобы InnoDB мог выполнять необходимые операции шифрования в фоновом режиме. См. фоновые операции для получения дополнительной информации об этом. innodb_encryption_rotate_key_age также должно быть установлено в ненулевое значение для начальных операций шифрования в фоновом режиме. См. отключение операций вращения ключей для получения дополнительной информации об этом.

Включение шифрования для вручную зашифрованных табличных пространств

Если вы не хотите автоматически шифровать каждую таблицу InnoDB, можно вручную включить шифрование только для подмножества таблиц InnoDB, которые вы хотите зашифровать. MariaDB предоставляет параметры таблиц ENCRYPTED и ENCRYPTION_KEY_ID, которые можно использовать для ручного включения шифрования для определенных таблиц InnoDB. Эти параметры таблиц могут использоваться с операторами CREATE TABLE и ALTER TABLE. Эти параметры могут использоваться только с таблицами InnoDB, у которых есть собственные файловые табличные пространства InnoDB по каждой таблице, то есть с таблицами, созданными с установкой innodb_file_per_table=ON.

Параметр таблицы Значение Описание
ENCRYPTED Булево Определяет, нужно ли шифровать таблицу
ENCRYPTION_KEY_ID 32-битное целое число Определяет идентификатор ключа шифрования, который нужно использовать

Вы можете вручную включить или отключить шифрование для таблицы, используя параметр таблицы ENCRYPTED. Если вам нужно защитить только подмножество таблиц InnoDB с помощью шифрования, то может быть целесообразно вручную зашифровать каждую таблицу, которой требуется дополнительная защита, вместо глобального шифрования всех таблиц InnoDB с помощью innodb_encrypt_tables. Это позволяет сбалансировать безопасность и скорость, так как это означает, что накладные расходы на производительность шифрования и дешифрования применяются только к тем таблицам, которые требуют дополнительной безопасности.

Если зашифрованная вручную таблица InnoDB содержит индекс FULLTEXT, то внутренняя таблица для индекса полнотекстового поиска также не будет вручную зашифрована. Чтобы зашифровать внутренние таблицы для индексов полнотекстового поиска InnoDB, необходимо включить автоматическое шифрование InnoDB, установив innodb_encrypt_tables в значение ON или FORCE.

Вы также можете вручную указать ключ шифрования для таблицы, используя параметр таблицы ENCRYPTION_KEY_ID. Это позволяет использовать различные ключи шифрования для различных таблиц. Например, вы можете создать таблицу с помощью оператора:

CREATE TABLE tab1 (
   id int PRIMARY KEY,
   str varchar(50)
) ENCRYPTED=YES ENCRYPTION_KEY_ID=100;

SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID
FROM information_schema.INNODB_TABLESPACES_ENCRYPTION
WHERE NAME='db1/tab1';
+----------+-------------------+----------------+
| NAME     | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------+-------------------+----------------+
| db1/tab1 |                 1 |            100 |
+----------+-------------------+----------------+

Если параметр таблицы ENCRYPTION_KEY_ID не указан, то таблица будет зашифрована с использованием ключа, указанного в системной переменной innodb_default_encryption_key_id. Например, вы можете создать таблицу с помощью оператора:

SET SESSION innodb_default_encryption_key_id=100;

CREATE TABLE tab1 (
   id int PRIMARY KEY,
   str varchar(50)
) ENCRYPTED=YES;

SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID
FROM information_schema.INNODB_TABLESPACES_ENCRYPTION
WHERE NAME='db1/tab1';
+----------+-------------------+----------------+
| NAME     | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------+-------------------+----------------+
| db1/tab1 |                 1 |            100 |
+----------+-------------------+----------------+

Если у вас есть существующая таблица и вы хотите вручную включить шифрование для этой таблицы, то это можно сделать с помощью оператора ALTER TABLE. Например:

CREATE TABLE tab1 (
   id int PRIMARY KEY,
   str varchar(50)
) ENCRYPTED=NO;

SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID
FROM information_schema.INNODB_TABLESPACES_ENCRYPTION
WHERE NAME='db1/tab1';
+----------+-------------------+----------------+
| NAME     | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------+-------------------+----------------+
| db1/tab1 |                 0 |            100 |
+----------+-------------------+----------------+

ALTER TABLE tab1
   ENCRYPTED=YES ENCRYPTION_KEY_ID=100;

SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID
FROM information_schema.INNODB_TABLESPACES_ENCRYPTION
WHERE NAME='db1/tab1';
+----------+-------------------+----------------+
| NAME     | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------+-------------------+----------------+
| db1/tab1 |                 1 |            100 |
+----------+-------------------+----------------+

InnoDB не позволяет вносить изменения в шифрование таблиц в системном табличном пространстве с помощью ALTER TABLE. Шифрование системного табличного пространства можно настроить только путем изменения значения системной переменной innodb_encrypt_tables. Это означает, что при шифровании или дешифровании системного табличного пространства необходимо также установить ненулевое значение для системной переменной innodb_encryption_threads, а также установить системную переменную innodb_system_rotate_key_age в значение 1 для обеспечения правильного шифрования или дешифрования системного табличного пространства фоновыми потоками. Дополнительную информацию можно найти в MDEV-14398.

Включение шифрования для временных табличных пространств

Системная переменная innodb_encrypt_temporary_tables управляет конфигурацией шифрования для временного табличного пространства. Она имеет следующие возможные значения:

Параметр Описание
OFF Отключает шифрование временных таблиц.
ON Включает шифрование временных таблиц.

Эту системную переменную можно задать в качестве аргумента командной строки для mysqld, или можно задать в соответствующей группе параметров сервера в файле конфигурации группы параметров в файле конфигурации. Например:

[mariadb]
...
innodb_encrypt_temporary_tables=ON

Включение шифрования для журнала переигрывания

InnoDB использует журнал переигрывания Redo Log при восстановлении после сбоя. По умолчанию эти события записываются в файл в незашифрованном состоянии. При настройке MariaDB для шифрования данных в покое убедитесь, что вы также включили шифрование для журнала переигрывания.

Чтобы зашифровать журнал переигрывания, сначала остановите процесс сервера. Затем установите innodb_encrypt_log в значение ON в соответствующей группе параметров сервера в файле группы параметров в файле конфигурации. Например:

[mariadb]
...
innodb_encrypt_log = ON

Затем запустите MariaDB. При повторном запуске сервер проверяет восстановление InnoDB в случае сбоя. После возвращения в онлайн-режим он начинает запись зашифрованных данных в журнал переигрывания.

В MariaDB 10.3 и ранее InnoDB не поддерживает вращение ключей для журнала переопределения. Вращение ключей для журнала переопределения поддерживается в MariaDB 10.4 и более поздних версиях. Для получения дополнительной информации см. Ключи шифрования InnoDB: Вращение ключей.

См. также

  • Отключение шифрования InnoDB
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется заранее компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/innodb-enabling-encryption/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API