Шаги по созданию токена Vault
— у нас есть пароль01 и логин01 — secret. К которому мы создаем Vault
— создаем ячейку хранения (Secrets Engine) типа KV версии 2, по пути zabbix/
— кладем(создаем) в эту ячейку наш secret (пароль01 и логин01)
— создаем Политику, в ней разрешаем чтение на путь zabbix/
— генерируем токен с политикой
— проверяем токен, его свойства
— продлеваем токен
— Получаем секрет (пароль ) используя токен
— Про accessor токена
Приведу разные примеры как делать через WebUI, CLI, API
Cоздаем ячейку хранения (Secrets Engine) типа KV версии 2, по пути zabbix/
Для начала знакомства с Vault можно начать с UI интерфейса
Кладем(создаем) в эту ячейку наш secret (пароль01 и логин01)
через web UI
через CLI vault так, более подробно как выполнять команды через CLI тут
1 |
vault kv put zabbix/web01 login01=password01 |
Делаем Политику, в ней разрешаем чтение на путь zabbix/
1 |
vault policy write zabbix-read ./zr.hcl |
содержимое файла zr.hcl
1 2 3 4 |
# Allow read a token path "zabbix/*" { capabilities = [ "read"] } |
Генерируем токен с политикой
Делаем вечно продлеваемый токен, который можно продлить в течении 768h.
Добавил «meta» для своих целей, чтобы не забыть.
Policies — куда токен имеет доступ.
«IP»:»192.168.0.0/24″ доступ только с этой сети.
Если вместо «period»:»768h» сделать «TTL»:»768h» — токен не будет вечно продлеваемый.
Пример, как делать через API используя Powershell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$Headers = @{ "X-Vault-Token" = "root_token"} # create token продлеваемый period [System.Uri]$UriGet = "https://vault:8200/v1/auth/token/create" $HT = @{ uri = $UriGet ContentType = 'text/json;charset=UTF-8' Headers = $Headers Method = 'post' Body = '{ "policies": ["default","zabbix-read"], "meta": { "host": "serverweb01" , "email": "a@kepman.ru", "email-notification": "true" }, "IP":"192.168.0.0/24", "renewable": true, "display_name": "zabbix", "period":"768h" }' } $(Invoke-WebRequest @HT).content |
Ответ получен такой
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ "request_id": "34f981c2-3c4e-a542-7193-26e83aae3e46", "lease_id": "", "renewable": false, "lease_duration": 0, "data": null, "wrap_info": null, "warnings": null, "auth": { "client_token": "s.2dbKn76yPUT1rYhLbgAgHExG", "accessor": "R9k9gl8rqTc4PNd6u7Oinh1P", "policies": [ "default", "zabbix-read" ], "token_policies": [ "default", "zabbix-read" ], "metadata": { "email": "a@kepman.ru", "email-notification": "true", "host": "serverweb01" }, "lease_duration": 2764800, "renewable": true, "entity_id": "", "token_type": "service", "orphan": false } } |
где s.2dbKn76yPUT1rYhLbgAgHExG это токен для использования.
Обратите внимание, что мы сделали токен, который зависит от своего родителя и будет отозван при отзыве родителя. Чтобы создать без наследования нужно делать вместо /auth/token/create token orphan -> /auth/token/create-orphan хотя если отзывать родительский токен как auth/token/revoke-orphan то он сделает все дочерние токены как orphan
Проверяем токен, его свойства через API
Смотрите мы указали X-Vault-Token не root token, а наш новый токен
1 2 3 4 5 6 7 8 9 10 |
$Headers = @{ "X-Vault-Token" = "s.2dbKn76yPUT1rYhLbgAgHExG"} # получить информацию по токену [System.Uri]$UriGet = "https://vault:8200/v1/auth/token/lookup-self" $HT = @{ uri = $UriGet ContentType = 'text/json;charset=UTF-8' Headers = $Headers Method = 'Get' } $( Invoke-WebRequest @HT).content |
В ответе получим TTL который постоянно уменьшается, после чего токен удалится.
Продлеваем токен
продлеваем токен добавляя + 5 минут в его жизни
1 2 3 4 5 6 7 8 9 10 11 12 |
$Headers = @{ "X-Vault-Token" = "s.2dbKn76yPUT1rYhLbgAgHExG"} # Продлить токен [System.Uri]$UriGet = "https://vault:8200/v1/auth/token/renew-self" $HT = @{ uri = $UriGet ContentType = 'text/json;charset=UTF-8' Headers = $Headers Method = 'POST' Body = '{ "increment": "5m"}' } $( Invoke-WebRequest @HT).content |
Проверяем токен, что он может читать путь zabbix/
1 2 3 4 5 6 7 8 9 10 11 |
$Headers = @{ "X-Vault-Token" = "s.2dbKn76yPUT1rYhLbgAgHExG"} # Получить ключ значение [System.Uri]$UriGet = "https://vault:8200/v1/zabbix/data/web01?version=1" $HT = @{ uri = $UriGet ContentType = 'text/json;charset=UTF-8' Headers = $Headers Method = 'Get' } $(Invoke-WebRequest @HT).content |
Зачем нужен accessor у токена
У токена есть accessor через него можно продлить токен и посмотреть информацию от токене, но нельзя получить секреты. Можно использовать в мониторинге и механизмах отдельного продления.