Databases
数据库机密引擎根据配置的角色动态生成数据库凭据。它通过插件接口与许多不同的数据库协同工作。有许多内置的数据库类型,以及一个用于运行自定义数据库类型以实现可扩展性的公开框架。这意味着需要访问数据库的服务不再需要使用硬编码的凭据:它们可以从 Vault 请求凭据,并使用 Vault 的租约机制来更轻松地轮换密钥。这些被称为“动态角色”或“动态机密”。
由于每个服务都使用与众不同的凭据访问数据库,因此当发现有问题的数据访问时,审计会变得更加容易。我们可以通过 SQL 用户名跟踪到服务的特定实例。
Vault 使用内建的吊销系统来确保用户的凭据在租约到期后的合理时间内失效。
静态角色
数据库机密引擎支持“静态角色”的概念,即 Vault 角色与数据库中的用户名的一对一映射。数据库用户的当前密码由 Vault 在可配置的时间段内存储和自动轮换。这与动态机密不同,动态机密的每次请求凭据都会生成唯一的用户名和密码对。当为角色请求凭据时,Vault 会返回已配置数据库用户的当前密码,允许任何拥有适当 Vault 策略的人访问数据库中的用户帐户。
目前并不是所有数据库类型都支持静态角色,请阅读数据库功能文档了解该数据库后端是否支持静态角色。
配置
大部分机密引擎在工作之前必须要先进行配置。这些步骤通常是由系统管理员或是配置管理工具来完成。
- 启用数据库机密引擎:
vault secrets enable database
Success! Enabled the database secrets engine at: database/
默认情况下,机密引擎会挂载到名字对应的路径上。要在不同路径上启用机密引擎,请使用 -path
参数。
- 使用合适的插件以及连接信息来配置 Vault:
$ vault write database/config/my-database \
plugin_name="..." \
connection_url="..." \
allowed_roles="..." \
username="..." \
password="..."
我们强烈建议在数据库中为 Vault 创建一个专属用户。该用户会被用来操控数据库中的动态和静态用户。在文档中该用户被称为“根”用户。
Vault 将我们在这里指定的用户来创建/更新/吊销数据库凭据。该用户必须具有适当的权限才能对其他数据库用户执行操作(创建、更新凭据、删除等)。
该秘密引擎可以配置多个数据库连接。有关特定配置选项的详细信息,请参阅相关数据库类型的文档。
- 配置了根用户后,我们强烈建议轮换用户密码,使得 Vault 以外的用户无法使用该账号:
vault write -force database/rotate-root/my-database
当上述命令完成后,之前为用户配置的密码将无法再使用。所以我们强烈推荐在数据库中为 Vault 创建一个专户用户来管理其他数据库用户。
- 配置一个角色,将 Vault 中的名称映射到一组创建语句以创建数据库凭据:
$ vault write database/roles/my-role \
db_name=my-database \
creation_statements="..." \
default_ttl="1h" \
max_ttl="24h"
Success! Data written to: database/roles/my-role
语句中使用模板语法 {{username}}
以及 {{password}}
,这些自动断会被插件使用动态生成的值替换。某些插件还支持 {{expiration}}
字段。
使用方法
配置了机密引擎后,一个拥有搭配了合适权限的 Vault 令牌的用户或是机器可以生成数据库凭据。
- 通过读取搭配角色名的
/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 FSREZ1S0kFsZtLat-y94
username v-vaultuser-e2978cd0-ugp7iqI2hdlff5hfjylJ-1602537260
数据库功能
在 Vault 1.6 开始,所有数据库引擎都支持动态角色和静态角色。除 MongoDB Atlas 以外所有引擎都支持轮换根用户的凭据。
数据库 | 根用户凭据轮换 | 动态角色 | 静态角色 | 自定义用户名 |
---|---|---|---|---|
ElasticSearch | Yes | Yes | Yes(1.6+) | Yes(1.8+) |
MongoDB | Yes | Yes | Yes | Yes(1.7+) |
MSSQL | Yes | Yes | Yes | Yes(1.7+) |
MySQL/MariaDB | Yes | Yes | Yes | Yes(1.7+) |
PostgreSQ | Yes | Yes | Yes | Yes(1.7+) |
自定义插件
数据库机密引擎支持通过实现一个公开的插件框架来支持自定义数据库类型。相关章节本书不作翻译。
密码生成
密码根据密码策略生成。数据库可以选择设置密码策略以供该数据库的所有角色使用。换句话说,每一次我们调用 vault write database/config/my-database
时我们可以使用 my-database
为所有角色指定密码策略。每一个数据库都有一个如下的默认密码策略:20 位字符,至少一个大写字母,至少一个小写字母,至少一个数字,是少一个破折号。
我们无法为特定角色指定密码策略,因为密码策略的目的是遵守系统(例如数据库)的密码要求,而不是为特定用户设置密码。
默认密码生成策略可以表示为以下密码策略:
length = 20
rule "charset" {
charset = "abcdefghijklmnopqrstuvwxyz"
min-chars = 1
}
rule "charset" {
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
min-chars = 1
}
rule "charset" {
charset = "0123456789"
min-chars = 1
}
rule "charset" {
charset = "-"
min-chars = 1
}