MySQL/MariaDB

MySQL 是数据库机密引擎所支持的插件之一。该插件可以根据为 MySQL 配置的角色动态生成数据库凭据,也支持静态角色

该插件在 Vault 中内置了几个不同的实例,每个实例用于稍微不同的 MySQL 驱动程序。这些插件之间的唯一区别是插件生成的用户名长度,因为不同版本的 mysql 接受不同的长度。可用的插件有:

  • mysql-database-plugin
  • mysql-aurora-database-plugin
  • mysql-rds-database-plugin
  • mysql-legacy-database-plugin

能力

数据库插件名称 根用户凭据轮换 动态角色 静态角色 自定义用户名
视情况而定(见上方) Yes Yes Yes Yes(1.7+)

配置

  1. 如果数据库机密引擎尚未启用,先启用该机密引擎:
$ vault secrets enable database
Success! Enabled the database secrets engine at: database/

默认情况下,机密引擎会挂载到名字对应的路径上。要在不同路径上启用机密引擎,请使用 -path 参数。

  1. 使用合适的插件以及连接信息来配置 Vault:
$ vault write database/config/my-mysql-database \
    plugin_name=mysql-database-plugin \
    connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \
    allowed_roles="my-role" \
    username="vaultuser" \
    password="vaultpass"
  1. 在 Vault 中配置一个映射到一条创建数据库凭据的 SQL 命令的 Vault 角色:
$ vault write database/roles/my-role \
    db_name=my-mysql-database \
    creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%';" \
    default_ttl="1h" \
    max_ttl="24h"
Success! Data written to: database/roles/my-role

使用方法

配置了机密引擎后,一个拥有搭配了合适权限的 Vault 令牌的用户或是机器可以生成数据库凭据。

  1. 通过读取搭配角色名的 /creds 端点来创建一个新的凭据:
$ vault read database/creds/my-role
Key                Value
---                -----
lease_id           database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration     1h
lease_renewable    true
password           yY-57n3X5UQhxnmFRP3f
username           v_vaultuser_my-role_crBWVqVh2Hc1

客户端 x509 证书身份验证

该插件支持使用 MySQL 的 x509 客户端证书身份验证

要配置插件使用该身份验证机制:

$ vault write database/config/my-mysql-database \
    plugin_name=mysql-database-plugin \
    allowed_roles="my-role" \
    connection_url="user:password@tcp(localhost:3306)/test" \
    tls_certificate_key=@/path/to/client.pem \
    tls_ca=@/path/to/client.ca

请注意,tls_certificate_keytls_ca 对应了 MySQL 配置中的 ssl-cert (结合了 ssl-key) 以及 ssl-ca 配置项,但 Vault 参数应配置为这些文件的内容而非文件名。有鉴于此,这两个选项彼此独立。请阅读 MySQL 连接配置选项 获取更多相关信息。

例子

在授权语句中使用通配符

MySQL 支持在授权语句中使用通配符。如果应用程序需要访问 MySQL 中大量数据库则需要该功能。这可以通过在授权语句中使用通配符来实现。例如,如果希望 Vault 创建的用户能够访问以 fooapp_ 开头的所有数据库,可以使用以下创建语句:

CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT SELECT ON `fooapp\_%`.* TO '{{name}}'@'%';

MySQL 期望将通配符放在反引号内的部分。如果想通过 Vault CLI 将此创建语句添加到 Vault,则不能简单地将上述语句粘贴到 CLI 上,因为 shell 会将反引号之间的文本解释为必须执行的内容。解决此问题的最简单方法是将创建语句编码为 Base64 并将其提供给 Vault。例如:

vault write database/roles/my-role \
    db_name=mysql \
    creation_statements="Q1JFQVRFIFVTRVIgJ3t7bmFtZX19J0AnJScgSURFTlRJRklFRCBCWSAne3twYXNzd29yZH19JzsgR1JBTlQgU0VMRUNUIE9OIGBmb29hcHBcXyVgLiogVE8gJ3t7bmFtZX19J0AnJSc7" \
    default_ttl="1h" \
    max_ttl="24h"

在 MySQL 5.6 中轮换根凭据

默认的 MySQL 根凭据了轮换使用了 MySQL 5.7 开始出现的 ALTER USER 语法。对 MySQL 5.6,轮换根密钥语句必须配置为使用旧的 SET PASSWORD 语法,举例来说:

$ vault write database/config/my-mysql-database \
    plugin_name=mysql-database-plugin \
    connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \
    root_rotation_statements="SET PASSWORD = PASSWORD('{{password}}')" \
    allowed_roles="my-role" \
    username="root" \
    password="mysql"

results matching ""

    No results matching ""