我配置了 Hashicorp Vault 服务器,一切运行良好,除了我的“拒绝”策略。
我对大多数秘密进行了 2 级分组,因此它们遵循以下结构:
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 $(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 令牌功能”命令一起正常工作。
当我使用令牌登录时,它会显示正确的策略(以及默认策略,但默认策略没有对 secret/ 的权限)。
secret/ 被设置为 kv 存储,所以我通过 CLI 使用“vault kv list|get ...”访问它们
我必须采取另一个步骤来“强制”登录用户的策略规则吗?
事实证明,因为我使用 KV v2 后端进行秘密存储,所以策略结构略有不同。
我最终不得不指定秘密/元数据/用于列出权限和秘密/数据/用于创建/更新/读取
例如:
而不是在受限节点上放置“拒绝”,该级别的唯一其他节点(目前)是“不受限制”节点,所以我添加了:
由于保险柜策略默认被拒绝,因此这具有预期的效果。
我在以下位置找到了 KV2 策略设置的详细信息:https ://www.vaultproject.io/docs/secrets/kv/kv-v2.html#acl-rules