MSSQL
MSSQL 是数据库机密引擎所支持的插件之一。该插件可以根据为 MSSQL 配置的角色动态生成数据库凭据。
能力
数据库插件名称 | 根用户凭据轮换 | 动态角色 | 静态角色 | 自定义用户名 |
---|---|---|---|---|
mssql-database-plugin |
Yes | Yes | Yes | Yes(1.7+) |
配置
- 如果数据库机密引擎尚未启用,先启用该机密引擎:
$ vault secrets enable database
Success! Enabled the database secrets engine at: database/
默认情况下,机密引擎会挂载到名字对应的路径上。要在不同路径上启用机密引擎,请使用 -path
参数。
- 使用合适的插件以及连接信息来配置 Vault:
$ vault write database/config/my-mssql-database \
plugin_name=mssql-database-plugin \
connection_url='sqlserver://{{username}}:{{password}}@localhost:1433' \
allowed_roles="my-role" \
username="vaultuser" \
password="yourStrong(!)Password"
请注意,上面的例子中演示的 SQL Server 连接使用的用户名是 vaultuser
,尽管用户 vaultuser
可能是活动目录域中的 Windows 身份验证用户,例如 DOMAIN\vaultuser
。
上面的例子中,我们配置 Vault 使用名为 "sa" 的用户名以及 "yourStrong(!)Password" 作为密码,连接到运行于 "localhost" 1433 端口的实例上。Vault 并不一定需要以 sa 登录,但配置使用的用户必须拥有创建登录名及管理 SQL Server 进程的特权。作为例子,内建的 securityadmin
以及 processadmin
角色拥有这些权限。用户同时必须对 Vault 管理的数据库拥有创建数据库用户以及授予数据库的权限。作为例子,内建的 db_accessadmin
以及 db_securityadmin
角色拥有这些权限。
- 在 Vault 中配置一个映射到一条创建数据库凭据的 SQL 命令的 Vault 角色:
$ vault write database/roles/my-role \
db_name=my-mssql-database \
creation_statements="CREATE LOGIN [{{name}}] WITH PASSWORD = '{{password}}';\
CREATE USER [{{name}}] FOR LOGIN [{{name}}];\
GRANT SELECT ON SCHEMA::dbo TO [{{name}}];" \
default_ttl="1h" \
max_ttl="24h"
Success! Data written to: database/roles/my-role
要小心,如果没有设置 revocation_statement
,Vault 会执行默认的吊销过程。在大型数据库中,这有可能引发连接超时。这种情况下请指定一个吊销语句。
使用方法
配置了机密引擎后,一个拥有搭配了合适权限的 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 wJKpk9kg-T1Ma7qQfS8y
username v-vaultuser-my-role-r7kCtKGGr3eYQP1OGR6G-1602542258
Azure SQL Database 的例子
这里有一个使用 Azure SQL Database 的完整例子。注意 Azure SQL Database 中的数据库是 contained database,我们不为用户创建登录名。取而代之的是,我们将密码直接关联到用户自身。另请注意,对于要为其生成动态凭据的每个 Azure SQL 数据库,都需要一个单独的连接和角色。我们可以为所有这些数据库使用单个数据库后端挂载,也可以为其中的一个使用单独的挂载。在此示例中,我们为数据库后端使用自定义路径。
首先,我们通过 vault secrets enable -path=azuresql database
命令将数据库后端挂载到 azuresql 路径上。然后我们配置一个名为 testvault
的连接到 test-vault
数据库的连接,在路径的开头我们使用 “azuresql”:
$ vault write azuresql/config/testvault \
plugin_name=mssql-database-plugin \
connection_url='server=hashisqlserver.database.windows.net;port=1433;user id=admin;password=pAssw0rd;database=test-vault;app name=vault;' \
allowed_roles="test"
现在,我们为 "testvault" 连接添加一个名为 "test" 的角色:
$ vault write azuresql/roles/test \
db_name=testvault \
creation_statements="CREATE USER [{{name}}] WITH PASSWORD = '{{password}}';" \
revocation_statements="DROP USER IF EXISTS [{{name}}]" \
default_ttl="1h" \
max_ttl="24h"
我们现在可以使用该角色为 Azure SQL 数据库 test-vault 动态生成凭据:
$ vault read azuresql/creds/test
Key Value
--- -----
lease_id azuresql/creds/test/2e5b1e0b-a081-c7e1-5622-39f58e79a719
lease_duration 1h0m0s
lease_renewable true
password cZ-BJy-SqO5tKwazAuUP
username v-token-test-tr2t4x9pxvq1z8878s9s-1513446795
当我们不再需要该后端时,我们可以使用命令 vault unmount azuresql
摘除它。现在,我们可以通过 MSSQL 数据库插件管理我们的 Azure SQL Database 了。
Amazon RDS
MSSQL 插件支持管理运行在 Amazon RDS 上的数据库,但需要适应一些差异。最主要的限制是 Amazon RDS 不支持 "sysadmin" 角色,这是 Vault 用来吊销 MSSQL 进程的默认角色。解决方法是为角色添加以下自定义吊销语句:
vault write database/roles/my-role revocation_statements="\
USE my_database; \
IF EXISTS \
(SELECT name \
FROM sys.database_principals \
WHERE name = N'{{name}}') \
BEGIN \
DROP USER [{{name}}] \
END \
IF EXISTS \
(SELECT name \
FROM master.sys.server_principals \
WHERE name = N'{{name}}') \
BEGIN \
DROP LOGIN [{{name}}] \
END"