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

0 ответов

Основное вращение

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

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

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

Другие вопросы по тегам