mariadb通过aws-kms插件进行静态加密-密钥轮换不起作用?

ih99xse1  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(460)

我已经通过aws密钥管理服务(kms)插件为mariadb设置了静态加密。
除了钥匙自行车,一切似乎都正常。
我已根据随附的配置文件配置了以下选项:
/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\密钥\管理.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 并使用 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\u加密\u旋转\u密钥\u年龄
描述:在后台重新加密密钥早于>的任何页面。设置加密时,此变量必须设置为非零值>。否则,当您通过innodb\u encrypt\u 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
balp4ylt

balp4ylt1#

基本旋转

作为解决方法,可以通过全局变量触发旋转。mariadb和/或插件似乎没有根据config值执行任何操作,如您所述。这样做的好处是,您不必重新启动数据库。
别忘了取下 aws_key_management_rotate_key 因为你不需要它。
通过从控制台设置全局值来触发旋转。请注意,旋转后不需要手动将其重置为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-钥匙

问题1:允许的版本老化

不幸的是,这还没有结束。默认情况下,版本2将用于加密新页面,但是使用以前版本加密的页面不会像预期的那样在后台重新加密。这是由于设置 innodb_encryption_rotate_key_age=0 禁用后台加密,而不是强制 0 关键版本年龄。所以,我们可以设定的最小年龄差距是 1 ,它允许db使用以前的版本(在我的示例中是版本1)进行加密。
检查innodb表空间加密。最小密钥版本是指:
用于加密表空间中页的最小密钥版本。不同的页面可以用不同的密钥版本加密。

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\ U key\版本 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

只有mariadb 10.4.0及更高版本才支持innodb redo log的键旋转。见mdev-12041。
参考文献:https://mariadb.com/kb/en/library/encrypting-data-for-innodb-xtradb/#key-旋转

相关问题