Единый вход (SSO) позволяет пользователям входить в Stronghold под корпоративной учётной записью, а администраторам — управлять доступом через группы в провайдере идентификации (IdP). Stronghold поддерживает любой IdP, совместимый с OpenID Connect.
Цель
После настройки:
- Пользователи входят в веб-интерфейс и CLI Stronghold через корпоративный IdP.
- Политики назначаются по группам IdP через внешние группы Identity.
- Вход разрешён только членам определённых групп.
Общая схема

Что нужно настроить в любом IdP:
- Клиент (приложение) OIDC с типом
confidentialи секретом клиента. - URI перенаправления: для веб-интерфейса —
https://<STRONGHOLD_ADDRESS>/ui/stronghold/auth/<METHOD_PATH>/oidc/callback, для CLI —http://localhost:8250/oidc/callback. Здесь<STRONGHOLD_ADDRESS>— адрес, по которому пользователи открывают Stronghold, а<METHOD_PATH>— путь, по которому включён метод OIDC. - Утверждение (claim) со списком групп пользователя в ID-токене.
Выбор провайдера
Выберите провайдера в зависимости от того, где ведутся учётные записи пользователей:
| Провайдер | Когда использовать | Руководство |
|---|---|---|
| Dex в DP | Stronghold установлен в DP, пользователи уже входят в кластер через модуль user-authn | Вход через Dex в DP на этой странице |
| Keycloak | Корпоративный IdP на Keycloak, в том числе с федерацией из LDAP или AD | OIDC-провайдер Keycloak, пример ниже |
| GitLab | Учётные записи и группы разработчиков ведутся в GitLab | OIDC-провайдер GitLab |
| Другой OIDC-провайдер | Любой IdP с discovery-документом /.well-known/openid-configuration | Метод OIDC |
Предварительные требования
Перед началом подготовьте:
- Stronghold доступен пользователям по HTTPS, например
https://stronghold.example.com. - IdP доступен узлам Stronghold по HTTPS, сертификат IdP выдан доверенным УЦ.
- Токен Stronghold с правами на настройку методов аутентификации, политик и Identity.
- Подготовленный аварийный доступ на случай недоступности IdP.
Пример: Keycloak
В примере пользователи из группы Keycloak stronghold-admins получают политику admin, а из группы stronghold-users — политику user-read.
Шаг 1. Настройте клиент в Keycloak
Создайте в Keycloak клиент OIDC для Stronghold.
В Realm
corpсоздайте клиентstrongholdс протоколомopenid-connect, включите Client authentication и Standard flow.В Valid Redirect URIs укажите:
https://stronghold.example.com/ui/stronghold/auth/oidc/oidc/callback http://localhost:8250/oidc/callbackДобавьте в клиент маппер Group Membership с именем утверждения
groupsи отключите Full group path.На вкладке Credentials скопируйте секрет клиента.
Подробности настройки — в разделе «OIDC-провайдер Keycloak».
Шаг 2. Настройте метод OIDC
Включите метод OIDC в Stronghold и создайте роль для входа.
Включите метод и настройте подключение к Realm:
d8 stronghold auth enable oidc d8 stronghold write auth/oidc/config oidc_discovery_url="https://keycloak.example.com/realms/corp" oidc_client_id="stronghold" oidc_client_secret="<CLIENT_SECRET>" default_role="corp"<CLIENT_SECRET>— секрет клиента, скопированный на шаге 1.Создайте роль.
bound_claimsпропускает только участников двух групп,groups_claimпередаёт группы в Identity:d8 stronghold write auth/oidc/role/corp -<<EOF { "role_type": "oidc", "allowed_redirect_uris": [ "https://stronghold.example.com/ui/stronghold/auth/oidc/oidc/callback", "http://localhost:8250/oidc/callback" ], "oidc_scopes": ["openid", "profile", "email"], "user_claim": "preferred_username", "groups_claim": "groups", "bound_claims": { "groups": ["stronghold-users", "stronghold-admins"] }, "token_policies": ["default"], "token_ttl": "1h", "token_max_ttl": "8h" } EOF
Шаг 3. Сопоставьте группы с политиками
Для каждой группы создайте внешнюю группу Identity и псевдоним. Значение name псевдонима должно совпадать с именем группы в утверждении groups:
OIDC_ACCESSOR=$(d8 stronghold auth list -format=json | jq -r '."oidc/".accessor')
ADMINS_ID=$(d8 stronghold write -field=id identity/group name="corp-admins" type="external" policies="admin")
d8 stronghold write identity/group-alias name="stronghold-admins" mount_accessor="$OIDC_ACCESSOR" canonical_id="$ADMINS_ID"
USERS_ID=$(d8 stronghold write -field=id identity/group name="corp-users" type="external" policies="user-read")
d8 stronghold write identity/group-alias name="stronghold-users" mount_accessor="$OIDC_ACCESSOR" canonical_id="$USERS_ID"Политики admin и user-read должны существовать заранее. Примеры политик приведены в разделе «Примеры политик».
Шаг 4. Проверьте вход
Проверьте вход через CLI и веб-интерфейс.
Войдите через CLI — откроется браузер со страницей входа Keycloak:
d8 stronghold login -method=oidc role=corpПроверьте политики токена:
d8 stronghold token lookupУ члена
stronghold-adminsвidentity_policiesдолжна быть политикаadmin.В веб-интерфейсе выберите метод OIDC, укажите роль
corpи войдите.
Вход через Dex в DP
Если Stronghold установлен как модуль DP в режиме Automatic, после инициализации Stronghold модуль сам настраивает вход через Dex — провайдер аутентификации DP, который получает пользователей и группы из подключённого внешнего IdP или LDAP.
- Метод OIDC включается по пути
oidc_deckhouse, для входа создаётся роль по умолчаниюdeckhouse_dex_authenticated(claim групп —groups), а администраторам назначается политикаdeckhouse_administrators(полный доступ). - Администраторы задаются в параметре
settings.management.administratorsв ModuleConfigstronghold— группами (type: Group) или отдельными пользователями (type: User). Пользователь должен входить хотя бы в одну группу.
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: stronghold
spec:
enabled: true
version: 1
settings:
management:
mode: Automatic
administrators:
- type: Group
name: adminsВход пользователя:
d8 stronghold login -path=oidc_deckhouse -method=oidc -no-printЧтобы выдать права не только администраторам, создайте внешние группы Identity с псевдонимами на accessor метода oidc_deckhouse/ так же, как в шаге 3 примера с Keycloak. Имена псевдонимов должны совпадать с именами групп, которые передаёт Dex.
Модуль периодически (по умолчанию каждые 60 секунд) применяет конфигурацию заново, поэтому ручные изменения в auth/oidc_deckhouse перезаписываются:
- OIDC-конфигурация метода (discovery URL, ID и секрет клиента, роль по умолчанию) и роль
deckhouse_dex_authenticated(audience, redirect URI, claim’ыemailиgroups, scopes) переписываются безусловно; свои изменения вносите в отдельной роли или по отдельному пути; - описание метода и видимость
unauthв списке восстанавливаются, если вы их измените; - политика
deckhouse_administratorsснимается с сущностей и групп на accessor’еoidc_deckhouse/, которых нет вsettings.management.administrators; остальные политики не затрагиваются.
Все пользователи входят с одной ролью deckhouse_dex_authenticated. Других ролей для них модуль не создаёт: права определяются политиками групп Identity, как описано выше.
Подробнее — в разделах «Настройка Stronghold» и «Настройка доступа и первый вход».
Устранение неполадок
Типовые ошибки и способы их устранения:
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
redirect_uri не принимается IdP или Stronghold | URI в клиенте IdP и в allowed_redirect_uris роли не совпадают | Укажите одинаковые URI в обоих местах, включая путь метода. |
Отказ во входе из-за bound_claims или пустой список групп | IdP не передаёт группы в ID-токене | Проверьте маппер групп в IdP и значение groups_claim. |
| Вход проходит, но нет политик групп | Имя псевдонима не совпадает с именем группы в утверждении (например, передаётся полный путь /stronghold-admins) | Сравните groups в ID-токене с именами псевдонимов. В Keycloak отключите Full group path. |
x509: certificate signed by unknown authority при записи auth/oidc/config | Stronghold не доверяет сертификату IdP | Передайте цепочку УЦ в параметре oidc_discovery_ca_pem. |
| IdP недоступен, никто не может войти | Сбой IdP или ошибка конфигурации | Воспользуйтесь аварийным доступом. |
Очистка
Отключите метод OIDC:
d8 stronghold auth disable oidcУдалите внешние группы corp-admins и corp-users через identity/group/name/<GROUP_NAME> и клиент stronghold в Keycloak.