Пространства имён доступны только в Stronghold EE.
Пространство имён работает как отдельный виртуальный Stronghold со своими механизмами секретов, методами аутентификации, политиками и токенами. Команде выделяется пространство имён, а её администраторы управляют им самостоятельно, не получая доступа к корневому пространству и к пространствам других команд.
Цель
Создать пространство имён для команды team-a, выдать её администраторам делегированные права, подключить отдельные методы аутентификации для людей и приложений и настроить шаблонные политики, которые не нужно менять при добавлении новых приложений.
Предварительные требования
Для выполнения примера нужны:
- Stronghold EE.
- Токен администратора корневого пространства имён.
- Параметры OIDC-клиента в IdP для команды (адрес,
client_id,client_secret), если люди входят через OIDC. - Кластер Kubernetes команды, если приложения аутентифицируются методом Kubernetes.
Шаг 1. Создайте пространство имён
Войдите токеном администратора корневого пространства имён и создайте пространство имён team-a:
d8 stronghold namespace create -custom-metadata=owner="team-a@example.com" team-aКоманды ниже выполняются в этом пространстве имён и явно передают параметр -namespace=team-a.
Шаг 2. Создайте политику делегированного администратора
Пути в политике указываются относительно пространства имён. Политика разрешает управлять механизмами секретов, методами аутентификации, политиками и Identity внутри team-a, но не даёт прав за его пределами:
d8 stronghold policy write -namespace=team-a team-admin - <<'POLICY'
# Управление механизмами секретов и методами аутентификации.
path "sys/mounts/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
path "sys/mounts" {
capabilities = ["read"]
}
path "sys/auth/*" {
capabilities = ["create", "read", "update", "delete", "sudo"]
}
path "sys/auth" {
capabilities = ["read"]
}
# Управление политиками.
path "sys/policies/acl/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# Настройка методов аутентификации и Identity.
path "auth/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
path "identity/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# Работа с секретами команды.
path "secret/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# Вложенные пространства имён.
path "sys/namespaces/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
POLICYУберите из политики блоки, которые команда не должна контролировать, например sys/namespaces/*.
Шаг 3. Подключите метод аутентификации для людей
Настройте вход администраторов команды через OIDC:
Включите OIDC в пространстве имён команды:
d8 stronghold auth enable -namespace=team-a oidcНастройте метод и роль по инструкции «Метод OIDC», передав в каждой команде
-namespace=team-a. В роли укажите claim с группами пользователя (groups_claim).Привяжите политику
team-adminк группе администраторов команды в IdP:OIDC_ACCESSOR=$(d8 stronghold read -namespace=team-a -field=accessor sys/auth/oidc) GROUP_ID=$(d8 stronghold write -namespace=team-a -field=id identity/group name=team-a-admins type=external policies=team-admin) d8 stronghold write -namespace=team-a identity/group-alias name=team-a-admins mount_accessor="$OIDC_ACCESSOR" canonical_id="$GROUP_ID"
С этого момента администраторы команды входят командой d8 stronghold login -namespace=team-a -method=oidc и дальше работают без участия администратора корневого пространства.
Шаг 4. Подключите метод аутентификации для приложений
Настройте метод Kubernetes и KV-хранилище для приложений команды:
Включите метод Kubernetes для кластера команды:
d8 stronghold auth enable -namespace=team-a kubernetes d8 stronghold write -namespace=team-a auth/kubernetes/config kubernetes_host="https://<API_SERVER_ADDRESS>:6443" kubernetes_ca_cert=@ca.crt<API_SERVER_ADDRESS>— адрес API-сервера Kubernetes кластера команды. Файлca.crtсодержит его CA-сертификат.Параметры конфигурации описаны в разделе «Метод Kubernetes».
Включите KV-хранилище команды:
d8 stronghold secrets enable -namespace=team-a -path=secret -version=2 kv
Шаг 5. Настройте шаблонную политику для приложений
Вместо отдельной политики на каждое приложение используйте одну шаблонную политику: приложение получает доступ к секретам в директории, совпадающей с его неймспейсом Kubernetes.
K8S_ACCESSOR=$(d8 stronghold read -namespace=team-a -field=accessor sys/auth/kubernetes)
d8 stronghold policy write -namespace=team-a app-by-namespace - <<POLICY
path "secret/data/{{identity.entity.aliases.${K8S_ACCESSOR}.metadata.service_account_namespace}}/*" {
capabilities = ["read"]
}
POLICY
d8 stronghold write -namespace=team-a auth/kubernetes/role/apps bound_service_account_names="*" bound_service_account_namespaces="team-a-*" policies=app-by-namespace ttl=1hВ bound_service_account_namespaces допустимы и шаблоны с * в конце (например, team-a-*).
Приложение из неймспейса Kubernetes team-a-billing прочитает secret/data/team-a-billing/*, но не секреты team-a-orders.
Аналогично можно выдать каждому сотруднику личную директорию:
d8 stronghold policy write -namespace=team-a personal - <<'POLICY'
path "secret/data/users/{{identity.entity.id}}/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "secret/metadata/users/{{identity.entity.id}}/*" {
capabilities = ["read", "list", "delete"]
}
POLICYПроверка
Проверьте результат:
Войдите как администратор команды и проверьте, что управление внутри пространства имён доступно:
d8 stronghold login -namespace=team-a -method=oidc d8 stronghold secrets list -namespace=team-aПроверьте, что доступ к корневому пространству имён закрыт. Команда выполняется без
-namespace, поэтому запрос отправляется в корневое пространство имён. Команда должна вернуть ошибкуpermission denied:d8 stronghold secrets listСравните возможности токена на путях разных команд:
d8 stronghold token capabilities -namespace=team-a secret/data/team-a-billing/db
Очистка
Удаление пространства имён удаляет все его механизмы секретов, методы аутентификации, политики и токены. Токен администратора команды не может удалить пространство имён. Войдите токеном администратора корневого пространства имён и удалите пространство имён:
d8 stronghold login
d8 stronghold namespace delete team-aПеред удалением рабочего пространства имён сделайте снимок хранилища.