MariaDB шифрование в состоянии покоя с помощью плагина AWS KMS - вращение ключа не работает? - PullRequest
0 голосов
/ 11 июня 2018

Я настроил MariaDB для шифрования в состоянии покоя с помощью плагина Служба управления ключами (KMS) *1003*. .

Кажется, что все работает, кроме циклической смены ключей.

Я настроил следующие параметры в соответствии с приложенными файлами конфигурации:

/ etc / my.cnf

[mysqld]
# InnoDB/XtraDB Encryption
innodb_encrypt_tables = On
innodb_encrypt_log = On
innodb_encryption_threads = 8
innodb_encryption_rotate_key_age = 1
innodb_encryption_rotation_iops = 100

/etc/my.cnf.d/aws_key_management.cnf

[mariadb]

# Load the AWs plugin and enable it for use
plugin-load-add=aws_key_management.so

# Link to the AWS KMS 'Customer Master Key' used to decrypt MariaDB 
encryption keys on disk
# during MariaDB start up and save the decrypted keys into memory
aws_key_management_master_key_id = alias/MariaDB-Encryption-Key

# Specify the AWS region our KMS key is stored in
aws_key_management_region = eu-west-2

# Specify the key specification
aws_key_management_key_spec = AES_256

# Rotate all keys
aws_key_management_rotate_key = -1

# Change the plugins log level
# Options: "Off" (default), "Fatal", "Error", "Warn", "Info", 
"Debug", and "Trace".
aws_key_management_log_level = Warn

!include /etc/my.cnf.d/enable_encryption.preset

Как видите, я установил все ключи для поворота, используя aws_key_management_rotate_key = -1, и установил возраст ключей 1, используя * 1022.*, но по клавишам в /var/lib/mysql/ я вижу, что версия 1 клавиш все еще используется, несмотря на то, что эти настройки действовали в течение нескольких дней:

/var/lib/mysql/aws-kms-key.1.1
/var/lib/mysql/aws-kms-key.2.1

( Примечание : последний суффикс .n в имени файла представляет ключевую версию)

Единственное, о чем я могу подумать, это то, что мое понимание innodb_encryption_rotate_key_age измеряется в днях неверно?Документация по этой опции приведена ниже и вообще не содержит ссылки на то, какая единица измерения используется с этим числовым значением?

innodb_encryption_rotate_key_age

Описание : перешифровать в фоновом режиме любую страницу, ключ которой старше> этого.При настройке шифрования эта переменная должна иметь ненулевое значение>.В противном случае, если вы включите шифрование через innodb_encrypt_tables>, MariaDB не сможет автоматически зашифровать любые незашифрованные таблицы.

Может кто-нибудь объяснить, почему это происходит и почему мои ключи не вращаются?

Версия MariaDB

mysql --version
mysql  Ver 15.1 Distrib 10.2.15-MariaDB, for Linux (x86_64) using readline 5.1`

Версия плагина AWS KMS

yum list installed | grep mariadb
MariaDB-aws-key-management.x86_64       10.2.15-1.el7.centos     @mariadb-main

1 Ответ

0 голосов
/ 18 января 2019

Базовое вращение

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

  1. Не забудьте удалить aws_key_management_rotate_key из конфигурации, потому что она вам не понадобится.
  2. Запустите вращение, установив глобальное значение с консоли.Обратите внимание, что вам не нужно сбрасывать его 0 вручную после поворота.Плагин будет сообщать о создании нового набора (версий) ключей данных.
MariaDB [(none)]> SET @@GLOBAL.aws_key_management_rotate_key=-1;
Query OK, 0 rows affected, 4 warnings (0.875 sec)

MariaDB [(none)]> SELECT @@GLOBAL.aws_key_management_rotate_key;
+----------------------------------------+
| @@GLOBAL.aws_key_management_rotate_key |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
1 row in set (0.000 sec)

MariaDB [(none)]> SHOW WARNINGS;
+-------+------+---------------------------------------------------------------------+
| Level | Code | Message                                                             |
+-------+------+---------------------------------------------------------------------+
| Note  | 1105 | AWS KMS plugin: generated encrypted datakey for key id=1, version=2 |
| Note  | 1105 | AWS KMS plugin: loaded key 1, version 2, key length 256 bit         |
| Note  | 1105 | AWS KMS plugin: generated encrypted datakey for key id=2, version=2 |
| Note  | 1105 | AWS KMS plugin: loaded key 2, version 2, key length 256 bit         |
+-------+------+---------------------------------------------------------------------+
4 rows in set (0.000 sec)

Ссылка: https://mariadb.com/kb/en/library/aws-key-management-encryption-plugin/#rotating-keys

Получено # 1: разрешено устаревание версии

К сожалению, это еще не конец.Версия 2 теперь будет использоваться для шифрования новых страниц по умолчанию, однако страницы, зашифрованные с помощью предыдущей версии, не будут повторно зашифрованы в фоновом режиме, как и следовало ожидать.Это связано с настройкой innodb_encryption_rotate_key_age=0 , отключающей фоновое шифрование, в отличие от принудительного 0 срока действия версии ключа.Таким образом, минимальный возрастной интервал, который мы можем установить, составляет 1, что позволяет использовать предыдущую версию (в моем случае версию 1) для шифрования БД.

Проверьте шифрование табличного пространства innodb.MIN_KEY_VERSION означает:

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

MariaDB [test]> SELECT NAME, MIN_KEY_VERSION, CURRENT_KEY_VERSION, ROTATING_OR_FLUSHING FROM information_schema.INNODB_TABLESPACES_ENCRYPTION;
+----------------------------+-----------------+---------------------+----------------------+
| NAME                       | MIN_KEY_VERSION | CURRENT_KEY_VERSION | ROTATING_OR_FLUSHING |
+----------------------------+-----------------+---------------------+----------------------+
| innodb_system              |               1 |                   2 |                    0 |
| mysql/gtid_slave_pos       |               1 |                   2 |                    0 |
| mysql/innodb_index_stats   |               1 |                   2 |                    0 |
| mysql/innodb_table_stats   |               1 |                   2 |                    0 |
| mysql/transaction_registry |               1 |                   2 |                    0 |
| test/tbl                   |               1 |                   2 |                    0 |
+----------------------------+-----------------+---------------------+----------------------+
6 rows in set (0.000 sec)
Повторите вращение, начиная с шага 2, еще раз, чтобы MIN_KEY_VERSION было не менее 2.Это также будет означать, что вам нужно будет хранить ключи версий 2 и 3.

Ссылка: https://mariadb.com/kb/en/library/information-schema-innodb_tablespaces_encryption-table/

Прием № 2: redo log

Журнал повторного выполнения по-прежнему зашифрован с использованием предыдущей версии ключа, и MariaDB не запустится, если старый ключ отсутствует.

 0 [ERROR] mysqld: can't open file aws-kms-key.1.1
 0 [Warning] mysqld: AWS KMS plugin: key 1, version 1 could not be decrypted
 0 [ERROR] InnoDB: Obtaining redo log encryption key version 1 failed (2385237688). Maybe the key or the required encryption key management plugin was not found.
...
 0 [ERROR] InnoDB: No valid checkpoint found (corrupted redo log). You can try --innodb-force-recovery=6 as a last resort.
...
 0 [ERROR] Unknown/unsupported storage engine: InnoDB
 0 [ERROR] Aborting

Поворот ключа для журнала повторного выполнения InnoDB возможен толькоподдерживается в MariaDB 10.4.0 и выше.Об этом см. MDEV-12041.

Ссылка: https://mariadb.com/kb/en/library/encrypting-data-for-innodb-xtradb/#key-rotation

...