AliCloud
阿里云 Secrets 引擎基于 RAM 策略动态生成阿里云访问令牌,或者基于 RAM 角色动态生成阿里云 STS 凭证。这通常简化了阿里云的使用,因为它不需要在 Web 界面中点击。阿里云 access token 是基于时间的,并且会在 Vault 租约到期时自动吊销。 STS 凭证是短暂的、不可更新的,并且会自行过期。
配置
大部分机密引擎在工作之前必须要先进行配置。这些步骤通常是由系统管理员来完成。
- 启用阿里云机密引擎:
$ vault secrets enable alicloud
Success! Enabled the alicloud secrets engine at: alicloud/
默认情况下,机密引擎会挂载到名字对应的路径上。要在不同路径上启用机密引擎,请使用 -path
参数。
- 在阿里云中创建一个自定义策略,生成的 access key 将拥有该策略。
- 在阿里云中创建一个用户,名字是"hashicorp-valut",在用户的 "User Authorization Policies" 节里直接授予刚才新建的策略。
- 在阿里云中为刚才的用户创建一个 access key,这可以在阿里云 Web UI 的用户页面中完成。
- 在 Vault 中配置用以调用阿里云来生成凭据的 access key:
$ vault write alicloud/config \
access_key=0wNEpMMlzy7szvai \
secret_key=PupkTg8jdmau1cXxYacgE736PJj4cA
或者,阿里云机密引擎可以使用设置在环境变量里的凭据,或通过实例元数据获取可用的凭据。由于它会在每次 API 调用时读取当前凭据,因此凭据更改后立即生效,无需重新启动 Vault。
如果可用,建议使用实例元数据作为凭据,因为它们是最安全的选项。这样的话,只需要确保运行 Vault 的实例具有足够的权限而不要添加任何额外的配置。
- 配置新建的凭据所拥有的角色。
使用阿里云已有的策略生成 access token:
$ vault write alicloud/role/policy-based \
remote_policies='name:AliyunOSSReadOnlyAccess,type:System' \
remote_policies='name:AliyunRDSReadOnlyAccess,type:System'
生成 access token 时动态创建策略:
$ vault write alicloud/role/policy-based \
inline_policies=-<<EOF
[
{
"Statement": [
{
"Action": "rds:Describe*",
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "1"
},
{...}
]
EOF
inline_policies
和 remote_policies
两者可以混合使用。他们都不可以用来生成 STS 凭据,例如:
$ vault write alibaba/role/role-based \
role_arn='acs:ram::5138828231865461:role/hastrustedactors'
任何指定的 role_arn
在创建时都必须添加“trusted actors”。这只能在角色创建时添加。可信参与者是可以代入(assume)角色的实体。由于我们将代入角色来获取凭据,因此配置中的 access_key
和 secret_key
必须有资格作为受信任的参与者。
为 Vault 设置 RAM 策略的例子
虽然阿里云凭证可以由环境变量、alicloud/config
中的显式的设置或读取实例元数据提供,但该凭证需要有足够的权限来签发机密。不同的角色配置方式需要不同的权限。
这是一个示例 RAM 策略,它允许您使用任何类型的角色创建凭据:
{
"Statement": [
{
"Action": [
"ram:CreateAccessKey",
"ram:DeleteAccessKey",
"ram:CreatePolicy",
"ram:DeletePolicy",
"ram:AttachPolicyToUser",
"ram:DetachPolicyFromUser",
"ram:CreateUser",
"ram:DeleteUser",
"sts:AssumeRole"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "1"
}
然而,实际使用的策略应只包含根据配置的角色所必须的权限。
如果有任意角色使用了 inline_policies
,我们需要以下权限:
"ram:CreateAccessKey"
"ram:DeleteAccessKey"
"ram:AttachPolicyToUser"
"ram:DetachPolicyFromUser"
"ram:CreateUser"
"ram:DeleteUser"
如果有角色使用了 remote_policies
,那么需要以下权限:
- 所有
inline_policies
需要的权限 "ram:CreatePolicy"
"ram:DeletePolicy"
如果有任何权限使用了 role_arn
,我们需要以下权限:
可用标志
配置完机密引擎后拥有合适权限的 Vault 令牌的用户或者机器就可以用它来生成凭据了。
- 通过读取
/creds
端点加上角色名的路径来生成一个新的 access key:
$ vault read alicloud/creds/policy-based
Key Value
--- -----
lease_id alicloud/creds/policy-based/f3e92392-7d9c-09c8-c921-575d62fe80d8
lease_duration 768h
lease_renewable true
access_key 0wNEpMMlzy7szvai
secret_key PupkTg8jdmau1cXxYacgE736PJj4cA
返回的 access_key
和 secret_key
就是阿里云文档中提到的 "AccessKeyId"
和 "AccessKeySecret"
。
使用 role_arn
获取的凭据会带有额外的字段:expiration
和 security_token
,就像这样:
$ vault read alicloud/creds/role-based
Key Value
--- -----
lease_id alicloud/creds/role-based/f3e92392-7d9c-09c8-c921-575d62fe80d9
lease_duration 59m59s
lease_renewable false
access_key STS.L4aBSCSJVMuKg5U1vFDw
secret_key wyLTSmsyPGP1ohvvw8xYgB29dlGI8KMiH2pKCNZ9
security_token CAESrAIIARKAAShQquMnLIlbvEcIxO6wCoqJufs8sWwieUxu45hS9AvKNEte8KRUWiJWJ6Y+YHAPgNwi7yfRecMFydL2uPOgBI7LDio0RkbYLmJfIxHM2nGBPdml7kYEOXmJp2aDhbvvwVYIyt/8iES/R6N208wQh0Pk2bu+/9dvalp6wOHF4gkFGhhTVFMuTDRhQlNDU0pWTXVLZzVVMXZGRHciBTQzMjc0KgVhbGljZTCpnJjwySk6BlJzYU1ENUJuCgExGmkKBUFsbG93Eh8KDEFjdGlvbkVxdWFscxIGQWN0aW9uGgcKBW9zczoqEj8KDlJlc291cmNlRXF1YWxzEghSZXNvdXJjZRojCiFhY3M6b3NzOio6NDMyNzQ6c2FtcGxlYm94L2FsaWNlLyo=
expiration 2018-08-15T21:58:00Z