Аутентификация через LDAP
Важно
Аутентификация через LDAP доступна только в серверной версии ТестОпс.
LDAP — популярный протокол для поиска учетных записей пользователей на специальном сервере, таком как Active Directory или OpenLDAP. Если вы настроите ТестОпс для работы с LDAP-сервером, пользователи смогут использовать свои существующие учетные записи и не регистрировать новые в самом ТестОпс.
Важно
Пожалуйста, обратите внимание, что настройка интеграции с LDAP-сервером — сложный процесс. Протокол поддерживает широкий диапазон запросов и имен параметров, что приводит к значительным различиям между серверами. Поэтому универсального примера конфигурации не существует.
Перед настройкой убедитесь, что вы хорошо понимаете параметры вашего LDAP-сервера, или проконсультируйтесь с коллегой, знакомым с его конфигурацией.
Как это работает
ТестОпс устанавливает соединение с LDAP-сервером, используя служебную учетную запись.
На странице входа пользователь вводит свои учетные данные: имя пользователя (или адрес электронной почты) и пароль.
В зависимости от конфигурации ТестОпс может автоматически преобразовать имя пользователя в нижний регистр.
ТестОпс отправляет запрос на LDAP-сервер, чтобы определить, существует ли указанная учетная запись.
В зависимости от конфигурации для этого запроса может использоваться либо фильтр поиска, либо шаблоны DN. Обратите внимание, что эти два варианта взаимоисключающие и вы не должны настраивать их одновременно.
Если учетная запись найдена, LDAP-сервер передает ТестОпс информацию о пользователе, включая уникальный идентификатор (UID) и группы, к которым пользователь принадлежит. После этого ТестОпс ищет внутреннюю учетную запись, соответствующую указанному UID. Если такой записи не существует, ТестОпс создает новую запись.
В зависимости от конфигурации ТестОпс может обновить информацию о пользователе данными с LDAP-сервера (имя, электронная почта, роли и аватар).
После успешной аутентификации ТестОпс перенаправляет пользователя на целевую или главную страницу.
Настройка
Важно
Мы настоятельно рекомендуем следующую последовательность настройки LDAP-аутентификации:
- Настройте базовую функциональность — тестовый пользователь должен иметь возможность войти в ТестОпс.
- При необходимости включите синхронизацию ролей с LDAP-группами, чтобы завершить настройку.
Не включайте синхронизацию групп, пока не убедитесь, что пользователь может войти в инстанс ТестОпс.
База и фильтр поиска пользователей
Обязательным шагом настройки LDAP-интеграции является указание параметров поиска учетных записей: базы поиска (Base DN) и фильтра поиска (LDAP search filter). Уточнить значения этих параметров вы можете у администратора вашего LDAP-сервера или с помощью утилиты ldapsearch (см. ниже).
База поиска обычно соответствует доменному имени сервера, к которому дополнительно добавляется категория для сужения области поиска (например, People для поиска пользователей). Готовое значение выглядит примерно следующим образом:
ou=People,dc=example,dc=org
Фильтр поиска используется для выбора тех LDAP-записей, которые нужны приложению. ТестОпс использует для работы идентификатор пользователя, которому предоставляется доступ (обычно это атрибут uid). Готовое значение может выглядеть следующим образом:
(&(objectClass=person)(uid={0}))
Итоговый набор параметров для поиска пользователей может выглядеть следующим образом:
yaml
auth:
ldap:
...
user:
searchBase: ou=People,dc=example,dc=org
searchFilter: (&(objectClass=person)(uid={0}))
Чтобы проверить названия атрибутов на вашем LDAP-сервере, вы можете использовать утилиту ldapsearch:
sh
ldapsearch -x -H <URL> -b <Base DN> -D <Bind DN> -w <Password> <Filter>
где:
- URL — URL-адрес LDAP-сервера (например,
ldap://ldap.example.org:389
); - Base DN — база поиска (например,
dc=example,dc=org
); - Bind DN — DN пользователя, от имени которого будет совершен запрос (например,
cn=admin,dc=example,dc=org
); - Password — пароль пользователя, от имени которого будет совершен запрос;
- Filter — фильтр поиска. Например, чтобы найти пользователя с фамилией Иванов, можно использовать фильтр
(cn=*Иванов*)
.
Пример:
sh
ldapsearch -x -H "ldap://ldap.example.org:389" -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w "password" "(cn=*Иванов*)"
После выполнения команды вы должны получить подобный результат:
yaml
dn: cn=Иван Иванов,ou=People,dc=example,dc=org
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: person
cn: Иван Иванов
givenName: Иван
sn: Иванов
mail: [email protected]
uid: ivan
На основе этого результата вы можете получить значения для параметров поиска:
dn: cn=Иван Иванов,ou=People,dc=example,dc=org
,В качестве базы для поиска пользователей в файлах конфигурации укажите
ou=People,dc=example,dc=org
.objectClass: person
иuid: ivan
.Учетные записи пользователей имеют атрибут objectClass со значением person, а идентификатор пользователя хранится в атрибуте uid. Поэтому в качестве фильтра укажите
(&(objectClass=person)(uid={0}))
.
Автоматическое назначение ролей
После получения информации о пользователе от LDAP-сервера ТестОпс создает новую учетную запись с ролью по умолчанию, указанной в конфигурационном файле. Мы рекомендуем использовать для этого роль «Гость». Пользователи с ролью «Гость» не учитываются при подсчете пользователей для условий вашего тарифного плана, поэтому вы не рискуете случайно превысить этот лимит. Вы можете изменить роль пользователя в любое время в разделе Администрирование.
yaml
auth:
defaultRole: ROLE_GUEST
При использовании LDAP-аутентификации вы можете дополнительно настроить автоматическое назначение ролей. В таком случае пользователям будут назначаться роли в соответствии с их LDAP-группами. Для этого вам нужно указать в конфигурационном файле параметры поиска групп по аналогии с параметрами поиска пользователей и указать названия LDAP-групп, которые будут использоваться для назначения ролей.
База и фильтр поиска групп
Чтобы настроить поиск LDAP-групп:
Укажите название категории (organizational unit), которая используется для групп на вашем LDAP-сервере (например, Groups).
Пример значения для конфигурационного файла:
ou=Groups,dc=example,dc=org
.Укажите название атрибута, который используется для хранения идентификаторов пользователей, входящих в группу (например, memberUid).
Пример значения для конфигурационного файла:
memberUid={1}
.Важно
Обратите внимание, что memberUid является примером. В вашей реализации этот параметр, скорее всего, будет иметь другое имя.
Итоговый набор параметров для поиска групп может выглядеть следующим образом:
yaml
auth:
ldap:
...
group:
searchBase: ou=Groups,dc=example,dc=org
searchFilter: memberUid={1}
Чтобы проверить названия атрибутов на вашем LDAP-сервере, вы можете использовать утилиту ldapsearch:
sh
ldapsearch -x -H <URL> -b <Base DN> -D <Bind DN> -w <Password> <Filter>
где:
- URL — URL-адрес LDAP-сервера (например,
ldap://ldap.example.org:389
); - Base DN — база поиска (например,
dc=example,dc=org
); - Bind DN — DN пользователя, от имени которого будет совершен запрос (например,
cn=admin,dc=example,dc=org
); - Password — пароль пользователя, от имени которого будет совершен запрос;
- Filter — фильтр поиска. Например, чтобы найти группу admins, можно использовать фильтр
(cn=admins)
.
Пример:
sh
ldapsearch -x -H "ldap://ldap.example.org:389" -b "dc=example,dc=org" -D "cn=admin,dc=example,dc=org" -w "password" "(cn=admins)"
После выполнения команды вы должны получить подобный результат:
yaml
dn: cn=admins,ou=Groups,dc=example,dc=org
objectClass: posixGroup
objectClass: top
cn: admins
memberUid: admin
memberUid: ivan
На основе этого результата вы можете получить значения для параметров поиска:
dn: cn=admins,ou=Groups,dc=example,dc=org
,В качестве базы для поиска групп в файлах конфигурации укажите
ou=Groups,dc=example,dc=org
.memberUid: ivan
.Для хранения идентификаторов пользователей, входящих в группу, используется атрибут memberUid. Поэтому в файлах конфигурации укажите фильтр
memberUid={1}
.
Сопоставление LDAP-групп и ролей ТестОпс
После настройки параметров поиска групп, вам необходимо указать LDAP-группы, которые будут использоваться для автоматического назначения ролей. Для этого перечислите их названия через запятую в соответствующих параметрах конфигурационного файла:
yaml
# LDAP-группы, участникам которых будет назначена роль «Пользователь»
userGroupName: testops_users1,testops_users2
# LDAP-группы, участникам которых будет назначена роль «Администратор»
adminGroupName: testops_admins
Только после того как вы проверили все указанные параметры, мы рекомендуем включить автоматическое назначение ролей. Для этого установите для параметра syncRoles значение true:
yaml
auth:
ldap:
...
syncRoles: true
Изменение файлов конфигурации
Отредактируйте параметры в файле values.yaml:
подключение к LDAP-серверу:
auth.ldap.enabled
— должно быть true;auth.ldap.url
— URL-адрес LDAP-сервера;auth.ldap.auth.user
— имя служебной учетной записи;auth.ldap.auth.pass
— пароль служебной учетной записи.
названия атрибутов LDAP:
auth.ldap.uidAttribute
— название атрибута, который хранит UID пользователя;auth.ldap.passwordAttribute
— название атрибута, который хранит пароль пользователя;auth.ldap.usernamesToLowercase
— если true, имя пользователя будет преобразовано в нижний регистр перед поиском;auth.ldap.group.roleAttribute
— название атрибута, который хранит название группы.
сопоставление групп:
auth.ldap.syncRoles
— если true, ТестОпс будет назначать пользователям роли в соответствии с их группами на LDAP-сервере;auth.ldap.userGroupName
— список групп LDAP, разделенных запятыми, которые соответствуют роли «Пользователь» в ТестОпс;auth.ldap.adminGroupName
— список групп LDAP, разделенных запятыми, которые соответствуют роли «Администратор» в ТестОпс;auth.defaultRole
— роль ТестОпс, которая должна использоваться для пользователей LDAP, которые не принадлежат ролям «Пользователь» и «Администратор».Допустимые значения: ROLE_ADMIN, ROLE_USER, ROLE_GUEST.
При
auth.ldap.syncRoles: true
этот параметр должен иметь значение ROLE_GUEST.
параметры поиска пользователей:
auth.ldap.user.searchBase
— база поиска пользователей;auth.ldap.user.searchFilter
— фильтр для поиска пользователей;auth.ldap.user.dnPatterns
— список шаблонов, разделенных запятыми, для поиска пользователей.Важно
Не указывайте параметры
searchFilter
иdnPatterns
одновременно.
параметры поиска групп:
auth.ldap.group.searchBase
— база поиска групп;auth.ldap.group.searchFilter
— фильтр для поиска групп.
Примеры
yaml
auth:
primary: ldap
defaultRole: ROLE_GUEST
ldap:
enabled: false
auth:
user: user
pass: SecretPaSSw0rd
referral: follow
url: ldap://ldap.example.com:389
usernamesToLowercase: false
passwordAttribute: userPassword
user:
dnPatterns: ""
searchBase: ou=People,dc=example,dc=org
searchFilter: (&(objectClass=person)(uid={0}))
syncRoles: false
uidAttribute: uid
group:
searchBase: ou=Groups,dc=example,dc=org
searchFilter: memberUid={1}
roleAttribute: cn
userGroupName: testops_users
adminGroupName: testops_admins
Тестирование с помощью ldapsearch
Перед перезапуском ТестОпс с новыми параметрами настоятельно рекомендуем проверить их вручную с помощью утилиты ldapsearch. В зависимости от операционной системы утилита может входить в состав пакетов ldap-utils или ldap-clients.
После установки утилиты попробуйте найти пользователя на LDAP-сервере по его UID:
sh
ldapsearch \
-H 'ldap://ldap.example.com:389' \
-D 'cn=admin,dc=example,dc=com' \
-w 'SecretPa$$w0rd' \
-b 'dc=example,dc=com' \
'(&(objectClass=person)(uid=ivan))'
Аргументы соответствуют следующим параметрам конфигурации:
- -H —
auth.ldap.url
, - -D —
auth.ldap.auth.user
, - -w —
auth.ldap.auth.pass
, - -b —
auth.ldap.user.searchBase
, - запрос —
auth.ldap.user.searchFilter
илиauth.ldap.user.dnPatterns
с именем пользователя вместо{0}
.
Использование LDAP вместе со стандартной аутентификацией
Как правило, когда компания настраивает аутентификацию LDAP для ТестОпс, LDAP-сервер считается первоисточником данных об учетных записях пользователей и LDAP устанавливается как основной способ аутентификации. Однако могут возникнуть ситуации, когда вам нужно использовать локальную аутентификацию, например, когда вы хотите войти как администратор инстанса. Для таких случаев ТестОпс позволяет использовать системную аутентификацию, когда LDAP включен как основной способ аутентификации:
- Страница
/login
использует метод аутентификации, установленный в настройках какprimary
. Для данной инструкции это LDAP. - Страница
/login/system
всегда использует системную аутентификацию.
Чтобы войти как администратор инстанса, перейдите на https://<URL>/login/system
и используйте учетные данные локального пользователя.
Устранение неполадок
Если вы получаете ошибку "Request failed with status code 401" при попытке входа с использованием LDAP, проверьте следующее:
- Убедитесь, что URL-адрес LDAP-сервера, указанный в файле конфигурации, правильный.
- Убедитесь, что вы используете действительный SSL-сертификат.
- Проверьте, что учетные данные, указанные в файле конфигурации, правильные и не содержат пробела в конце (например, для Docker Compose это
LDAP_LOGIN_SA
иLDAP_LOGIN_SA_PASS
).