Стадия жизненного цикла модуля: 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)

  1. Настройка 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
  2. Получите секрет DexClient:

    kubectl -n mynamespace get secret dex-client-myname -o jsonpath='{.data.clientSecret}' | base64 -d
  3. Добавьте провайдер в 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"
  4. Дождитесь применения изменений оператором.

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 пользователей:

  • member
  • uniquemember
  • memberof
  • memberuid
  • submember

Синхронизация пользователей

Блокирует и разблокирует пользователей, а также обновляет их имя и 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.

Чтобы исправить ситуацию, выполните следующие шаги:

  1. Подключитесь к Redis, используя базы, указанные в config/redis.shared_state.yml and config/redis.queues.yml.
  2. Удалите следующий ключ: sidekiq:concurrency_limit:throttled_jobs:{ldap/sync_worker} с помощью команд:
  • keys *ldap* - убеждается в наличии соответствующего ключа
  • del "sidekiq:concurrency_limit:throttled_jobs:{ldap/sync_worker}" - удаляет ключ из Redis