8.4.4.7 使用 Amazon Web Services 密钥环插件 keyring_aws
keyring_aws 插件是 MySQL Enterprise Edition 的扩展,一个商业产品。要了解更多关于商业产品,请访问https://www.mysql.com/products/。
keyring_aws 密钥环插件将与 Amazon Web Services Key Management Service (AWS KMS) 作为密钥生成和存储的后端通信,并使用本地文件存储密钥。所有密钥环材料都是由 AWS 服务器生成的,而不是 keyring_aws。
MySQL Enterprise Edition 可以在 Red Hat Enterprise Linux、SUSE Linux Enterprise Server、Debian、Ubuntu、macOS 和 Windows 上使用 keyring_aws。但是,MySQL Enterprise Edition 不支持在以下平台上使用 keyring_aws:
-
EL6
-
Generic Linux (glibc2.12)
-
SLES 12(与 MySQL Server 5.7 及更高版本)
-
Solaris
本讨论假设您熟悉 AWS 和 KMS。以下是一些相关信息来源:
以下部分提供了 keyring_aws 密钥环插件的配置和使用信息:
要安装keyring_aws
,请按照第8.4.4.3节,“Keyring Plugin Installation”中的一般说明,并将这里找到的一些插件特定的配置信息一起使用。
插件库文件包含keyring_aws
插件和两个可加载函数:keyring_aws_rotate_cmk()
和keyring_aws_rotate_keys()
。
要配置keyring_aws
,您需要获取一个提供AWS KMS通信凭证的秘密访问密钥,并将其写入到配置文件中:
-
创建AWS KMS账户。
-
使用AWS KMS创建secret access key ID和secret access key。access key用来验证您的身份和应用程序的身份。
-
使用AWS KMS账户创建KMS密钥ID。在MySQL启动时,设置
keyring_aws_cmk_id
系统变量为CMK ID值。这是一个必需的变量,没有默认值。 (如果需要,可以在运行时使用SET GLOBAL
更改其值。) -
如果必要,创建配置文件所在目录。该目录应该具有限制性模式,并且只能被用来运行 MySQL 服务器的账户访问。例如,在 Unix 和 Unix 类系统上,要使用
/usr/local/mysql/mysql-keyring/keyring_aws_conf
作为文件名,那么(以root
身份执行)以下命令创建其父目录,并设置目录模式和所有权:$> cd /usr/local/mysql $> mkdir mysql-keyring $> chmod 750 mysql-keyring $> chown mysql mysql-keyring $> chgrp mysql mysql-keyring
在 MySQL 启动时,将
keyring_aws_conf_file
系统变量设置为/usr/local/mysql/mysql-keyring/keyring_aws_conf
,以指示服务器配置文件的位置。 -
准备
keyring_aws
配置文件,该文件应该包含两个行:-
第 1 行:秘密访问密钥 ID
-
第 2 行:秘密访问密钥
例如,如果密钥 ID 是
wwwwwwwwwwwwwEXAMPLE
,密钥是xxxxxxxxxxxxx/yyyyyyy/zzzzzzzzEXAMPLEKEY
,那么配置文件看起来像这样:wwwwwwwwwwwwwEXAMPLE xxxxxxxxxxxxx/yyyyyyy/zzzzzzzzEXAMPLEKEY
-
在服务器启动过程中使用keyring_aws
,需要使用--early-plugin-load
选项加载。系统变量keyring_aws_cmk_id
是必需的,用于配置从AWS KMS服务器获取的KMS密钥ID。系统变量keyring_aws_conf_file
和keyring_aws_data_file
可选地配置keyring_aws
插件用于配置信息和数据存储的文件位置。文件位置变量的默认值是平台相关的。要显式配置文件位置,设置变量值在启动时。例如,在服务器my.cnf文件中添加以下行,根据平台需要调整.so后缀和文件路径:
[mysqld]
early-plugin-load=keyring_aws.so
keyring_aws_cmk_id='arn:aws:kms:us-west-2:111122223333:key/abcd1234-ef56-ab12-cd34-ef56abcd1234'
keyring_aws_conf_file=/usr/local/mysql/mysql-keyring/keyring_aws_conf
keyring_aws_data_file=/usr/local/mysql/mysql-keyring/keyring_aws_data
为了使keyring_aws
插件启动成功,配置文件必须存在并包含有效的秘密访问密钥信息,按照之前描述初始化。存储文件不需要存在。如果不存在,keyring_aws
将尝试创建它(包括必要的父目录)。
关于配置keyring_aws
插件的系统变量的详细信息,请参见第8.4.4.16节,“Keyring System Variables”。
启动MySQL服务器并安装与keyring_aws
插件相关的函数。这是一个一次性操作,通过执行以下语句来完成,根据平台需要调整.so
后缀:
CREATE FUNCTION keyring_aws_rotate_cmk RETURNS INTEGER
SONAME 'keyring_aws.so';
CREATE FUNCTION keyring_aws_rotate_keys RETURNS INTEGER
SONAME 'keyring_aws.so';
关于keyring_aws
函数的详细信息,请见第8.4.4.13节,“插件特定密钥-ring密钥管理函数”。
插件启动时,keyring_aws
插件从其配置文件中读取AWS秘密访问密钥ID和密钥,并从存储文件中读取任何加密的密钥,并将它们加载到内存缓存中。
在操作过程中,keyring_aws
插件维护内存缓存中的加密密钥,并使用存储文件作为本地持久存储。每个密钥-ring操作都是事务性的:keyring_aws
插件要么成功更改内存密钥缓存和密钥-ring存储文件,要么操作失败,密钥-ring状态保持不变。
为了确保只有在正确的密钥-ring存储文件存在时才flush密钥,keyring_aws
插件将密钥-ring的SHA-256校验和存储到文件中。在更新文件之前,插件将验证它是否包含预期的校验和。
keyring_aws
插件支持标准MySQL Keyring服务接口中的函数。密钥-ring操作由这些函数执行,可以在两个级别上访问:
-
SQL接口:在SQL语句中,调用第8.4.4.12节,“通用Keyring密钥管理函数”中描述的函数。
-
C接口:在C语言代码中,调用第7.6.9.2节,“Keyring服务”中描述的密钥ring服务函数。
示例(使用SQL接口):
SELECT keyring_key_generate('MyKey', 'AES', 32);
SELECT keyring_key_remove('MyKey');
此外,keyring_aws_rotate_cmk()
和keyring_aws_rotate_keys()
函数“扩展”密钥ring插件接口,以提供AWS相关功能,不受标准密钥ring服务接口的覆盖。这些功能只能通过使用SQL来调用,这些函数没有相应的C语言密钥服务函数。
有关keyring_aws密钥值的特性,请见第8.4.4.10节,“支持的Keyring密钥类型和长度”。
假设keyring_aws插件在服务器启动时正确初始化,可以更改与AWS KMS通信的凭证:
-
使用AWS KMS创建新的秘密访问密钥ID和秘密访问密钥。
-
将新的凭证存储在配置文件中(由
keyring_aws_conf_file
系统变量指定的文件)。文件格式如前所述。 -
重新初始化
keyring_aws
插件,以便它重新读取配置文件。假设新的凭证有效,插件应该能够成功初始化。有两种方式可以重新初始化插件:
-
重启服务器。这是更简单的方法,但可能会导致一些不必要的影响,不太适合需要尽量减少服务器停机时间的安装。
-
在不重启服务器的情况下重新初始化插件,执行以下语句,根据平台调整
.so
后缀为必要:UNINSTALL PLUGIN keyring_aws; INSTALL PLUGIN keyring_aws SONAME 'keyring_aws.so';
Note此外,在运行时加载插件之外,
INSTALL PLUGIN
还具有注册插件在mysql.plugin
系统表的副作用。因此,如果您决定停止使用keyring_aws
,仅将--early-plugin-load
选项从服务器启动时的选项集中删除是不够的。这停止了插件的早期加载,但服务器仍然尝试在加载mysql.plugin
表中的插件时加载它。因此,如果您执行刚才描述的
UNINSTALL PLUGIN
和INSTALL PLUGIN
序列来更改AWS KMS凭证,那么要停止使用keyring_aws
,需要再次执行UNINSTALL PLUGIN
以卸载插件,并且删除--early-plugin-load
选项。
-