Подключение внешнего провайдера аутентификации позволяет использовать единые учетные данные для входа в несколько кластеров и одновременно работать с несколькими провайдерами.
DKP поддерживает подключение следующих внешних провайдеров и протоколов аутентификации:
- LDAP (например, Active Directory);
- OIDC (например, Okta, Keycloak, Gluu, Blitz Identity Provider);
- GitHub;
- GitLab;
- Atlassian Crowd;
- Bitbucket Cloud.
Политика безопасности паролей (требования к сложности, срок действия, история, двухфакторная аутентификация и т.д.) полностью контролируется внешним провайдером аутентификации. Deckhouse не управляет паролями и не вмешивается в реализацию этих политик на стороне провайдера.
Общая схема интеграции
Параметр allowedGroups
в ресурсе DexProvider позволяет ограничить вход только пользователям, входящим в указанные группы.
Если список allowedGroups
задан, пользователь обязан состоять хотя бы в одной из этих групп — иначе аутентификация будет считаться неуспешной.
Если параметр не указан, фильтрация по группам не применяется.
- Создайте OAuth-приложение у провайдера аутентификации:
- укажите Redirect URI вида
https://dex.<publicDomainTemplate>/callback
; - получите
clientID
иclientSecret
.
Важно. При указании Redirect URI подставьте значение
publicDomainTemplate
без%s
. Например, если указаноpublicDomainTemplate: '%s.sandbox1.deckhouse-docs.flant.com'
, то фактический URI будетhttps://dex.sandbox20.deckhouse-docs.flant.com/callback
.Для того, чтобы узнать адрес Dex (URI), выполните команду:
d8 k -n d8-user-authn get ingress dex -o jsonpath="{.spec.rules[*].host}"
- укажите Redirect URI вида
- Создайте ресурс DexProvider с учётом специфики выбранного провайдера.
-
Включите модуль
user-authn
(если он выключен).Сделать это можно как через веб-интерфейс администратора, так и через CLI. Далее приведен пример работы через CLI (требуется
kubectl
настроенный на работу с кластером).Проверьте статус модуля:
d8 k get module user-authn
Пример вывода:
NAME STAGE SOURCE PHASE ENABLED READY user-authn Embedded Available True True
Включите модуль через CLI:
d8 platform module enable user-authn
-
Настройте модуль
user-authn
.-
Откройте настройки модуля
user-authn
(создайте ресурс ModuleConfiguser-authn
, если его нет):d8 k edit mc user-authn
-
Укажите необходимые параметры модуля в секции
spec.settings
. Подробнее о настройках модуляuser-authn
можно узнать в разделе справки модуля.Пример конфигурации
user-authn
:apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: user-authn spec: version: 2 enabled: true settings: kubeconfigGenerator: - id: direct masterURI: https://159.89.5.247:6443 description: "Direct access to kubernetes API" publishAPI: enabled: true
-
Интеграция по OIDC (OpenID Connect)
Аутентификация через OIDC-провайдера требует регистрации клиента (или создания приложения). Сделайте это по документации вашего провайдера (например, Okta, Keycloak, Gluu или Blitz).
Полученные в ходе выполнения инструкции clientID
и clientSecret
укажите в ресурсе DexProvider.
При регистрации приложения в любом OIDC-провайдере необходимо указать адрес перенаправления (Redirect URI). Для интеграции с DexProvider используйте следующий формат: https://dex.<publicDomainTemplate>/callback
, где publicDomainTemplate
— шаблон DNS-имен вашего кластера, определенный в модуле global
.
Для обеспечения корректного отзыва токена при выходе из приложения и требования повторной авторизации установите параметр prompt
в значение login
. Это гарантирует, что пользователю будет предложено повторно ввести учетные данные при повторной аутентификации.
Чтобы настроить детальный (гранулированный) доступ пользователей к приложениям:
- добавьте параметр
allowedUserGroups
в ModuleConfig нужного приложения; - добавьте соответствующие группы пользователю, используя те же наименования групп как на стороне провайдера, так и на стороне Deckhouse.
Keycloak
В процессе настройки Keycloak выберите подходящий realm
, добавьте пользователя в Users и создайте клиент в разделе Clients с включённой аутентификацией, необходимой для генерации clientSecret
. Затем выполните следующие шаги:
- Создайте в разделе Client scopes
scope
с именемgroups
, и назначьте ему предопределенный маппингGroup Membership
(«Client scopes» → «Client scope details» → «Mappers» → «Configure a new mapper»). В поле «Name» и «Token Claim Name» впишитеgroups
, в параметре «Full group path» задайтеoff
. - В созданном ранее клиенте добавьте данный
scope
во вкладке Client scopes («Clients → «Client details» → «Client Scopes» → «Add client scope»). - В полях «Valid redirect URIs», «Valid post logout redirect URIs» и «Web origins» конфигурации клиента укажите
https://dex.<publicDomainTemplate>/*
, гдеpublicDomainTemplate
– это указанный шаблон DNS-имен кластера в модулеglobal
.
Пример настройки провайдера для интеграции с Keycloak:
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: keycloak
spec:
type: OIDC
displayName: My Company Keycloak
oidc:
issuer: https://keycloak.my-company.com/realms/myrealm # Используйте имя вашего realm
clientID: plainstring
clientSecret: plainstring
insecureSkipEmailVerified: true
getUserInfo: true
scopes:
- openid
- profile
- email
- groups
Если в Keycloak не используется подтверждение учетных записей по email, для корректной работы с ним в качестве провайдера аутентификации внесите изменения в настройку Client scopes
одним из следующих способов:
-
Удалите маппинг
Email verified
(«Client Scopes» → «Email» → «Mappers»). Это необходимо для корректной обработки значенияtrue
в полеinsecureSkipEmailVerified
и правильной выдачи прав пользователям с неподтвержденным email. -
Если отредактировать или удалить маппинг
Email verified
невозможно, создайте отдельный Client Scope с именемemail_dkp
(или любым другим) и добавьте в него два маппинга:email
: «Client Scopes» →email_dkp
→ «Add mapper» → «From predefined mappers» →email
;email verified
: «Client Scopes» →email_dkp
→ «Add mapper» → «By configuration» → «Hardcoded claim». Укажите следующие поля:- «Name»:
email verified
; - «Token Claim Name»:
emailVerified
; - «Claim value»:
true
; - «Claim JSON Type»:
boolean
.
- «Name»:
После этого в клиенте, зарегистрированном для кластера DKP, в разделе «Clients» для
Client scopes
замените значениеemail
наemail_dkp
.В ресурсе DexProvider укажите параметр
insecureSkipEmailVerified: true
и в поле.spec.oidc.scopes
замените название Client Scope наemail_dkp
, следуя примеру:scopes: - openid - profile - email_dkp - groups
Blitz Identity Provider
Пример настройки провайдера для интеграции с Blitz Identity Provider:
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: blitz
spec:
displayName: Blitz Identity Provider
oidc:
basicAuthUnsupported: false
claimMapping:
email: email
groups: your_claim # Claim для получения групп пользователя, группы пользователя настраиваются на стороне провайдера Blitz Identity Provider.
clientID: clientID
clientSecret: clientSecret
getUserInfo: true
insecureSkipEmailVerified: true # Установить true, если нет необходимости в проверке email пользователя.
insecureSkipVerify: false
issuer: https://yourdomain.idblitz.ru/blitz
promptType: consent
scopes:
- profile
- openid
userIDKey: sub
userNameKey: email
type: OIDC
Okta
Пример настройки провайдера для интеграции с Okta:
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: okta
spec:
type: OIDC
displayName: My Company Okta
oidc:
issuer: https://my-company.okta.com
clientID: plainstring
clientSecret: plainstring
insecureSkipEmailVerified: true
getUserInfo: true
После включения интеграции с Okta можно использовать группы пользователей из Okta, для управления правами. Например, можно задать список групп, пользователи из которых получат доступ к Grafana.
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: prometheus
spec:
version: 2
settings:
auth:
allowedUserGroups:
- adm-grafana-access
- grafana-access
Интеграция по LDAP
Для настройки аутентификации создайте в LDAP учетную запись с правами только на чтение (service account). Эта учетная запись будет использоваться для выполнения поисковых запросов в каталоге LDAP.
В ресурсе DexProvider укажите следующие параметры:
bindDN
: Полный DN (Distinguished Name) созданного service account. Например:cn=readonly,dc=example,dc=org
.bindPW
: Пароль для указанногоbindDN
.
Если ваш LDAP-сервер позволяет анонимный доступ для выполнения поисковых запросов, параметры bindDN
и bindPW
можно опустить. Однако, рекомендуется использовать аутентифицированный доступ для повышения безопасности.
В параметре bindPW
укажите пароль в открытом виде (plain text). Dex не поддерживает передачу хэшированных паролей в этом параметре.
Пример настройки провайдера для интеграции с Active Directory:
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: active-directory
spec:
type: LDAP
displayName: Active Directory
ldap:
host: ad.example.com:636
insecureSkipVerify: true
bindDN: cn=Administrator,cn=users,dc=example,dc=com
bindPW: admin0!
usernamePrompt: Email Address
userSearch:
baseDN: cn=Users,dc=example,dc=com
filter: "(objectClass=person)"
username: userPrincipalName
idAttr: DN
emailAttr: userPrincipalName
nameAttr: cn
groupSearch:
baseDN: cn=Users,dc=example,dc=com
filter: "(objectClass=group)"
userMatchers:
- userAttr: DN
groupAttr: member
nameAttr: cn
Интеграция с GitHub
В организации GitHub необходимо создать новое приложение.
Для этого выполните следующие шаги:
- Перейдите в «Settings» → «Developer settings» → «OAuth App» → «New OAuth App», и в качестве «Authorization callback URL» укажите адрес
https://dex.<publicDomainTemplate>/callback
. - Полученные
Client ID
иClient Secret
укажите в ресурсе DexProvider.
Если организация GitHub находится под управлением клиента:
- Перейдите в «Settings» → «Applications» → «Authorized OAuth Apps» →
<имя созданного OAuth-приложения>
и нажмите «Send Request» для подтверждения. - Попросите клиента подтвердить запрос, который придет к нему на email.
Пример настройки провайдера для интеграции с GitHub:
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: github
spec:
type: Github
displayName: My Company GitHub
github:
clientID: plainstring
clientSecret: plainstring
Интеграция с GitLab
В GitLab проекта необходимо создать новое приложение.
Для этого выполните следующие шаги:
- Self-hosted-версия GitLab: перейдите в «Admin Area» → «Applications» → «New application» и в качестве «Redirect URI (Callback url)» укажите адрес
https://dex.<publicDomainTemplate>/callback
, а также выберите «scopes»:read_user
,openid
. - GitLab Cloud (gitlab.com): под главной учетной записью проекта перейдите в «User Settings» → «Applications» → «Add new application» и в качестве «Redirect URI (Callback url)» укажите адрес
https://dex.<publicDomainTemplate>/callback
, а также выберите «scopes»:read_user
,openid
. - Полученные
Application ID
и секрет укажите в ресурсе DexProvider.
Для GitLab версии 16 и выше включите опцию «Trusted» при создании приложения. Эта опция доступна при создании приложений в «Admin Area» → «Applications». Установка приложения как доверенного позволяет пропустить шаг авторизации для пользователей, что может быть полезно в контролируемых средах.
Пример настройки провайдера для интеграции с GitLab:
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: gitlab
spec:
type: Gitlab
displayName: Dedicated Gitlab
gitlab:
baseURL: https://gitlab.example.com
clientID: plainstring
clientSecret: plainstring
groups:
- administrators
- users
Интеграция с Atlassian Crowd
В соответствующем проекте Atlassian Crowd необходимо создать новое Generic-приложение.
Для этого выполните следующие шаги:
- Перейдите в «Applications» → «Add application».
- Полученные «Application Name» и «Password» укажите в ресурсе DexProvider.
- При указании групп в ресурсе DexProvider убедитесь, что их названия приведены к нижнему регистру (lowercase). Это необходимо для корректного сопоставления групп между Crowd и Deckhouse.
Пример настройки провайдера для интеграции с Atlassian Crowd:
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: crowd
spec:
type: Crowd
displayName: Crowd
crowd:
baseURL: https://crowd.example.com/crowd
clientID: plainstring
clientSecret: plainstring
enableBasicAuth: true
groups:
- administrators
- users
Интеграция с Bitbucket Cloud
Для настройки аутентификации необходимо в меню команды Bitbucket создать нового OAuth пользователя (consumer).
Для этого выполните следующие шаги:
- Перейдите в «Personal settings» → «Access management» → «OAuth consumers» → «Add consumer» и в качестве «Callback URL» укажите адрес
https://dex.<publicDomainTemplate>/callback
. - Разрешите доступ: «Account: Read» → позволяет получать основную информацию о пользователе (например, email, имя пользователя), «Workspace membership → Read»: позволяет получать информацию о членстве пользователя в рабочих пространствах.
- Полученные
Key
и секрет укажите в ресурсе DexProvider.
Пример настройки провайдера для интеграции с Bitbucket:
apiVersion: deckhouse.io/v1
kind: DexProvider
metadata:
name: bitbucket
spec:
type: BitbucketCloud
displayName: Bitbucket
bitbucketCloud:
clientID: plainstring
clientSecret: plainstring
includeTeamGroups: true
teams:
- administrators
- users