Hashicorp Vault

OIDC аутентификация

В качестве OIDC провайдера можно использовать Keycloak. Там создаем Realm роли и назначаем из пользователю. Также необходимо сделать так, чтобы назначенные роли попали в id_token, который выдается со стороны Keycloak после аутентификации (информация есть здесь https://stackoverflow.com/questions/68741412/grafana-generic-oauth-role-assignment).

Создаем oidc метод доступа (обязательно указываем роль по умолчанию)

# to do

Создаем роль для oidc

vault write auth/oidc/role/default -<<EOF
{
  "allowed_redirect_uris": ["https://vault.example.com/ui/vault/auth/oidc/oidc/callback"],
  "user_claim":"email",
  "groups_claim":"roles",
  "bound_audiences": "vault",
  "oidc_scopes": "openid roles",
  "ttl": "8h"
}
EOF

Команда выше подразумевает, что id_token из Keycloak содержит поле roles с массивом Realm ролей.

Уже можно пробовать зайти через OIDC и получить доступ в объеме default политики.

Допустим уже существует политика admin, которая предоставляет административный доступ к Vault. Чтобы к ней привязаться ролью vault-admin из Keycloak нам потребуется создать т.н. identity/group и identity/group-alias.

Кроме того, нам потребуется получить т.н. mount_accessor для oidc

vault auth list -detailed

Path      Plugin    Accessor
-------     ------       --------
oidc/     oidc        auth_oidc_123    <------------ mount_accessor
...

Создаем identity/group (идентификатор группы пригодится в следующей команде)

vault write identity/group \
    name="vault-admin-group" \
    type="external" \
    policies="admin"

Key     Value
---     -----
id      123123
name    vault-admin-group

Создаем identity/group-alias

vault write identity/group-alias \
    name="vault-admin" \
    mount_accessor="auth_oidc_123" \
    canonical_id="123123"

Здесь значения для mount_accessor и cacnonical_id определяются в командах выше.

В данной конфигурации, пользователю с Realm ролью vault-admin будет назначена политика admin в Vault.

Для добавления новых ролей необходимо выполнить:

  • на стороне Keycloak создаем роль и назначаем ее пользователю
  • на стороне Vault создаем политику для этой роли, а также соответствующие identity/group и identity/group-alias