MSSQL

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

能力

数据库插件名称 根用户凭据轮换 动态角色 静态角色 自定义用户名
mssql-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-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 角色拥有这些权限。

  1. 在 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 令牌的用户或是机器可以生成数据库凭据。

  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           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"

results matching ""

    No results matching ""