我配置了一个 Hashicorp Vault 服务器,除了我的“拒绝”策略之外,一切运行良好。
我对大多数秘密进行了两级分组,因此它们遵循以下结构:
secret/client/environment/*
并非所有秘密都遵循客户端/环境结构,但对于那些遵循的秘密,我有一个“受限”节点,我不希望此策略的用户能够访问。
根据上述要求,我最终制定了如下政策:
# Allow access to non client / environment secrets
path "secret/"
{
capabilities = ["create", "read", "update", "list"]
}
path "secret/+/"
{
capabilities = ["create", "read", "update", "list"]
}
path "secret/+/+/*"
{
capabilities = ["create", "read", "update", "list"]
}
# No access to restricted secrets
path "secret/+/+/restricted"
{
capabilities = ["deny"]
}
path "secret/+/+/restricted/*"
{
capabilities = ["deny"]
}
如果我使用该策略创建一个令牌并在“vault token capabilities”命令中使用该令牌,它将返回我期望的内容:
$vault token capabilities $(cat token.txt) secret/client/environment/blah
create, list, read, update
$vault token capabilities $(cat token.txt) secret/client/environment/restricted
deny
$vault token capabilities $(cat token.txt) secret/client/environment/restricted/blah
deny
问题在于,当我使用该令牌登录时,我不仅可以列出受限节点的内容,还可以获取其中任何密钥的详细信息(在下面的所有级别)。通过 CLI 和 Web UI 都是如此。
我确实尝试了一个更简单的策略,即允许 secret/* 然后拒绝 secret/+/+/restricted/*,但这甚至无法与“vault token capabilities”命令正确配合使用。
当我使用令牌登录时,它显示正确的策略(以及默认策略,但默认策略没有对 secret/ 的权限)。
secret/ 设置为 kv 存储,因此我使用“vault kv list|get ...”通过 CLI 访问它们
我是否需要采取其他步骤来对登录用户“强制”执行策略规则?
答案1
事实证明,由于我使用 KV v2 后端进行秘密存储,因此策略结构略有不同。
我最终不得不指定秘密/元数据/ 列出权限和机密 /数据/ 用于创建/更新/读取
例如:
# Allow listing of all secret branches
path "secret/metadata/"
{
capabilities = ["list"]
}
path "secret/metadata/+/"
{
capabilities = ["list"]
}
path "secret/metadata/+/+/"
{
capabilities = ["list"]
}
# Allow management of all keys under secret/<client>/<environment> structure
path "secret/data/+/+/+"
{
capabilities = ["create", "read", "update"]
}
并且,不是在受限节点上放置“拒绝”,因为该级别的唯一其他节点(目前)是“不受限制”节点,因此我添加了:
path "secret/metadata/+/+/unrestricted/"
{
capabilities = ["list"]
}
path "secret/data/+/+/unrestricted/*"
{
capabilities = ["create", "read", "update"]
}
由于 Vault 策略默认是拒绝的,因此这产生了预期的效果。
我在以下位置找到了 KV2 策略设置的详细信息:https://www.vaultproject.io/docs/secrets/kv/kv-v2.html#acl-rules