Могу ли я создать политику в Hashicorp Vault, чтобы владельцы токенов могли читать только свои секреты? - PullRequest
0 голосов
/ 03 апреля 2020

Я использую Vault с его официального Docker (последнего) образа и 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 голосов
/ 06 апреля 2020

Проблема в том, что вам нужен Entity для работы с шаблонами. Когда вы просто создаете токен, с ним не связывается ни одна сущность. Вместо этого создайте сущность для каждого из ваших пользователей, для которой можно настроить псевдоним для любого метода аутентификации, который вы используете (или будете использовать), а затем, когда пользователь входит в систему, его токен будет связан с его сущностью. На этом этапе шаблонирование должно работать, хотя вы, вероятно, захотите изменить его, чтобы использовать что-то вроде {{identity.entity.name}} вместо metadata. Если вы хотите использовать metadata, вам нужно настроить эти метаданные для создаваемых вами сущностей.

...