Предварительная версия. Функциональность может измениться, но основные возможности сохранятся. Совместимость с будущими версиями может потребовать ручных действий по миграции.

Конфигурация OmniAuth

Настройка в основном основывается на официальной документации. Однако Deckhouse Code добавляет некоторые расширения, описанные в разделах ниже.

OpenID Connect (OIDC)

Для интеграции с OIDC были добавлены следующие параметры:

  • allowed_groups: Массив групп, которым разрешён вход. Пользователи, не входящие в эти группы, будут заблокированы и не смогут войти.По умолчанию: null (разрешены все группы).
  • admin_groups: Массив групп, которым разрешён вход с правами администратора. Пользователи из этих групп получат роль администратора.По умолчанию: null (админские права не выдаются ни одной группе).
  • groups_attribute: Имя атрибута, используемого для получения групп пользователя. По умолчанию: 'groups'.

Пример конфигурации

Секци находится в разделе spec.appConfig.omniauth.

providers:
  - name: 'openid_connect'
    allowed_groups:
      - 'gitlab'
    admin_groups:
      - 'admin'
    groups_attribute: 'gitlab_group'

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.

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