Настройка интеграции с LDAP¶
Примечание
Выполняется пользователем с правами Администратор.
Система позволяет настроить интеграцию с большинством известных LDAP-совместимых серверов:
- Microsoft Active Directory.
- Apple Open Directory.
- Open LDAP.
- 389 Server.
Примечание
Система не поддерживает Microsoft Active Directory Trusts.
Примечание
LDAP-пользователи должны иметь адрес электронной почты, независимо от того, используется ли он для авторизации.
Основные настройки конфигурации¶
Доступны следующие настройки:
Настройка | Обязат. | Тип | Описание |
---|---|---|---|
label |
Да | Строк. | Удобное для человека имя LDAP-сервера, которое отображается на странице авторизации. Например: Paris или Acme, Ltd |
host |
Да | Строк. | IP-адрес или доменное имя LDAP-сервера. Игнорируется, если определены хосты. Например: ldap.mydomain.com |
port |
Да | Целочисл. | Порт соединения с LDAP-сервером. Игнорируется, если определены хосты. Например: 389 или 636 (для SSL) |
uid |
Да | Строк. | Атрибут LDAP, сопоставляемый с именем пользователя, которое он использует для входа в систему. Это должен быть атрибут, а не значение, сопоставляемое с uid . Не влияет на имя пользователя Системы. Например: sAMAccountName или uid , или userPrincipalName |
base |
Да | Строк. | База, в которой осуществляется поиск пользователей. Например: ou=people,dc=appseccode,dc=example или DC=mydomain,DC=com |
hosts |
Нет | Массив строк и целочисленных значений | Массив пар хостов и портов для открытия соединений. Каждый настроенный сервер должен иметь такой набор данных. Это не означает, что необходимо конфигурировать несколько отдельных LDAP-серверов — используется только в целях повышения отказоустойчивости. Хосты перебираются в порядке их появления в конфигурации. Например: [['ldap1.mydomain.com', 636], ['ldap2.mydomain.com', 636]] |
bind_dn |
Нет | Строк. | Полное DN пользователя, с которым устанавливается связь. Например: america\momo или CN=AppSecCode,OU=Users,DC=domain,DC=com |
password |
Нет | Строк. | Пароль пользователя, с которым устанавливается связь |
verify_certificates |
Нет | Логич. | По умолчанию имеет значение true . Включает проверку сертификата SSL, если методом шифрования является start_tls или simple_tls . Если установлено значение false , проверка SSL-сертификата LDAP-сервера не производится |
timeout |
Нет | Целочисл. | Значение по умолчанию — 10 . Таймаут LDAP-запросов (в секундах) — позволяет избежать блокировки запроса, если LDAP-сервер не отвечает на него |
active_directory |
Нет | Логич. | Параметр определяет, является ли LDAP-сервер сервером Active Directory. Для серверов, не являющихся серверами AD, он пропускает запросы, специфичные для AD. Если LDAP-сервер не является сервером AD, установите значение false |
allow_username_or_email_login |
Нет | Логич. | Значение по умолчанию — false . Если этот параметр включен, то Система игнорирует все, что следует за первым символом «@ » в имени пользователя LDAP при авторизации. Если используется uid: 'userPrincipalName' в Active Directory, вы должны отключить этот параметр, поскольку имя userPrincipalName содержит символ «@ » |
block_auto_created_users |
Нет | Логич. | Значение по умолчанию — false . Включите этот параметр, чтобы блокировать новых пользователей, пока они не будут разрешены администратором |
user_filter |
Нет | Строк. | Фильтр пользователей LDAP. Соответствует формату RFC 4515. Система не поддерживает пользовательский синтаксис фильтра omniauth-ldap . Примеры синтаксиса поля user_filter :– '(employeeType=developer)' ;– '(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))' |
lowercase_usernames |
Нет | Логич. | Если эта опция включена, Система преобразует имена в нижний регистр |
retry_empty_result_with_codes |
Нет | Array | Массив кодов ответов на запросы LDAP, которые пытаются повторить операцию, если результат/содержимое пуст. Для Google Secure LDAP установите значение [80] |
Приведем пример настройки LDAP с базовыми параметрами конфигурации.
-
Отредактируйте файл docker-compose.yml:
version: "3.6" services: appseccode: image: 'appseccode/appseccode:latest' restart: always hostname: 'yoursite.ru' environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['ldap_enabled'] = true gitlab_rails['ldap_servers'] = { 'main' => { 'label' => 'LDAP', 'host' => 'ldap.mydomain.com', 'port' => 636, 'uid' => 'sAMAccountName', 'bind_dn' => 'CN=AppSecCode,OU=Users,DC=domain,DC=com', 'password' => '<bind_user_password>', 'encryption' => 'simple_tls', 'verify_certificates' => true, 'timeout' => 10, 'active_directory' => false, 'user_filter' => '(employeeType=developer)', 'base' => 'dc=example,dc=com', 'lowercase_usernames' => 'false', 'retry_empty_result_with_codes' => [80], 'allow_username_or_email_login' => false, 'block_auto_created_users' => false } }
-
Сохраните файл и выполните переконфигурацию Системы:
appseccode-ctl reconfigure
Настройка SSL¶
Параметры конфигурации SSL могут быть заданы в tls_options
через пары имен/значений. Доступны следующие параметры конфигурации SSL:
Настройка | Описание | Обязат. | Пример |
---|---|---|---|
ca_file |
Путь к файлу, содержащему СА-сертификат в формате PEM, например, при использовании внутреннего CA | Нет | '/etc/ca.pem' |
ssl_version |
Версия SSL для использования OpenSSL, если версия OpenSSL по умолчанию не подходит | Нет | 'TLSv1_1' |
ciphers |
SSL-шифры для использования при взаимодействии с LDAP-серверами | Нет | 'ALL:!EXPORT:!LOW:!aNULL:!eNULL:!SSLv2' |
Cert |
Сертификат клиента | Нет | '-----BEGIN CERTIFICATE----- <REDACTED> -----END CERTIFICATE -----' |
Key |
Приватный ключ клиента | Нет | '-----BEGIN PRIVATE KEY----- <REDACTED> -----END PRIVATE KEY -----' |
Пример ниже иллюстрирует определение ca_file
и ssl_version
в tls_options
:
-
Отредактируйте файл docker-compose.yml:
version: "3.6" services: appseccode: image: 'appseccode/appseccode:latest' restart: always hostname: 'yoursite.ru' environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['ldap_enabled'] = true gitlab_rails['ldap_servers'] = { 'main' => { 'label' => 'LDAP', 'host' => 'ldap.mydomain.com', 'port' => 636, 'uid' => 'sAMAccountName', 'encryption' => 'simple_tls', 'base' => 'dc=example,dc=com', 'tls_options' => { 'ca_file' => '/path/to/ca_file.pem', 'ssl_version' => 'TLSv1_2' } } }
-
Сохраните файл и перезапустите Систему:
docker compose up -d
Параметры конфигурации атрибутов¶
Система использует приведенные ниже LDAP-атрибуты для создания аккаунта LDAP-пользователя. Могут использоваться следующие атрибуты:
- Имя атрибута, как строковая переменная, например:
'mail'
. - Массив имен атрибутов, которые перебираются по порядку. Например:
['mail', 'email']
.
LDAP-атрибут пользователя, который используется для авторизации — uid
.
Необходимо определить следующие атрибуты в хеше attributes
.
Настройка | Описание | Обязат. | Пример |
---|---|---|---|
username |
Используется в путях к собственным проектам пользователя (например, yoursite.ru/username/project ) и при упоминании их в проблемах, запросах на слияние и комментариях (например, @username ). Если атрибут, указанный для имени пользователя, содержит адрес электронной почты, то имя пользователя Системы является частью адреса электронной почты перед символом «@ » |
Нет | ['uid', 'userid', 'sAMAccountName'] |
email |
LDAP-атрибут для электронной почты пользователя | Нет | ['mail', 'email', 'userPrincipalName'] |
name |
LDAP-атрибут для отображаемого имени пользователя. Если name пуст, используется полное имя, взятое из атрибутов first_name и last_name |
Нет | Атрибуты 'cn' или 'displayName' обычно содержат полные имена. В качестве альтернативы можно принудительно использовать first_name и last_name , указав отсутствующий атрибут, например, 'somethingNonExistent' |
first_name |
LDAP-атрибут для имени пользователя. Используется, когда атрибут для name не сконфигурирован |
Нет | 'givenName' |
last_name |
LDAP-атрибут для фамилии пользователя. Используется, когда атрибут для name не сконфигурирован |
Нет | 'sn' |
Настройки синхронизации LDAP-конфигурации¶
Доступны следующие настройки синхронизации LDAP-конфигурации:
Настройка | Описание | Обязат. | Пример |
---|---|---|---|
group_base |
База, используемая для поиска групп | Нет (обязат., когда сконфигурирован external_groups ) |
'ou=groups,dc=appseccode,dc=example' |
admin_group |
CN группы администраторов Системы | Нет | 'administrators' |
external_groups |
Массив CN групп, содержащих пользователей, которые должны рассматриваться в качестве внешних | Нет | ['interns', 'contractors'] |
sync_ssh_keys |
LDAP-атрибут, содержащий публичный SSH-ключ пользователя | Нет | 'sshPublicKey' или false , если не задан |
Использование нескольких LDAP-серверов¶
Можно сконфигурировать систему для работы с несколькими LDAP-серверами. Чтобы добавить дополнительный LDAP-сервер:
- Продублируйте
main
LDAP-конфигурацию. -
Отредактируйте каждую скопированную конфигурацию для использования дополнительных серверов.
- Для каждого дополнительного сервера, выберите другой ID-провайдера, например
main
,secondary
илиtertiary
. Используйте цифры и буквы в нижнем регистре. Система использует ID провайдера, чтобы связать каждого пользователя с определенным LDAP-сервером. - Для каждой записи используйте уникальное значение метки
label
. Эти значения используются для названия вкладок на странице авторизации.
- Для каждого дополнительного сервера, выберите другой ID-провайдера, например
Ниже приведена минимальная конфигурация трех LDAP-серверов:
-
Отредактируйте файл docker-compose.yml:
version: "3.6" services: appseccode: image: 'appseccode/appseccode:latest' restart: always hostname: 'yoursite.ru' environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['ldap_enabled'] = true gitlab_rails['ldap_servers'] = { 'main' => { 'label' => 'AD1', 'host' => 'ad.mydomain.com', 'port' => 636, 'uid' => 'sAMAccountName', 'encryption' => 'simple_tls', 'base' => 'dc=example,dc=com', }, 'secondary' => { 'label' => 'AD2', 'host' => 'ad-secondary.mydomain.com', 'port' => 636, 'uid' => 'sAMAccountName', 'encryption' => 'simple_tls', 'base' => 'dc=example,dc=com', }, 'tertiary' => { 'label' => 'AD3', 'host' => 'ad-tertiary.mydomain.com', 'port' => 636, 'uid' => 'sAMAccountName', 'encryption' => 'simple_tls', 'base' => 'dc=example,dc=com', } }
-
Сохраните файл из перезапустите Систему:
docker compose up -d
В результате применения приведенных в это примере настроек на странице входа в систему появятся следующие вкладки:
- AD1.
- AD2.
- AD3.
Включение перевода имен LDAP-пользователей в нижний регистр¶
Некоторые LDAP-серверы, в зависимости от их конфигурации, могут возвращать имена пользователей в верхнем регистре, что может приводить к некоторым проблемам, например, создание ссылок или пространств имен с использованием букв в верхнем регистре.
Система автоматически переводит имя пользователя, предоставленное LDAP-сервером в нижний регистр, если выбрана опция lowercase_usernames
. По умолчанию для этой опции выбрано значение false
.
-
Отредактируйте файл docker-compose.yml:
version: "3.6" services: appseccode: image: 'appseccode/appseccode:latest' restart: always hostname: 'yoursite.ru' environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['ldap_servers'] = { 'main' => { 'lowercase_usernames' => true } }
-
Сохраните файл и перезапустите Систему:
docker compose up -d
Использование шифрования учетных данных¶
Вместо хранения учетных данных для интеграции с LDAP в открытом виде, можно использовать зашифрованный файл.
Чтобы использовать зашифрованные учетные данные, необходимо сначала включить конфигурацию с шифрованием, которая, в свою очередь, находится в зашифрованном YAML-файле.
Нешифрованное содержимое файла должно представлять собой подмножество секретных настроек из блока ваших серверов в конфигурации LDAP.
Поддерживаются следующие элементы конфигурации для зашифрованного файла:
bind_dn
;password
.
-
Если изначально конфигурация LDAP в файле docker-compose.yml выглядит следующим образом:
version: "3.6" services: appseccode: image: 'appseccode/appseccode:latest' restart: always hostname: 'yoursite.ru' environment: GITLAB_OMNIBUS_CONFIG: | gitlab_rails['ldap_servers'] = { 'main' => { 'bind_dn' => 'admin', 'password' => '123' } }
-
Перейдите в контейнер и отредактируйте секреты шифрования:
docker exec -t <container_name> bash gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
-
Введите защифрованное содержимое секретов LDAP:
main: bind_dn: admin password: '123'
-
Отредактируйте docker-compose.yml и удалите настройки для
bind_dn
иpassword
. -
Сохраните файл и перезапустите Систему:
docker compose up -d
Удаление пользователей LDAP¶
Удаление пользователей с LDAP-сервера незамедлительно блокирует его авторизацию в Системе.
Однако пользователи смогут продолжать использовать Систему через SSH, до следующей проверки кэша LDAP.
Чтобы удалить аккаунт незамедлительно, можно заблокировать пользователя вручную.
Обновление адресов электронной почты¶
Адреса электронной почты на LDAP-сервере считаются источником истины при авторизации.
Обновление адресов электронной почты пользователей должно производиться на LDAP-сервере, который управляет пользователем. Адрес электронной почты для Системы обновляется либо:
- При следующем входе пользователя в систему.
- При выполнении следующей синхронизации пользователя.
Обновленный (предыдущий) адрес электронной почты пользователя становится вторичным для сохранения истории коммитов этого пользователя.