Шифрование MariaDB в состоянии покоя с помощью плагина AWS KMS — смена ключей не работает?

Я настроил MariaDB для шифрования при хранении через Подключаемый модуль AWS Key Management Service (KMS).

Вроде все работает, кроме зацикливания клавиш.

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

/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 с помощью innodb_encryption_rotate_key_age = 1, но по ключам в /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

person Joe Harvey    schedule 11.06.2018    source источник


Ответы (1)


Основная ротация

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

  1. Проверьте шифрование табличного пространства innodb. MIN_KEY_VERSION означает:
    #P4#
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)
  1. Повторите поворот с шага 2 еще раз, чтобы иметь MIN_KEY_VERSION не менее 2. Это также будет означать, что вам нужно будет хранить как версию 2, так и версию 3 ключей.

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

Подсказка № 2: журнал повторов

Журнал повторов по-прежнему зашифрован предыдущей версией ключа, и 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

person Vlad the Deployer    schedule 18.01.2019