我可以在Hashicorp Vault中创建策略以允许令牌所有者仅读取自己的秘密吗?

时间:2020-04-03 18:48:24

标签: linux hashicorp-vault

我正在使用官方Docker(最新)映像中的Vault,并将KVv2作为秘密引擎。

我想防止令牌持有者读取自己不拥有的秘密。

首先,我创建了一个名为“ acl-caging-policy”的模板策略来控制 / secret / data / [username] 下的请求。 在带尾号/ *的情况下进行了尝试。

$ http http://127.0.0.1:8200/v1/sys/policy/acl-caging-policy policy:='"path \"secret/data/{{identity.entity.metadata.user}}\" {capabilities = [\"create\", \"read\", \"update\", \"delete\", \"list\"]}"' X-VAULT-TOKEN:"[ROOT_TOKEN]"

保险柜已为我成功显示它:

$ docker exec -it vault-app vault policy read acl-caging-policy
path "secret/data/{{identity.entity.metadata.user}}" { capabilities = ["create", "read", "update", "delete", "list"]}

然后,我为用户创建了一个令牌:

$ http http://127.0.0.1:8200/v1/auth/token/create policies:='["acl-caging-policy"]'  meta:='{"user": "oystr"}' ttl="999999h" renewable:=false X-VAULT-TOKEN:"[ROOT_TOKEN]"

哪个保管箱创建成功:

$ docker exec -it vault-app vault token lookup [USER_TOKEN]                                                                                                          
Key                 Value
---                 -----
accessor            [USER_ACCESSOR]
creation_time       1585935126
creation_ttl        999999h
display_name        token
entity_id           n/a
expire_time         2134-05-03T08:32:06.496766579Z
explicit_max_ttl    0s
id                  [USER_TOKEN] 
issue_time          2020-04-03T17:32:06.496771065Z
meta                map[user:oystr]
num_uses            0
orphan              false
path                auth/token/create
policies            [acl-caging-policy default]
renewable           false
ttl                 999997h53m46s
type                service

但是每当我尝试存储任何信息时:

$ http http://127.0.0.1:8200/v1/secret/data/oystr data:='{"username": "oystr", "password": "[PASSWORD]"}' X-VAULT-TOKEN:"[USER_TOKEN]"
HTTP/1.1 403 Forbidden
Cache-Control: no-store
Content-Length: 60
Content-Type: application/json
Date: Fri, 03 Apr 2020 18:23:25 GMT

{
    "errors": [
        "1 error occurred:\n\t* permission denied\n\n"
    ]
}

有可能还是我在这里错过什么?

1 个答案:

答案 0 :(得分:0)

问题是您需要一个用于工作的实体。当您仅创建令牌时,没有与之关联的实体。相反,为每个用户创建一个实体,可以为您使用(或将使用)的任何身份验证方法设置一个别名,然后在用户登录时,其令牌将与他们的实体相关联。此时,模板应该可以工作,尽管您可能希望将其更改为使用类似{{identity.entity.name}}而不是metadata的样式。如果要使用metadata,则需要在您创建的实体上设置该元数据。