MySQL8 中文参考(二十九)(3)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL8 中文参考(二十九)

MySQL8 中文参考(二十九)(2)https://developer.aliyun.com/article/1566123


保护 keyring_okv 文件的密码

您可以选择使用密码保护文件,并提供包含密码的文件以启用文件的解密。要这样做,请切换到ssl目录并执行以下步骤:

  1. 加密key.pem文件。例如,使用以下命令,并在提示时输入加密密码:
$> openssl rsa -des3 -in key.pem -out key.pem.new
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
  1. 将加密密码保存在名为password.txt的单行文本文件中,保存在ssl目录中。
  2. 验证加密文件是否可以使用以下命令解密。解密后的文件应显示在控制台上:
$> openssl rsa -in key.pem.new -passin file:password.txt
  1. 删除原始的key.pem文件,并将key.pem.new重命名为key.pem
  2. 更改新的key.pem文件和password.txt文件的所有权和访问模式,以确保它们具有与ssl目录中其他文件相同的限制。


8.4.4.9 使用 keyring_aws 亚马逊网络服务环插件

注意

keyring_aws插件是 MySQL 企业版中包含的扩展,这是一个商业产品。要了解更多关于商业产品的信息

keyring_aws环插件与亚马逊网络服务管理服务(AWS KMS)通信,作为生成的后端,并使用本地文件进行存储。所有材料均由 AWS 服务器独家生成,而不是由keyring_aws生成。

MySQL 企业版可以在 Red Hat Enterprise Linux、SUSE Linux Enterprise Server、Debian、Ubuntu、macOS 和 Windows 上与keyring_aws一起使用。MySQL 企业版不支持在以下平台上使用keyring_aws

  • EL6
  • 通用 Linux(glibc2.12)
  • SLES 12(MySQL Server 5.7 之后的版本)
  • Solaris

这里的讨论假定您对 AWS 有一般了解,特别是对 KMS 有了解。一些相关信息来源:

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

  • keyring_aws 配置
  • keyring_aws 操作
  • keyring_aws 凭据更改
keyring_aws 配置

要安装keyring_aws,请使用第 8.4.4.3 节中找到的一般说明,“环插件安装”,以及此处找到的插件特定配置信息。

插件库文件包含keyring_aws插件和两个可加载函数,keyring_aws_rotate_cmk()keyring_aws_rotate_keys()

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

  1. 创建一个 AWS KMS 账户。
  2. 使用 AWS KMS 创建一个秘密访问 ID 和秘密访问。访问用于验证您的身份及您的应用程序的身份。
  3. 使用 AWS KMS 账户创建一个 KMS  ID。在 MySQL 启动时,将keyring_aws_cmk_id系统变量设置为 CMK ID 值。此变量是强制性的,没有默认值。(如果需要,可以使用SET GLOBAL在运行时更改其值。)
  4. 如有必要,创建应放置配置文件的目录。该目录应具有限制模式,并且只能由用于运行 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
  1. 在 MySQL 启动时,将keyring_aws_conf_file系统变量设置为/usr/local/mysql/mysql-keyring/keyring_aws_conf,以指示服务器配置文件的位置。
  2. 准备keyring_aws配置文件,其中应包含两行:
  • 第 1 行:秘密访问 ID
  • 第 2 行:秘密访问
  1. 例如,如果 ID 为wwwwwwwwwwwwwEXAMPLE,为xxxxxxxxxxxxx/yyyyyyy/zzzzzzzzEXAMPLEKEY,则配置文件如下所示:
wwwwwwwwwwwwwEXAMPLE
xxxxxxxxxxxxx/yyyyyyy/zzzzzzzzEXAMPLEKEY

在服务器启动过程中可用,必须使用--early-plugin-load选项加载keyring_awskeyring_aws_cmk_id系统变量是必需的,并配置从 AWS KMS 服务器获取的 KMS  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插件,配置文件必须存在并包含有效的秘密访问信息,如前所述初始化。存储文件不需要存在。如果不存在,keyring_aws会尝试创建它(以及必要时的父目录)。

有关用于配置keyring_aws插件的系统变量的更多信息,请参见第 8.4.4.19 节,“Keyring 系统变量”。

启动 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.16 节,“插件特定的 Keyring 管理函数”。

keyring_aws 操作

在插件启动时,keyring_aws 插件从其配置文件中读取 AWS 秘密访问 ID 和。它还将存储文件中包含的任何加密读入其内存缓存中。

在运行过程中,keyring_aws 在内存缓存中维护加密,并使用存储文件作为本地持久存储。每个 keyring_aws 操作都是事务性的:keyring_aws 要么成功地更改内存中的缓存和环存储文件,要么操作失败,环状态保持不变。

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

keyring_aws 插件支持组成标准 MySQL 环服务接口的函数。通过这些函数执行的环操作可在两个级别访问:

  • SQL 接口:在 SQL 语句中,调用 第 8.4.4.15 节,“通用环管理函数” 中描述的函数。
  • C 接口:在 C 语言代码中,调用 第 7.6.9.2 节,“环服务” 中描述的环服务函数。

示例(使用 SQL 接口):

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

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

有关 keyring_aws 允许的值特性的信息,请参阅 第 8.4.4.13 节,“支持的环类型和长度”。

keyring_aws 凭据更改

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

  1. 使用 AWS KMS 创建新的秘密访问 ID 和秘密访问。
  2. 将新凭据存储在配置文件中(由 keyring_aws_conf_file 系统变量命名的文件)。文件格式如前所述。
  3. 重新初始化 keyring_aws 插件,以便重新读取配置文件。假设新凭据有效,插件应该成功初始化。有两种重新初始化插件的方法:
  • 重新启动服务器。这更简单,没有副作用,但不适用于需要最小化服务器停机时间并尽可能少重启的安装。
  • 通过执行以下语句重新初始化插件,根据需要调整.so后缀以适应您的平台,而无需重新启动服务器:
UNINSTALL PLUGIN keyring_aws;
INSTALL PLUGIN keyring_aws SONAME 'keyring_aws.so';
  • 注意
    除了在运行时加载插件外,INSTALL PLUGIN 还具有在 mysql.plugin 系统表中注册插件的副作用。因此,如果您决定停止使用keyring_aws,仅仅从用于启动服务器的选项集中删除--early-plugin-load选项是不够的。这样可以阻止插件早期加载,但服务器仍会在启动序列中加载在mysql.plugin中注册的插件。
    因此,如果您执行上述描述的UNINSTALL PLUGININSTALL PLUGIN序列来更改 AWS KMS 凭据,那么要停止使用keyring_aws,需要再次执行UNINSTALL PLUGIN来取消注册插件,同时删除--early-plugin-load选项。

原文:dev.mysql.com/doc/refman/8.0/en/keyring-hashicorp-plugin.html

8.4.4.10 使用 HashiCorp Vault 环插件

注意

keyring_hashicorp 插件是包含在 MySQL Enterprise Edition 中的扩展,这是一款商业产品。要了解更多关于商业产品的信息,请参阅 www.mysql.com/products/

keyring_hashicorp 环插件与 HashiCorp Vault 进行后端存储通信。该插件支持  HashiCorp Vault AppRole 认证。没有信息永久存储在 MySQL  服务器本地存储中(可使用可选的内存中缓存作为中间存储)。随机生成在 MySQL 服务器端执行,然后将存储到 Hashicorp  Vault。

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

  • SQL 接口:在 SQL 语句中,调用 第 8.4.4.15 节,“通用环管理函数” 中描述的函数。
  • C 接口:在 C 语言代码中,调用 第 7.6.9.2 节,“环服务” 中描述的环服务函数。

示例(使用 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 本身。以下部分提供了必要的说明。

  • 证书和准备
  • HashiCorp Vault 设置
  • keyring_hashicorp 配置
证书和准备

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

  • company.crt: 组织拥有的自定义 CA 证书。此文件同时被 HashiCorp Vault 服务器和 keyring_hashicorp 插件使用。
  • vault.key:HashiCorp Vault 服务器实例的私钥。此文件由 HashiCorp Vault 服务器使用。
  • vault.crt:HashiCorp Vault 服务器实例的证书。此文件必须由组织 CA 证书签名。

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

重要提示

根据这些说明生成的证书是自签名的,可能不太安全。在使用这些文件获得经验后,考虑从注册的证书颁发机构获取证书/材料。

  1. 准备公司和 HashiCorp Vault 服务器。
    使用以下命令生成文件:
openssl genrsa -aes256 -out company.key 4096
openssl genrsa -aes256 -out vault.key 2048
  1. 这些命令生成包含公司私钥(company.key)和 Vault 服务器私钥(vault.key)的文件。这些分别是随机生成的 4,096 位和 2,048 位的 RSA 。
    每个命令都会提示输入密码。为了测试目的,密码不是必需的。要禁用密码,请省略-aes256参数。
    文件包含敏感信息,应存储在安全位置。密码(也是敏感信息)稍后会被要求,因此请记下并将其存储在安全位置。
    (可选)使用以下命令检查文件内容和有效性:
openssl rsa -in company.key -check
openssl rsa -in vault.key -check
  1. 创建公司 CA 证书。
    使用以下命令创建一个有效期为 365 天的名为company.crt的公司 CA 证书文件(在一行上输入命令):
openssl req -x509 -new -nodes -key company.key
  -sha256 -days 365 -out company.crt
  1. 如果在生成时使用了-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 []:
  1. 用适当的值回答提示。
  2. 创建证书签名请求。
    要为新创建的服务器准备一个 HashiCorp Vault 服务器证书,必须创建一个名为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
  1. 使用以下命令创建签名请求:
openssl req -new -key vault.key -config request.conf -out request.csr
  1. 输出文件(request.csr)是一个中间文件,用作创建服务器证书的输入。
  2. 创建 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
  1. 要使 vault.crt 服务器证书有效,将 company.crt 公司证书的内容附加到其中。这是必需的,以便公司证书在请求中与服务器证书一起传递。
cat company.crt >> vault.crt
  1. 如果显示 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 插件。

重要

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

这些说明假定在 证书和准备 中创建了证书和文件。如果您没有这些文件,请参阅该部分。

  1. 获取 HashiCorp Vault 二进制文件。
    www.vaultproject.io/downloads.html 下载适合您平台的 HashiCorp Vault 二进制文件。
    解压缩存档内容以生成可执行的 vault 命令,该命令用于执行 HashiCorp Vault 操作。如有必要,将安装该命令的目录添加到系统路径中。
    (可选)HashiCorp Vault 支持自动补全选项,使其更易于使用。有关更多信息,请参阅 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
  1. 启动 HashiCorp Vault 服务器。
    要启动 Vault 服务器,请使用以下命令,其中 -config 选项指定刚创建的配置文件的路径:
vault server -config=config.hcl
  1. 在此步骤中,您可能会被要求为存储在 vault.key 文件中的 Vault 服务器私钥输入密码。
    服务器应该启动,并在控制台上显示一些信息(IP、端口等)。
    为了能够输入剩余的命令,请将 vault server 命令放在后台运行或在继续之前打开另一个终端。
  2. 初始化 HashiCorp Vault 服务器。
    注意
    在启动 Vault 第一次时,执行本步骤中描述的操作以获取解封和根令牌。后续 Vault 实例重新启动仅需要使用解封进行解封。
    发出以下命令(假设 Bourne shell 语法):
export VAULT_SKIP_VERIFY=1
vault operator init -n 1 -t 1
  1. 第一个命令使vault命令暂时忽略尚未添加到系统信任存储库的公司证书的事实。它弥补了我们的自签名 CA 未添加到该存储库的事实。(对于生产使用,应添加这样的证书。)
    第二个命令创建一个具有单个解封的要求,要求一个解封存在以解封。 (对于生产使用,一个实例将具有多个解封,最多需要输入相同数量的来解封。解封应交付给公司内的保管员。使用单个可能被视为安全问题,因为这允许单个保管员解封保险库。)
    Vault 应该回复有关解封和 root 令牌的信息,以及一些附加文本(实际的解封和 root 令牌值与此处显示的值不同):
...
Unseal Key 1: I2xwcFQc892O0Nt2pBiRNlnkHzTUrWS+JybL39BjcOE=
Initial Root Token: s.vTvXeo3tPEYehfcd9WH7oUKz
...
  1. 将解封和 root 令牌存储在安全位置。
  2. 解封 HashiCorp Vault 服务器。
    使用此命令解封 Vault 服务器:
vault operator unseal
  1. 在提示输入解封时,使用在 Vault 初始化期间先前获得的。
    Vault 应该生成指示设置完成并解封保险库的输出。
  2. 登录到 HashiCorp Vault 服务器并验证其状态。
    准备登录为 root 所需的环境变量:
vault login s.vTvXeo3tPEYehfcd9WH7oUKz
  1. 在该命令中的令牌值中,用之前在 Vault 初始化期间获得的 root 令牌的内容替换。
    验证 Vault 服务器状态:
vault status
  1. 输出应包含以下行(以及其他内容):
...
Initialized     true
Sealed          false
...
  1. 设置 HashiCorp Vault 身份验证和存储。
    注意
    在运行 Vault 实例时,描述的操作仅在第一次运行时需要。之后不需要重复。
    启用 AppRole 身份验证方法并验证其是否在身份验证方法列表中:
vault auth enable approle
vault auth list
  1. 启用 Vault KeyValue 存储引擎:
vault secrets enable -version=1 kv
  1. 为与keyring_hashicorp插件一起使用设置一个角色(在一行上输入命令):
vault write auth/approle/role/mysql token_num_uses=0
  token_ttl=20m token_max_ttl=30m secret_id_num_uses=0
  1. 添加一个 AppRole 安全策略。
    注意
    在运行 Vault 实例时,描述的操作仅在第一次运行时需要。之后不需要重复。
    准备一个策略,以允许先前创建的角色访问适当的机密。创建一个名为mysql.hcl的新文件,内容如下:
path "kv/mysql/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}
  1. 注意
    在这个示例中,kv/mysql/可能需要根据您的本地安装政策和安全要求进行调整。如果需要,无论这些说明中的kv/mysql/出现在哪里,都要进行相同的调整。
    将策略文件导入 Vault 服务器以创建名为mysql-policy的策略,然后将策略分配给新角色:
vault policy write mysql-policy mysql.hcl
vault write auth/approle/role/mysql policies=mysql-policy
  1. 获取新创建角色的 ID 并将其存储在安全位置:
vault read auth/approle/role/mysql/role-id
  1. 为角色生成一个秘密 ID,并将其存储在安全位置:
vault write -f auth/approle/role/mysql/secret-id
  1. 生成这些 AppRole 角色 ID 和 ID 凭证后,它们预计会无限期保持有效。不需要再次生成它们,keyring_hashicorp插件可以配置它们以供持续使用。有关 AuthRole 身份验证的更多信息,请访问www.vaultproject.io/docs/auth/approle.html


MySQL8 中文参考(二十九)(4)https://developer.aliyun.com/article/1566125

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十三)(3)
MySQL8 中文参考(二十三)
47 4
|
4月前
|
存储 缓存 关系型数据库
MySQL8 中文参考(二十一)(5)
MySQL8 中文参考(二十一)
73 3
|
4月前
|
存储 监控 Java
MySQL8 中文参考(二十一)(4)
MySQL8 中文参考(二十一)
108 3
|
4月前
|
存储 安全 关系型数据库
MySQL8 中文参考(二十一)(1)
MySQL8 中文参考(二十一)
46 3
|
4月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十一)(3)
MySQL8 中文参考(二十一)
65 2
|
4月前
|
关系型数据库 MySQL Unix
MySQL8 中文参考(二十一)(2)
MySQL8 中文参考(二十一)
52 2
|
4月前
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL8 中文参考(二十五)(5)
MySQL8 中文参考(二十五)
38 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十四)(1)
MySQL8 中文参考(二十四)
43 2
|
4月前
|
NoSQL 关系型数据库 MySQL
MySQL8 中文参考(二十三)(2)
MySQL8 中文参考(二十三)
51 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十三)(1)
MySQL8 中文参考(二十三)
31 2