Стадия жизненного цикла модуля: General Availability
У модуля есть требования для установки
Конфигурация OmniAuth
Секция spec.appConfig.omniauth позволяет настроить внешние провайдеры аутентификации в Deckhouse Code. Поддерживаются OIDC, SAML, GitHub, GitLab и другие провайдеры.
Параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
enabled |
false |
Включить OmniAuth |
allowSingleSignOn |
[] |
Список провайдеров, кнопки которых отображаются на странице входа в Code. Пользователи смогут авторизоваться через указанные провайдеры |
blockAutoCreatedUsers |
true |
Блокировать автоматически созданных через OmniAuth пользователей до одобрения администратором |
autoLinkUser |
[] |
Если в Code уже существует пользователь с тем же email, что и у аккаунта в указанном провайдере, — они будут автоматически связаны при входе. Без этой настройки такой пользователь не сможет войти через OmniAuth: при blockAutoCreatedUsers: true — будет заблокирован, при blockAutoCreatedUsers: false — будет создан дублирующий аккаунт |
autoLinkLdapUser |
false |
При входе через OmniAuth автоматически создаёт связь между OmniAuth-аккаунтом и соответствующим пользователем LDAP. Требует настроенной LDAP-интеграции. Используется редко, в специфичных сценариях миграции или двойной идентификации |
autoLinkSamlUser |
false |
Аналогично autoLinkLdapUser, но для SAML-провайдера: при входе через OmniAuth создаёт связь с SAML-аккаунтом. Требует настроенной SAML-интеграции. Используется редко, в специфичных сценариях |
autoSignInWithProvider |
— | Автоматически перенаправлять пользователя на страницу авторизации указанного провайдера при открытии страницы входа |
externalProviders |
[] |
Пользователи, вошедшие через эти провайдеры, получают статус «внешних» и не имеют доступа к внутренним группам и проектам |
syncProfileFromProvider |
[] |
Список провайдеров, из которых синхронизируется профиль пользователя |
syncProfileAttributes |
[name, email] |
Атрибуты профиля для синхронизации |
allowBypassTwoFactor |
[] |
Провайдеры, для которых пропускается встроенная двухфакторная аутентификация Code. Если 2FA включён на уровне Code, он будет запрашиваться даже при входе через SSO — эта настройка позволяет отключить это поведение для указанных провайдеров |
providers |
[] |
Список провайдеров аутентификации.Подробнее о настройке провайдера |
Настройка провайдера
Каждый провайдер в списке providers описывается следующими полями:
| Поле | Описание |
|---|---|
name |
Тип провайдера. Допустимые значения:alicloud, atlassioan_oauth2, auth0, cognito, azute_activedirectory_v2, bitbucket, oauth2_generic, github, gitlab, google_oauth2, jwt, kerberos, openid_connect, salesforce, saml, shibboleth |
label |
Отображаемое название кнопки входа |
icon |
URL иконки, отображаемой на кнопке входа (например,https://example.com/icon.png) |
args |
Параметры провайдера (зависят от типа) |
allowedGroups |
Список групп провайдера, участникам которых разрешён вход. Если список пуст, вход разрешён всем пользователям данного провайдера вне зависимости от членства в группах.Требует наличия groups в args.scope. |
adminGroups |
Список групп провайдера, участники которых получают права администратора при входе. Если список пуст, права администратора не выдаются ни одной группе. |
groupsAttribute |
Название атрибута в токене или ответе провайдера, содержащего список групп пользователя. Используется совместно с allowedGroups и adminGroups. По умолчанию: groups. |
Внимание: если
allowedGroupsзадан, но вargs.scopeне указанgroups, аутентификация через OmniAuth перестанет работать полностью.
Поля для openid_connect:
Поле args |
Описание |
|---|---|
name |
Должно совпадать с полем name провайдера |
scope |
Список OAuth-скоупов, запрашиваемых у провайдера |
response_type |
Тип ответа OAuth. Для большинства OIDC-провайдеров —code |
issuer |
URL OIDC-провайдера. Используется для построения URL эндпоинтов при discovery: false, и для валидации токенов |
discovery |
Если true — эндпоинты провайдера обнаруживаются автоматически по URL <issuer>/.well-known/openid-configuration |
client_auth_method |
Метод аутентификации клиента при обращении к token endpoint. Значение query — передача credentials в query-параметрах |
client_options.identifier |
Client ID, выданный провайдером |
client_options.secret |
Client Secret, выданный провайдером |
client_options.redirect_uri |
URI, на который провайдер перенаправит пользователя после аутентификации. Должен совпадать с зарегистрированным в провайдере |
Пример:
args:
name: openid_connect
scope: ["openid", "profile", "email"]
response_type: "code"
issuer: "https://dex.example.com"
discovery: true
client_auth_method: "query"
client_options:
identifier: "<client-id>"
secret: "<client-secret>"
redirect_uri: "https://code.example.com/users/auth/openid_connect/callback"OpenID Connect (OIDC)
Настройка аутентификации через Deckhouse (Dex)
-
Настройка
DexClient:apiVersion: deckhouse.io/v1 kind: DexClient metadata: name: myname namespace: mynamespace spec: redirectURIs: - https://code.example.com/users/auth/openid_connect/callback allowedGroups: - Everyone - admins -
Получите секрет
DexClient:kubectl -n mynamespace get secret dex-client-myname -o jsonpath='{.data.clientSecret}' | base64 -d -
Добавьте провайдер в
CodeInstance:spec: appConfig: omniauth: enabled: true allowSingleSignOn: - openid_connect blockAutoCreatedUsers: false providers: - name: openid_connect label: "Deckhouse" args: name: openid_connect scope: ["openid", "profile", "email"] response_type: "code" issuer: "https://dex.example.com" discovery: true client_auth_method: "query" client_options: identifier: "dex-client-myname@mynamespace" secret: "<clientSecret>" redirect_uri: "https://code.example.com/users/auth/openid_connect/callback" -
Дождитесь применения изменений оператором.
SAML
Для интеграции с SAML были добавлены следующие параметры:
allowed_groups: Массив групп, которым разрешён вход. Пользователи, не входящие в эти группы, будут заблокированы и не смогут войти.По умолчанию:null(разрешены все группы).admin_groups: Массив групп, которым разрешён вход с правами администратора. Пользователи из этих групп получат роль администратора.По умолчанию:null(админские права не выдаются ни одной группе).groups_attribute: Имя атрибута, используемого для получения групп пользователя. По умолчанию:'Groups'.
Пример конфигурации
Секци находится в разделе spec.appConfig.omniauth.
providers:
- name: 'saml'
allowed_groups:
- 'gitlab'
admin_groups:
- 'admin'
groups_attribute: 'gitlab_group'Примечание: для OIDC и SAML — если пользователь принадлежит к admin_groups, но не указан в allowed_groups, он не сможет войти. В этом случае admin_groups игнорируется и административные права не назначаются.
LDAP Synchronization
Выполняет синхронизацию пользователей, групп и прав доступа с LDAP-сервером. По умолчанию запускается раз в час.
Вы можете настроить периодичность синхронизации через параметр cronJobs в секции spec.appConfig.:
cronJobs:
ldapSyncWorker:
cron: "0 * * * *"sОграничения на стороне LDAP-сервера
Во время синхронизации выполняются запросы ко всем пользователям и группам, указанным в конфигурации. Задача синхронизации автоматически использует пагинацию при необходимости. Однако если на стороне LDAP-сервера установлено ограничение на максимальное количество возвращаемых записей, это может привести к неожиданной блокировке или удалению доступа у пользователей.
Пример конфигурации LDAP-провайдера
Раздел конфигурации находится в spec.appConfig.ldap.servers
main:
label: ldap
host: 127.0.0.1
port: 3389
bindDn: 'uid=viewer,ou=People,dc=example,dc=com'
base: 'ou=People,dc=example,dc=com'
uid: 'cn'
password: 'viewer123'
syncName: true
groupSync:
createGroups: true
base: 'ou=Groups,dc=example,dc=org'
filter: '(objectClass=groupOfNames)'
prefix:
attribute: 'businessCategory'
default: 'default-program'
topLevelGroup: "LdapGroups"
nameMask: "(?<=-)[A-z0-9А-я]*$"
owner: "root"
roleMapping:
- byName: '.*-project_manager-.*'
gitlabRole: 'Maintainer'
- byName: '.*-developer-.*'
gitlabRole: 'Developer'
- byName: '.*-participant-.*'
gitlabRole: 'Reporter'Синхронизация групп и прав доступа
Deckhouse Code переиспользует базовую ролевую модель Gitlab.
Создаёт группы GitLab и назначает роли пользователям на основе записей, полученных с LDAP-сервера. Может быть настроена с помощью следующих параметров:
Обязательные параметры:
- groupSync.base — базовый DN, с которого начинается поиск..
Опциональные параметры:
- groupSync.createGroups — если
true, группы будут создаваться в Deckhouse Code. - groupSync.filter — LDAP фильтр для поиска групп.
- groupSync.scope — Область поиска групп (0 — Base, 1 — SingleLevel, 2 — WholeSubtree).
- groupSync.prefix — Определяет, из какого атрибута брать имя родительской группы. Если атрибут отсутствует — используется значение по умолчанию.
- groupSync.topLevelGroup — Имя верхнеуровневой группы, в которую будут добавлены все синхронизированные группы.
- groupSync.nameMask — регулярное выражение для извлечения имени группы из атрибута CN. Регулярное выражение не должно содержать захватывающих групп. Результатом применения должно быть ровно то значение, которое используется в имени группы. Для строгих ограничений можно использовать конструкции lookbehind и lookahead.
- groupSync.owner — имя пользователя, который будет добавлен как владелец группы (по умолчанию —
root).
Секция roleMapping
Назначает права пользователям на основе имени группы (cn):
- roleMapping.byName — регулярное выражение; если имя группы совпадает, пользователю назначается соответствующая роль.
- roleMapping.gitlabRole — название роли в Deckhouse Code (например:
Guest,Reporter,Developer,Maintainer,Owner).
Как определяется членство в группе
Участники групп определяются на основе следующих атрибутов группы. Значение каждого атрибута должно быть массивом DN пользователей:
memberuniquemembermemberofmemberuidsubmember
Синхронизация пользователей
Блокирует и разблокирует пользователей, а также обновляет их имя и email на основе данных с LDAP-сервера.
Опциональные параметры:
syncName - если true, имя пользователя будет обновлено по данным LDAP.
Правило преобразования имён пользователей:
| Список раширений |
|---|
html, xhtml, text, txt, js, css, markdown, md, diff, patch, vtt, yaml, yml |
png, jpeg, jpg, jpe, pjpeg, gif, bmp, tiff, tif, svg, webp, ico |
mp3, mp1, mp2, ogg, oga, spx, opus, m4a, aac |
mpeg, mpg, mpe, mpg4, webm, mp4, m4v, mov, ogv |
otf, ttf, woff, woff2 |
pdf |
zip, gzip, gz |
csv, json, xml, rss, atom, vcf, ics |
multipart_form, url_encoded_form |
Если имя пользователя в LDAP содержит точку (.), за которой следует расширение файла, совпадающее с записью из предопределённой таблицы расширений, то точка (.), стоящая непосредственно перед этим расширением, автоматически заменяется на символ подчёркивания (_).
Такое преобразование обеспечивает совместимость с требованиями GitLab к формату имён пользователей, максимально сохраняя при этом исходный идентификатор.
Примеры:
Ldap username: a.ivanov.ini
Gitlab username:a.ivanov_ini
Ldap username: a.k.ivanov
Gitlab username:a.k.ivanov
Ldap username: a.k.ivanov.ini
Gitlab username:a.k.ivanov_ini
Ldap username: a.ini.ivanov
Gitlab username:a.ini.ivanov
Устранение проблем с синхронизацией
Если предыдущее задание синхронизации не завершилось корректно, Redis может сохранить запись о том, что оно ещё выполняется. Это предотвратит запуск нового задания, поскольку параметр concurrency установлен в 1.
Чтобы исправить ситуацию, выполните следующие шаги:
- Подключитесь к Redis, используя базы, указанные в
config/redis.shared_state.ymlandconfig/redis.queues.yml. - Удалите следующий ключ:
sidekiq:concurrency_limit:throttled_jobs:{ldap/sync_worker}с помощью команд:
keys *ldap*- убеждается в наличии соответствующего ключаdel "sidekiq:concurrency_limit:throttled_jobs:{ldap/sync_worker}"- удаляет ключ из Redis