Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Using the HashiCorp Vault Keyring Plugin

8.4.4.10 使用 HashiCorp Vault Keyring 插件

Note

keyring_hashicorp 插件是 MySQL Enterprise Edition 的一部分,一个商业产品。要了解更多关于商业产品的信息,请参阅 https://www.mysql.com/products/

keyring_hashicorp 键环插件与 HashiCorp Vault 进行通信,以实现后端存储。该插件支持 HashiCorp Vault AppRole 认证。在 MySQL 服务器本地存储中不永久存储密钥信息。(可选的内存密钥缓存可能用作中间存储。)随机密钥生成是在 MySQL 服务器端进行的,然后将密钥存储到 Hashicorp Vault 中。

keyring_hashicorp 插件支持标准 MySQL 键环服务接口中的函数。键环操作由这些函数执行,可以在两个级别上访问:

示例(使用 SQL 接口):

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

有关 keyring_hashicorp 允许的密钥值特征的信息,请参阅 第 8.4.4.13 节,“支持的键环密钥类型和长度”

要安装 keyring_hashicorp,请使用 第 8.4.4.3 节,“键环插件安装” 中的通用说明,以及特定于 keyring_hashicorp 的配置信息。插件特定配置包括准备连接到 HashiCorp Vault 所需的证书和密钥文件,以及配置 HashiCorp Vault 本身。以下部分提供了必要的说明。

证书和密钥准备

keyring_hashicorp 插件需要使用 HTTPS 协议与 HashiCorp Vault 服务器建立安全连接。典型的设置包括一组证书和密钥文件:

  • company.crt:组织的自定义 CA 证书。这两个文件都由 HashiCorp Vault 服务器和 keyring_hashicorp 插件使用。

  • vault.key:HashiCorp Vault 服务器实例的私钥。这两个文件都由 HashiCorp Vault 服务器使用。

  • vault.crt:HashiCorp Vault 服务器实例的证书。这两个文件必须由组织 CA 证书签名。

以下说明描述了如何使用 OpenSSL 创建证书和密钥文件。(如果您已经拥有这些文件,请继续执行 HashiCorp Vault 设置。)这些说明适用于 Linux 平台,可能需要根据其他平台进行调整。

Important

按照这些说明生成的证书可能不是非常安全的。在您获得使用这些文件的经验后,考虑从注册的证书颁发机构获取证书/密钥材料。

  1. 准备公司和 HashiCorp Vault 服务器密钥。

    使用以下命令生成密钥文件:

    openssl genrsa -aes256 -out company.key 4096
    openssl genrsa -aes256 -out vault.key 2048

    这些命令生成了公司私钥 (company.key) 和 Vault 服务器私钥 (vault.key)。这些密钥是随机生成的 RSA 密钥,分别为 4,096 位和 2,048 位。

    每个命令都会提示输入密码。出于测试目的,可以省略 -aes256 参数。

    这些密钥文件包含敏感信息,应该存储在安全的位置。密码(也很敏感)将在后面使用,因此请将其写下来并存储在安全的位置。

    (可选) 要检查密钥文件的内容和有效性,请使用以下命令:

    openssl rsa -in company.key -check
    openssl rsa -in vault.key -check
  2. 创建公司CA证书。

    使用以下命令创建一个名为 company.crt 的公司CA证书文件,有效期为365天(在一行中输入命令):

    openssl req -x509 -new -nodes -key company.key
      -sha256 -days 365 -out company.crt

    如果您在密钥生成期间使用了 -aes256 参数来执行密钥加密,那么在创建CA证书时,您将被提示输入公司密钥密码。您还将被提示输入证书持有者(即您或您的公司)的信息,如下所示:

    Country Name (2 letter code) [AU]:
    State or Province Name (full name) [Some-State]:
    Locality Name (eg, city) []:
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:
    Email Address []:

    回答提示以适当的值。

  3. 创建证书签名请求。

    要创建HashiCorp Vault服务器证书,需要准备一个证书签名请求(CSR)用于新创建的服务器密钥。创建一个名为 request.conf 的配置文件,包含以下行。如果HashiCorp Vault服务器不在本地主机上运行,请替换适当的CN和IP值,并进行其他必要的更改。

    [req]
    distinguished_name = vault
    x509_entensions = v3_req
    prompt = no
    
    [vault]
    C = US
    ST = CA
    L = RWC
    O = Company
    CN = 127.0.0.1
    
    [v3_req]
    subjectAltName = @alternatives
    authorityKeyIdentifier = keyid,issuer
    basicConstraints = CA:TRUE
    
    [alternatives]
    IP = 127.0.0.1

    使用以下命令创建签名请求:

    openssl req -new -key vault.key -config request.conf -out request.csr

    输出文件(request.csr)是一个中间文件,作为创建服务器证书的输入。

  4. 创建HashiCorp Vault服务器证书。

    使用公司证书(company.crt)签名HashiCorp Vault服务器密钥(vault.key)和CSR(request.csr),以创建HashiCorp Vault服务器证书(vault.crt)。使用以下命令执行此操作(在一行中输入命令):

    openssl x509 -req -in request.csr
      -CA company.crt -CAkey company.key -CAcreateserial
      -out vault.crt -days 365 -sha256

    要使 vault.crt 服务器证书有用,需要将 company.crt 公司证书的内容追加到它上面。这是因为公司证书需要与服务器证书一起传递。

    cat company.crt >> vault.crt

    如果您显示 vault.crt 文件的内容,它应该如下所示:

    -----BEGIN CERTIFICATE-----
    ... content of HashiCorp Vault server certificate ...
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    ... content of company certificate ...
    -----END CERTIFICATE-----
HashiCorp Vault 设置

以下说明描述了如何创建一个HashiCorp Vault设置,以便测试 keyring_hashicorp 插件。

Important

测试设置类似于生产设置,但HashiCorp Vault的生产使用需要额外的安全考虑,如使用非自签名证书和将公司证书存储在系统信任存储中。您必须实施任何额外的安全步骤,以满足您的操作需求。

这些说明假设您已经拥有在 证书和密钥准备 部分创建的证书和密钥文件。如果您没有这些文件,请参阅该部分。

  1. 获取HashiCorp Vault二进制文件。

    https://www.vaultproject.io/downloads.html 下载适合您平台的HashiCorp Vault二进制文件。

    将存档的内容提取到可执行文件 vault 命令中,该命令用于执行HashiCorp Vault操作。如果必要,请将安装命令的目录添加到系统路径中。

    (可选) HashiCorp Vault支持自动完成选项,以便更容易使用。有关更多信息,请参阅 https://learn.hashicorp.com/vault/getting-started/install#command-completion

  2. 创建HashiCorp Vault服务器配置文件。

    准备一个名为 config.hcl 的配置文件,包含以下内容。对于 tls_cert_filetls_key_filepath 值,请替换适合您系统的路径名。

    listener "tcp" {
      address="127.0.0.1:8200"
      tls_cert_file="/home/username/certificates/vault.crt"
      tls_key_file="/home/username/certificates/vault.key"
    }
    
    storage "file" {
      path = "/home/username/vaultstorage/storage"
    }
    
    ui = true
  3. 启动HashiCorp Vault服务器。

    使用以下命令启动Vault服务器,其中 -config 选项指定了配置文件的路径:

    vault server -config=config.hcl

    在此步骤中,您可能会被提示输入Vault服务器私钥的密码,该私钥存储在 vault.key 文件中。

    服务器应该启动,显示一些控制台信息(IP、端口等)。

    因此,您可以输入剩余的命令,请将 vault server 命令置于后台或打开另一个终端,然后继续。

  4. 初始化HashiCorp Vault服务器。

    Note

    这些操作仅在第一次启动Vault时需要,以获取unseal密钥和root令牌。后续的Vault实例重新启动仅需要使用unseal密钥。

    发出以下命令(假设 Bourne shell 语法):

    export VAULT_SKIP_VERIFY=1
    vault operator init -n 1 -t 1

    第一个命令启用 vault 命令,以临时忽略系统信任存储中没有添加公司证书的事实。这补偿了我们的自签名 CA 未添加到该存储的事实。(对于生产使用,应该添加该证书。)

    第二个命令创建了一个单一的解封密钥,需要一个单一的解封密钥来解封。(对于生产使用,一个实例将拥有多个解封密钥,需要多个密钥来解封它。解封密钥应该交付给公司中的关键持有人。使用单个密钥可能被认为是一个安全问题,因为这允许单个关键持有人解封 vault。)

    Vault 应该回复关于解封密钥和根令牌的信息,加上一些附加文本(实际的解封密钥和根令牌值与这里显示的不同):

    ...
    Unseal Key 1: I2xwcFQc892O0Nt2pBiRNlnkHzTUrWS+JybL39BjcOE=
    Initial Root Token: s.vTvXeo3tPEYehfcd9WH7oUKz
    ...

    将解封密钥和根令牌存储在安全的位置。

  5. 解封 HashiCorp Vault 服务器。

    使用以下命令解封 Vault 服务器:

    vault operator unseal

    当提示输入解封密钥时,使用之前在 Vault 初始化期间获得的密钥。

    Vault 应该产生输出,表明设置完成且 vault 已解封。

  6. 登录 HashiCorp Vault 服务器并验证其状态。

    准备环境变量,以便以 root 身份登录:

    vault login s.vTvXeo3tPEYehfcd9WH7oUKz

    对于该命令中的令牌值,请将其替换为之前在 Vault 初始化期间获得的根令牌。

    验证 Vault 服务器状态:

    vault status

    输出应该包含以下行(以及其他行):

    ...
    Initialized     true
    Sealed          false
    ...
  7. 设置 HashiCorp Vault 身份验证和存储。

    Note

    这些操作仅在第一次运行 Vault 实例时需要,不需要在以后重复。

    启用 AppRole 身份验证方法,并验证它是否在身份验证方法列表中:

    vault auth enable approle
    vault auth list

    启用 Vault KeyValue 存储引擎:

    vault secrets enable -version=1 kv

    创建并设置一个角色,以便与 keyring_hashicorp 插件一起使用(在一行中输入命令):

    vault write auth/approle/role/mysql token_num_uses=0
      token_ttl=20m token_max_ttl=30m secret_id_num_uses=0
  8. 添加一个 AppRole 安全策略。

    Note

    这些操作仅在第一次运行 Vault 实例时需要,不需要在以后重复。

    准备一个策略,以允许之前创建的角色访问适当的秘密。创建一个名为 mysql.hcl 的新文件,内容如下:

    path "kv/mysql/*" {
      capabilities = ["create", "read", "update", "delete", "list"]
    }
    Note

    kv/mysql/ 在这个示例中可能需要根据本地安装策略和安全要求进行调整。如果是这样,请在这些说明中其他地方出现 kv/mysql/ 时也进行调整。

    将策略文件导入 Vault 服务器,以创建一个名为 mysql-policy 的策略,然后将策略分配给新角色:

    vault policy write mysql-policy mysql.hcl
    vault write auth/approle/role/mysql policies=mysql-policy

    获取新创建的角色 ID 并将其存储在安全的位置:

    vault read auth/approle/role/mysql/role-id

    生成一个秘密 ID 用于该角色,并将其存储在安全的位置:

    vault write -f auth/approle/role/mysql/secret-id

    一旦生成了 AppRole 角色 ID 和秘密 ID 凭证,它们将无限期地保持有效,不需要再次生成它们。keyring_hashicorp 插件可以使用它们进行配置,以便长期使用。有关 AuthRole 身份验证的更多信息,请访问 https://www.vaultproject.io/docs/auth/approle.html

keyring_hashicorp 插件配置

插件库文件包含 keyring_hashicorp 插件和一个可加载函数,keyring_hashicorp_update_config()。当插件初始化和终止时,它自动加载和卸载该函数,不需要手动加载和卸载。

keyring_hashicorp 插件支持以下表格所示的配置参数。要指定这些参数,请将值分配给相应的系统变量。

Configuration Parameter System Variable Mandatory
HashiCorp Server URL keyring_hashicorp_server_url
AppRole role ID keyring_hashicorp_role_id
AppRole secret ID keyring_hashicorp_secret_id
Store path keyring_hashicorp_store_path
Authorization Path keyring_hashicorp_auth_path
CA certificate file path 密钥环HashiCorp_CA路径
Cache control 密钥环HashiCorp缓存

为了在服务器启动过程中使用,密钥环HashiCorp必须使用--early-plugin-load选项加载。如前表所示,几个插件相关的系统变量是强制性的,必须设置。例如,在服务器my.cnf文件中使用以下行,根据您的平台调整.so后缀和文件位置:

[mysqld]
early-plugin-load=keyring_hashicorp.so
keyring_hashicorp_role_id='ee3b495c-d0c9-11e9-8881-8444c71c32aa'
keyring_hashicorp_secret_id='0512af29-d0ca-11e9-95ee-0010e00dd718'
keyring_hashicorp_store_path='/v1/kv/mysql'
keyring_hashicorp_auth_path='/v1/auth/approle/login'
Note

根据HashiCorp文档,所有API路由都以协议版本为前缀(可以在前面的示例中看到/v1/密钥环HashiCorp_store_path密钥环HashiCorp_auth_path值中)。如果HashiCorp开发新的协议版本,可能需要在配置中将/v1/更改为其他内容。

MySQL Server使用AppRole身份验证来验证HashiCorp Vault。成功的身份验证需要提供两个秘密给Vault,一个角色ID和一个秘密ID,这类似于用户名和密码。角色ID和秘密ID的值来自HashiCorp Vault设置过程中获得的值。要指定这两个ID,分配它们的值到密钥环HashiCorp_role_id密钥环HashiCorp_secret_id系统变量中。设置过程还将生成一个存储路径/v1/kv/mysql,该值将被分配给密钥环HashiCorp_commit_store_path

在插件初始化时,密钥环HashiCorp尝试使用配置值连接到HashiCorp Vault服务器。如果连接成功,插件将值存储在对应的系统变量中,名称中带有_commit_。例如,在成功连接后,插件将密钥环HashiCorp_role_id密钥环HashiCorp_store_path的值存储在密钥环HashiCorp_commit_role_id密钥环HashiCorp_commit_store_path中。

可以使用密钥环HashiCorp_update_config()函数在运行时重新配置:

  1. 使用SET语句将所需的新值分配给配置系统变量,如前表所示。这些赋值本身对正在进行的插件操作没有影响。

  2. 调用密钥环HashiCorp_update_config()以使插件重新配置并重新连接到HashiCorp Vault服务器,使用新的变量值。

  3. 如果连接成功,插件将更新的配置值存储在对应的系统变量中,名称中带有_commit_

例如,如果您已经重新配置了HashiCorp Vault以监听端口8201而不是默认的8200,可以重新配置密钥环HashiCorp如下:

mysql> SET GLOBAL keyring_hashicorp_server_url = 'https://127.0.0.1:8201';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT keyring_hashicorp_update_config();
+--------------------------------------+
| keyring_hashicorp_update_config()    |
+--------------------------------------+
| Configuration update was successful. |
+--------------------------------------+
1 row in set (0.03 sec)

如果插件在初始化或重新配置时无法连接到HashiCorp Vault,并且没有现有的连接,则_commit_系统变量将被设置为'未提交',字符串值变量,布尔值变量为OFF。如果插件无法连接,但存在现有的连接,那么该连接将保持活动状态,_commit_变量将反映用于该连接的值。

Note

如果您没有在服务器启动时设置强制性系统变量,或者插件初始化出现其他错误,初始化将失败。在这种情况下,可以使用运行时重新配置过程来初始化插件,而不需要重新启动服务器。

有关 keyring_hashicorp 插件特定系统变量和函数的更多信息,请参阅 第 8.4.4.19 节,“密钥环系统变量”第 8.4.4.16 节,“插件特定密钥环密钥管理函数”