6.4.4.5 使用 keyring_aws Amazon Web Services 密钥环插件

Note

keyring_aws插件是 MySQL Enterprise Edition(商业产品)中的扩展。要了解有关商品的更多信息,请参阅https://www.mysql.com/products/

keyring_aws keyring 插件与 Amazon Web Services 密钥 Management 服务(AWS KMS)通信,作为密钥生成的后端,并使用本地文件存储密钥。所有密钥环资料都是由 AWS 服务器专门生成的,而不是由keyring_aws生成的。

keyring_aws在以下平台上可用:

  • EL7

  • macOS 10.13 和 10.14

  • SLES 12

  • Ubuntu 14.04 和 16.04

  • Windows

此处的讨论假定您通常熟悉 AWS,尤其是 KMS。一些相关的信息来源:

以下各节提供了keyring_aws键环插件的配置和使用信息:

keyring_aws Configuration

要安装keyring_aws插件,请使用第 6.4.4.1 节“安装 Keyring 插件”中的常规密钥环安装说明以及在此处找到的特定于插件的配置信息。

插件库文件包含keyring_aws插件和两个用户定义的函数(UDF)keyring_aws_rotate_cmk()keyring_aws_rotate_keys()

要配置keyring_aws,您必须获取一个 Secret 访问密钥,该密钥提供用于与 AWS KMS 通信的凭证,并将其写入配置文件:

  • 创建一个 AWS KMS 账户。

  • 使用 AWS KMS 创建 Secret 访问密钥 ID 和 Secret 访问密钥。访问密钥用于验证您的身份以及应用程序的身份。

  • 使用 AWS KMS 帐户创建 Client 主密钥(CMK)ID。在 MySQL 启动时,将keyring_aws_cmk_id系统变量设置为 CMK ID 值。此变量是必需变量,没有默认值。 (如果需要,可以使用SET GLOBAL在运行时更改其值。)

  • 如有必要,创建配置文件所在的目录。该目录应具有限制性模式,并且只能由用于运行 MySQL 服务器的帐户访问。例如,在 Unix 和类似 Unix 的系统上,要使用/usr/local/mysql/mysql-keyring/keyring_aws_conf作为文件名,以下命令(执行为root)创建其父目录并设置目录模式和所有权:

shell> cd /usr/local/mysql
shell> mkdir mysql-keyring
shell> chmod 750 mysql-keyring
shell> chown mysql mysql-keyring
shell> chgrp mysql mysql-keyring

在 MySQL 启动时,将keyring_aws_conf_file系统变量设置为/usr/local/mysql/mysql-keyring/keyring_aws_conf以向服务器指示配置文件的位置。

  • 准备keyring_aws配置文件,其中应包含两行:

  • 第 1 行:Secret 访问密钥 ID

  • 第 2 行:Secret 访问密钥

例如,如果密钥 ID 为wwwwwwwwwwwwwEXAMPLE且密钥为xxxxxxxxxxxxx/yyyyyyy/zzzzzzzzEXAMPLEKEY,则配置文件如下所示:

wwwwwwwwwwwwwEXAMPLE
xxxxxxxxxxxxx/yyyyyyy/zzzzzzzzEXAMPLEKEY

为了在服务器启动过程中可用,必须使用--early-plugin-load选项加载keyring_awskeyring_aws_cmk_id系统变量是必需的,并且配置从 AWS KMS 服务器获得的 Client 主密钥(CMK)ID。 keyring_aws_conf_filekeyring_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插件成功启动,配置文件必须存在并且包含有效的 Secret 访问密钥信息,该信息已如前所述进行了初始化。存储文件不必存在。如果不是,则keyring_aws尝试创建它(以及它的父目录,如有必要)。

有关用于配置keyring_aws插件的系统变量的其他信息,请参见第 6.4.4.11 节,“密钥环系统变量”

启动 MySQL 服务器并安装与keyring_aws插件关联的 UDF。这是一次性操作,通过执行以下语句并根据需要调整平台的.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个 UDF 的其他信息,请参见第 6.4.4.9 节“特定于插件的密钥环密钥 Management 功能”

keyring_aws Operation

在插件启动时,keyring_aws插件从其配置文件读取 AWSSecret 访问密钥 ID 和密钥。它还会将包含在其存储文件中的所有加密密钥读入其内存中的缓存。

在操作过程中,keyring_aws将加密的密钥维护在内存中的高速缓存中,并将该存储文件用作本地持久性存储。每个密钥环操作都是事务性的:keyring_aws或者成功更改了内存中的密钥高速缓存和密钥环存储文件,或者操作失败并且密钥环状态保持不变。

为确保仅在存在正确的密钥环存储文件时才刷新密钥,keyring_aws将密钥环的 SHA-256 校验和存储在文件中。在更新文件之前,插件会验证它是否包含预期的校验和。

keyring_aws插件支持包含标准 MySQL Keyring 服务接口的功能。这些功能执行的密钥环操作可从两个级别访问:

示例(使用 UDF):

SELECT keyring_key_generate('MyKey', 'AES', 32);
SELECT keyring_key_remove('MyKey');

此外,keyring_aws_rotate_cmk()keyring_aws_rotate_keys() UDF“扩展”了密钥环插件接口,以提供标准密钥环服务接口未涵盖的与 AWS 相关的功能。这些功能只能通过调用 UDF 来访问。没有相应的 C 语言按键服务功能。

有关keyring_aws允许的密钥类型的信息,请参见第 6.4.4.6 节“支持的密钥环密钥类型和长度”

keyring_aws 凭据更改

假设keyring_aws插件在服务器启动时已正确初始化,则可以更改用于与 AWS KMS 通信的凭证:

  • 使用 AWS KMS 创建新的 Secret 访问密钥 ID 和 Secret 访问密钥。

  • 将新凭据存储在配置文件(由keyring_aws_conf_file系统变量命名的文件)中。文件格式如前所述。

  • 重新初始化keyring_aws插件,以便它重新读取配置文件。假设新凭据有效,则插件应成功初始化。

有两种方法可以重新初始化插件:

  • 重新启动服务器。这更简单并且没有副作用,但是不适用于要求服务器停机时间最少且重启次数尽可能少的安装。

  • 通过执行以下语句重新初始化插件,而无需重新启动服务器,并根据需要调整平台的.so后缀:

UNINSTALL PLUGIN keyring_aws;
INSTALL PLUGIN keyring_aws SONAME 'keyring_aws.so';

Note

INSTALL PLUGIN除了在运行时加载插件外,还具有将插件注册到mysql.plugin系统 table 中的副作用。因此,如果您决定停止使用keyring_aws,则从用于启动服务器的选项集中删除--early-plugin-load选项是不够的。这样可以阻止插件过早加载,但是服务器到达启动 Sequences 中加载mysql.plugin中注册的插件时,服务器仍会尝试加载该插件。

因此,如果您执行刚刚描述的UNINSTALL PLUGININSTALL PLUGIN序列来更改 AWS KMS 凭证,则要停止使用keyring_aws,除了删除--early-plugin-load选项外,还必须再次执行UNINSTALL PLUGIN来注销插件。