LDAP configuration: Difference between revisions
Chernykov sv (talk | contribs) No edit summary |
(add 'servers ...' to config example) |
||
(13 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
==== Общий принцип аутентификации ==== | ==== Общий принцип аутентификации ==== | ||
Схема аутентификации с помощью протокола LDAP следующая: | Схема аутентификации с помощью протокола LDAP следующая: | ||
Line 22: | Line 21: | ||
Запуск сервера с поддержкой LDAP осуществляется командой: | Запуск сервера с поддержкой LDAP осуществляется командой: | ||
svacer server --ldap ldap.json | svacer-server run --ldap ldap.json | ||
При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. | При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. В логах сервера должна появится информация о добавлении сервера вида: "LDAP Server added: xxxx". | ||
После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP. | После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP ([[Help:UI manual#Авторизация в пользовательском интерфейсе сервера Svacer|Авторизация]]). | ||
Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка. | Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка. | ||
При нажатии на кнопку '''Details''' появляется более подробная информация о сервере и его доступности (параметр '''Alive'''). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. | При нажатии на кнопку '''Details''' появляется более подробная информация о сервере и его доступности (параметр '''Alive'''). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. | ||
Line 39: | Line 35: | ||
Пример: | Пример: | ||
svacer server --ldap ldap.json --disable-svacer-auth | svacer-server run --ldap ldap.json --disable-svacer-auth | ||
==== Конфигурационный файл сервера для поддержки LDAP ==== | ==== Конфигурационный файл сервера для поддержки LDAP ==== | ||
Line 114: | Line 110: | ||
В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации. | В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации. | ||
* name — произвольное имя (уникальное для каждого сервера) | * name — произвольное имя (уникальное для каждого сервера) | ||
* trace — флаг, позволяющий получить детальную информацию по этапам обработки запроса на вход пользователя LDAP в Svacer | |||
* basedn — DN относительно которого будут проводится все операции в LDAP каталоге | * basedn — DN относительно которого будут проводится все операции в LDAP каталоге | ||
* useGroup — проверять ли принадлежность пользователя к группе | * useGroup — проверять ли принадлежность пользователя к группе | ||
Line 121: | Line 118: | ||
:* url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636) | :* url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636) | ||
:* mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL | :* mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL | ||
:* connectAs — имя пользователя в формате DN, | :* connectAs — имя пользователя в формате DN, от которого будут производится операции в LDAP каталоге | ||
:* password — пароль пользователя | :* password — пароль пользователя | ||
:* ignoreCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles | :* ignoreCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles | ||
Line 128: | Line 125: | ||
:* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы | :* basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы | ||
:* filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп | :* filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп | ||
:* userMember — атрибут | :* userMember — атрибут, содержащий пользователей группы | ||
:* display — атрибут, содержащий имя группы для отображения | :* display — атрибут, содержащий имя группы для отображения | ||
:* svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем | :* svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем | ||
Line 135: | Line 132: | ||
:* filter — фильтр, используемый при поиске пользователей | :* filter — фильтр, используемый при поиске пользователей | ||
:* login — атрибут, в котором находится login пользователя | :* login — атрибут, в котором находится login пользователя | ||
:* group — атрибут | :* group — атрибут, на который ссылается атрибут group.userMember (обычно это «dn» пользователя) | ||
:* defaultRole — роль Svacer, автоматически добавляемая всем пользователям LDAP, успешно вошедшим в Svacer | |||
:* info — подсекция описывающая в каких атрибутах находится информация о пользователе | :* info — подсекция описывающая в каких атрибутах находится информация о пользователе | ||
::* display — атрибут, содержащий полное имя пользователя для отображения (ФИО) | ::* display — атрибут, содержащий полное имя пользователя для отображения (ФИО) | ||
Line 143: | Line 141: | ||
* enabled — использовать или нет данный сервер | * enabled — использовать или нет данный сервер | ||
[[ | [[LDAP configuration|Подробное описание взаимодействия SVACER с LDAP сервером]] | ||
Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше | Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше | ||
Line 155: | Line 153: | ||
:# Производится поиск пользователя в LDAP каталоге со следующими параметрами: | :# Производится поиск пользователя в LDAP каталоге со следующими параметрами: | ||
:#* строка запроса: (&(sAMAccountName=ivanov_ii)((&(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла | :#* строка запроса: (&(sAMAccountName=ivanov_ii)((&(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла | ||
:#*начальный узел, с которого будет произведен поиск: cn=users, dc=domain,dc=home,dc=org | :#*начальный узел, с которого будет произведен поиск: cn=users,dc=domain,dc=home,dc=org | ||
:#*поиск производится по всему поддереву | :#*поиск производится по всему поддереву | ||
:# Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой | :# Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой | ||
Line 163: | Line 161: | ||
:#**начальный узел: cn=users,dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла | :#**начальный узел: cn=users,dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла | ||
:#**поиск производится по всему поддереву | :#**поиск производится по всему поддереву | ||
:#**определяется список пользователей группы | :#**определяется список пользователей группы, каждому пользователю соответствует значение атрибута с именем member (взято из поля group.userMember конфиг файла) | ||
:#* Если ни одной группы не найдено, то процесс входа завершается с ошибкой | :#* Если ни одной группы не найдено, то процесс входа завершается с ошибкой | ||
:#*Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе. | :#*Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе. | ||
Line 175: | Line 173: | ||
==== Привязка группы LDAP к роли Svacer ==== | ==== Привязка группы LDAP к роли Svacer ==== | ||
Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия: | Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия: | ||
:* Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins,ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer | :* Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins,ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer | ||
:* Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins,ou=svacer,dc=example,dc=com) | :* Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins,ou=svacer,dc=example,dc=com) | ||
:* Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins | :* Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins | ||
Line 189: | Line 187: | ||
Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет "оценить" получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false. | Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет "оценить" получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false. | ||
Автоматическое назначение пользователю LDAP некоторой роли также возможно осуществить, указав необходимую роль в параметре '''user.defaultRole''' конфигурационного файла LDAP. Данная роль будет назначена в том случае, если она существует на момент входа пользователя в систему. Добавление роли будет происходить при каждом входе пользователя в систему. Поэтому даже если у пользователя эту роль удалить явно, она все равно будет добавлена пользователю при следующем входе. Данный механизм назначения роли работает независимо от настройки привязки роли к группе LDAP. | |||
==== Использование CLI сервера Svacer с поддержкой LDAP ==== | ==== Использование CLI сервера Svacer с поддержкой LDAP ==== | ||
Line 207: | Line 207: | ||
==== Обновление данных LDAP пользователей ==== | ==== Обновление данных LDAP пользователей ==== | ||
Для каждого LDAP пользователя создается соответствующая ему запись в БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты. Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. | Для каждого LDAP пользователя создается соответствующая ему запись в БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты. Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. | ||
Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку '''Load from LDAP'''. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера. | Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку '''Load from LDAP'''. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера (см. раздел [[Help:UI manual#Управление пользователями|Управление пользователями]]). | ||
[[ | |||
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''updateUsers''' команды '''ldap'''. Общий синтаксис команды выглядит следующим образом: | Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''updateUsers''' команды '''ldap'''. Общий синтаксис команды выглядит следующим образом: | ||
Line 235: | Line 233: | ||
* Использовать следующий шаблон конфигурации, заменив текст, выделенный жирным, актуальными данными | * Использовать следующий шаблон конфигурации, заменив текст, выделенный жирным, актуальными данными | ||
{ | { | ||
"name": "test_ldap", | "servers": [ | ||
{ | |||
"name": "test_ldap", | |||
"basedn": '''"dc=example,dc=com"''', | |||
"connection": { | |||
"url": '''"ldap://ldap1.example.com:389"''', | |||
"connectAs": '''"cn=admin,dc=example,dc=com"''', | |||
"password": '''"12345678"''' | |||
}, | |||
"user": { | |||
"basedn": '''"ou=users"''', | |||
"filter": '''"(&(objectClass=PosixAccount)(cn=*))"''', | |||
"login": '''"cn"''', | |||
"info": { | |||
"display": "cn", | |||
"email": "mail", | |||
"firstName": "givenName", | |||
"lastName": "sn" | |||
} | |||
}, | |||
"enabled": true | |||
} | } | ||
] | |||
} | } | ||
Line 260: | Line 262: | ||
2023-04-24T12:35:44.650+0300 info Loading ldap configuration from file: ldap2.json | 2023-04-24T12:35:44.650+0300 info Loading ldap configuration from file: ldap2.json | ||
2023-04-24T12:35:44.650+0300 info LDAP server added: test_ldap | 2023-04-24T12:35:44.650+0300 info LDAP server added: test_ldap | ||
* Выполнить команду | * Выполнить команду, заменив хост и порт актуальными значениями | ||
svacer ldap servers --host 127.0.0.1 --port 8080 | |||
* Убедиться, что в выводе команды присутствуют записи вида: | * Убедиться, что в выводе команды присутствуют записи вида: | ||
Available LDAP servers list: | Available LDAP servers list: | ||
Line 322: | Line 324: | ||
} | } | ||
* Убедиться, что пользователю назначаются роли, выполнив команду в cli (требуются учетные данные администратора для проверки; по умолчанию admin / admin). Для проверки привязки ролей Svacer к пользователю | * Убедиться, что пользователю назначаются роли, выполнив команду в cli (требуются учетные данные администратора для проверки; по умолчанию admin / admin). Для проверки привязки ролей Svacer к пользователю loginok можно использовать следующую команду: | ||
svacer ldap sync_roles --login loginok --host 127.0.0.1 --port 8080 --user admin --password admin --server test_ldap | |||
Вывод должен быть следующий: | Вывод должен быть следующий: | ||
SvacerUserID: 457039b4-4aef-4857-831d-1c080ea154d4 | SvacerUserID: 457039b4-4aef-4857-831d-1c080ea154d4 | ||
Line 329: | Line 331: | ||
LDAPUserDN: cn=loginok,ou=users,dc=example,dc=com | LDAPUserDN: cn=loginok,ou=users,dc=example,dc=com | ||
Roles: [314e7571-706c-4463-9280-6a4eee03b42d] | Roles: [314e7571-706c-4463-9280-6a4eee03b42d] | ||
Links: [cn=admins,ou=svacer_groups,ou=groups,dc=example,dc=com -> admins | Links: [cn=admins,ou=svacer_groups,ou=groups,dc=example,dc=com -> admins (314e7571-706c-4463-9280-6a4eee03b42d)] | ||
Applied: false | Applied: false | ||
Line 351: | Line 353: | ||
* Убедиться, что возможен вход пользователем LDAP. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками | * Убедиться, что возможен вход пользователем LDAP. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками | ||
* Для проверки сертификата LDAP сервера добавить сертификат CA (например ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл: | * Для проверки сертификата LDAP сервера добавить сертификат CA (например, ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл: | ||
{ | { | ||
"name": "test_ldap", | "name": "test_ldap", | ||
Line 400: | Line 402: | ||
==== Возможные ошибки конфигурации ==== | ==== Возможные ошибки конфигурации ==== | ||
В случае ошибки входа пользователя в систему сервер выводит текстовые сообщения, указывающие на причину ошибки. Наиболее полную информацию об ошибке можно видеть, использовав флаг <code>--debug</code> при запуске сервера Svacer. Логи сервера можно посмотреть в GUI Svacer из под пользователя с правами администратора в разделе '''Settings | В случае ошибки входа пользователя в систему сервер выводит текстовые сообщения, указывающие на причину ошибки. Наиболее полную информацию об ошибке можно видеть, использовав флаг <code>--debug</code> при запуске сервера Svacer. Логи сервера можно посмотреть в GUI Svacer из под пользователя с правами администратора в разделе '''Settings > Server information'''. Ниже приводится таблица с перечислением возможных ошибок входа пользователя LDAP в систему. | ||
'''Сообщения об ошибках и их возможные причины''' | '''Сообщения об ошибках и их возможные причины''' | ||
Line 419: | Line 421: | ||
| Запуск сервера || caCert source [%v] ignored || Ошибка поиска сертификатов по указанному шаблону || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными | | Запуск сервера || caCert source [%v] ignored || Ошибка поиска сертификатов по указанному шаблону || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными | ||
|- | |- | ||
|Запуск сервера || Server [%v] configuration has ignoreCertCheck=false, but no CA certs added. In this case LDAP auth may be | |Запуск сервера || Server [%v] configuration has ignoreCertCheck=false, but no CA certs added. In this case LDAP auth may be impossible || Ошибка конфигурации TLS. В результате обработки значений из поля connection.CaCertFiles не было добавлено ни одного сертификата. Это приводит к тому, что Svacer не может проверить сертификат LDAP сервера, а флаг ignoreCertCheck указан в значении false, что приведет к заведомо ошибочной проверке пользователя || Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными | ||
|} | |} | ||
Для определения проблем с входом пользователей LDAP в систему при первоначальной настройке интеграции, полезно установить флаг trace в значение true. Результатом станет вывод в лог сервера Debug сообщения с указанием этапа обработки запроса и его параметров. |
Latest revision as of 14:38, 1 August 2024
Общий принцип аутентификации
Схема аутентификации с помощью протокола LDAP следующая:
- Сервер запускается с указанием конфигурационного файла с настройками для LDAP аутентификации
- В форме аутентификации пользователь выбирает нужный тип аутентификации (svacer или LDAP)
- При выборе аутентификации LDAP, после заполнения необходимых параметров, запрос на аутентификацию отправляется на сервер Svacer
- Сервер Svacer, используя настройки из конфигурационного файла, обращается к внешнему LDAP серверу и проводит проверку пользователя
- В случае успешной аутентификации, в БД сервера Svacer создается запись (если ее еще нет) для пользователя, чтобы можно было управлять ролями данного пользователя
- Сервер возвращает токен безопасности для дальнейшей работы, аналогичный токену, возвращаемому при аутентификации локальных пользователей
Для каждого пользователя, успешно прошедшего проверку на LDAP сервере, создается локальная запись в БД Svacer. Управлять таким пользователем можно как и обычным пользователем, за исключением:
- Пользователю нельзя сменить пароль
- Пользователь не может сменить пароль самостоятельно
- В случае отсутствия связи между сервером Svacer и сервером LDAP, данный пользователь не сможет зайти в систему
Запуск сервера с поддержкой LDAP
Сервер может быть запущен как в с поддержкой аутентификации через LDAP, так и без. Для того, чтобы включить аутентификацию через LDAP необходимо указать конфигурационный файл. Типовой пример конфигурационного файла для подключения к контроллеру домена MS ActiveDirectory или серверу openLDAP можно получить с помощью команды:
svacer ldap print
Запуск сервера с поддержкой LDAP осуществляется командой:
svacer-server run --ldap ldap.json
При запуске сервер svacer формирует список доступных для LDAP аутентификации серверов и выводит соответствующее сообщение. В логах сервера должна появится информация о добавлении сервера вида: "LDAP Server added: xxxx".
После запуска сервера svacer с поддержкой LDAP в GUI становится активна вкладка LDAP (Авторизация).
Для аутентификации с помощью LDAP необходимо выбрать сервер из выпадающего списка.
При нажатии на кнопку Details появляется более подробная информация о сервере и его доступности (параметр Alive). Доступность сервера LDAP проверяется в момент запуска сервера Svacer, при аутентификации пользователя, а также (в случае наличия соответствующего параметра в конфигурационном файле) периодически. В случае конфигурации сервера Svacer с поддержкой LDAP можно отключить возможность аутентификации пользователей встроенными средствами сервера Svacer (вкладка Svacer на странице входа). В этом случае вкладка Svacer на странице входа будет неактивной и пользователи смогут заходить в систему только с помощью LDAP аутентификации. Данное поведение распространяется и на работу с сервером с помощью интерфейса командной строки.
Для отключения возможности аутентификации встроенными средствами сервера Svacer нужно использовать опцию disable-svacer-auth.
Пример:
svacer-server run --ldap ldap.json --disable-svacer-auth
Конфигурационный файл сервера для поддержки LDAP
Типовой пример конфигурации:
{ "servers": [ { "name": "active_directory", "basedn": "dc=domain,dc=home,dc=org", "useGroup": true, "hideURL": true, "checkAlivePeriod": 60, "connection": { "url": "ldaps://192.168.11.71:636", "mirrors":["ldaps://192.168.11.72:636","ldaps://192.168.11.73:636"] "connectAs": "cn=ldap_service,cn=users,dc=domain,dc=home,dc=org", "password": "12345678", "ignoreCertCheck": false, "caCertFiles":["/etc/ssl/certs/a*","/etc/ssl/certs/my_certs/*"] }, "group": { "basedn": "cn=users", "filter": "(&(objectCategory=Group)(cn=dep_devops))", "userMember": "member", "display":"cn", "svacerRole":"cn" }, "user": { "basedn": "cn=users", "filter": "(&(objectCategory=Person)(sAMAccountName=*))", "login": "sAMAccountName", "group": "dn", "info": { "display": "cn", "email": "email", "firstName": "givenName", "lastName": "sn" } }, "enabled": true }, { "name": "open_ldap", "basedn": "dc=example,dc=com", "useGroup": true, "connection": { "url": "ldap://127.0.0.1:389", "connectAs": "cn=admin,dc=example,dc=com", "password": "12345678" }, "group": { "basedn": "ou=groups", "filter": "(&(objectClass=groupOfNames)(cn=svacer))", "userMember": "member", "display":"cn" }, "user": { "basedn": "ou=users", "filter": "(&(objectClass=PosixAccount))", "login": "uid", "group": "dn", "info": { "display": "dn", "email": "mail", "firstName": "givenName", "lastName": "sn" } }, "enabled": true } ] }
В конфигурации можно указать несколько серверов. Все сервера в совокупности рассматриваются как единый источник проверки пользователей. То есть если на двух серверах будут два пользователя с одинаковым логином, они будут считаться идентичными. Ниже приводится описание параметров конфигурации.
- name — произвольное имя (уникальное для каждого сервера)
- trace — флаг, позволяющий получить детальную информацию по этапам обработки запроса на вход пользователя LDAP в Svacer
- basedn — DN относительно которого будут проводится все операции в LDAP каталоге
- useGroup — проверять ли принадлежность пользователя к группе
- hideURL — не передавать сетевой адрес LDAP сервера. Конечные пользователи будут видеть в выпадающем списке только имя сервера, указанное в поле name. В поле URL будет пустая строка
- checkAlivePeriod — Промежуток времени в секундах, который должен проходить между периодическими проверками доступности сервера LDAP. Если параметр равен 0 или не указан, такая проверка не проводится.
- connection — подсекция, описывающая параметры соединения с сервером
- url — адрес сервера, формата: ldap[s]://domain:port В случае использования TLS для подключения к LDAP серверу, необходимо указать правильный порт (по умолчанию 636)
- mirrors — список хостов, которые будут использованы в случае недоступности основного хоста, указанного в поле URL. Формат указания хостов тот же, что и в поле URL. Префикс ldap[s] должен быть одинаковым для всех хостов и совпадать с префиксом в поле URL
- connectAs — имя пользователя в формате DN, от которого будут производится операции в LDAP каталоге
- password — пароль пользователя
- ignoreCheck — не проверять сертификат в случае ldaps:// соединения. Полезно при самоподписанных сертификатах. Если флаг установлен в значение false, необходимо установить значение поля caCertFiles
- CaCertFiles — массив значений, описывающих какие файлы корневых сертификатов добавлять в конфигурацию Svacer. Формат файлов сертификатов — PEM
- group — подсекция, описывает параметры проверки принадлежности пользователя к группе
- basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы
- filter — фильтр, используемый при поиске группы. Необходимо, если надо указать несколько групп
- userMember — атрибут, содержащий пользователей группы
- display — атрибут, содержащий имя группы для отображения
- svacerRole — атрибут, из которого будет извлечено имя роли, созданной в Svacer, и автоматически сопоставляемой с пользователем
- user — подсекция, описывает параметры получения информации о пользователе
- basedn — RDN, добавляемая к общей DN. Относительно этого DN производится поиск группы
- filter — фильтр, используемый при поиске пользователей
- login — атрибут, в котором находится login пользователя
- group — атрибут, на который ссылается атрибут group.userMember (обычно это «dn» пользователя)
- defaultRole — роль Svacer, автоматически добавляемая всем пользователям LDAP, успешно вошедшим в Svacer
- info — подсекция описывающая в каких атрибутах находится информация о пользователе
- display — атрибут, содержащий полное имя пользователя для отображения (ФИО)
- email — атрибут с почтовым адресом
- firstName — атрибут с именем
- lastName — атрибут с фамилией
- enabled — использовать или нет данный сервер
Подробное описание взаимодействия SVACER с LDAP сервером
Рассмотрим пример обработки запроса на вход в систему LDAP пользователя, указавшего значение ivanov_ii в поле логина и выбравшего конфигурацию active_directory из примера выше
- Svacer создает служебное подключение к хосту 192.168.11.71 со следующими параметрами
- используется TLS соединение (ldaps префикс)
- порт 636
- проверяется сертификат LDAP сервера (ignoreCertCheck = false); для проверки используются сертификаты CA (из папки /etc/ssl/certs — все сертификаты, начинающиеся с буквы a; из папки /etc/ssl/certs/my_certs/ — все сертификаты)
- логин для подключения к LDAP серверу: "cn=ldap_service,cn=users,dc=domain,dc=home,dc=org" (connectAs); пароль: 12345678 (password)
- Если подключение к хосту невозможно (хост недоступен), то пробуются хосты 192.168.11.72,192.168.11.73 с параметрами, аналогичными параметрам пункта 1
- Если подключение невозможно, процесс входа завершается с ошибкой
- Производится поиск пользователя в LDAP каталоге со следующими параметрами:
- строка запроса: (&(sAMAccountName=ivanov_ii)((&(objectCategory=Person)(sAMAccountName=*)))), sAMAccountName — взят из поля user.login конфиг файла; ivanov_ii — введено пользователем; (&(objectCategory=Person)(sAMAccountName=*)) — взято из поля user.filter конфиг файла
- начальный узел, с которого будет произведен поиск: cn=users,dc=domain,dc=home,dc=org
- поиск производится по всему поддереву
- Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой
- Флаг useGroup = true, поэтому производится дополнительная проверка группы пользователя
- выполняется поиск групп в каталоге LDAP со следующими параметрами:
- строка запроса: (&(objectCategory=Group)(cn=dep_devops)) — взято из поля group.filter
- начальный узел: cn=users,dc=domain,dc=home,dc=org, где cn=users — взято из поля group.basedn; значение dc=domain,dc=home,dc=org — взято из поля basedn конфиг файла
- поиск производится по всему поддереву
- определяется список пользователей группы, каждому пользователю соответствует значение атрибута с именем member (взято из поля group.userMember конфиг файла)
- Если ни одной группы не найдено, то процесс входа завершается с ошибкой
- Определяются группы, в которые входит пользователь. Для этого для каждой группы, найденной в пункте выше, просматривается список пользователей и ищется значение cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org (в поле user.group конфиг файла указано значение dn, что означает, что необходимо использовать DN пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе.
- Если пользователь не принадлежит ни к одной группе, процесс входа завершается с ошибкой
- выполняется поиск групп в каталоге LDAP со следующими параметрами:
- Производится попытка подключения к хосту LDAP с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа)
- Если подключение не удалось создать, то процесс входа завершается с ошибкой
- Процесс аутентификации пользователя произведен успешно
- Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет
- Так как useGroup = true и указан атрибут svacerRole с непустым значением, то производится привязка ролей Savcer пользователя на основе его участия в группах LDAP (смотри соответствующий пункт)
- Svacer создает служебное подключение к хосту 192.168.11.71 со следующими параметрами
Привязка группы LDAP к роли Svacer
Возможно автоматическое назначение пользователям LDAP ролей Svacer. Для использования данной функции необходимо выполнить следующие предварительные действия:
- Администратор LDAP сервера создает в каталоге LDAP нужные группы (например cn=users,ou=svacer,dc=example,dc=com и cn=admins,ou=svacer,dc=example,dc=com), которые будут привязаны к ролям Svacer
- Администратор LDAP сервера помещает пользователей LDAP в соответствующие LDAP группы (cn=users,ou=svacer,dc=example,dc=com или cn=admins,ou=svacer,dc=example,dc=com)
- Администратор Svacer создает роли в Svacer, имеющие в точности такое же название, как значение атрибута, указанного в поле svacerRole конфигурационного файла. В пример можно использовать аттрибут cn и в этом случае необходимо создать роли users и admins
- Администратор Svacer добавляет в конфигурационный файл в поле svacerRole имя атрибута, по которому будет производится привязка. Для примера выше — строчку svacerRole="cn"
После выполнения данных действий, во время входа пользователя в систему пользователю будут добавлены роли по следующему алгоритму:
- Производится поиск групп, к которым принадлежит пользователь. Поиск производится по параметрам, указанным в секции group конфигурационного файла. Для примера, пользователь может состоять в следующих группах: (cn=users,ou=svacer,dc=example,dc=com), (cn=dep_dev,dc=example,dc=com)
- Для каждой найденной группы, выбирается значение атрибута, указанного в поле svacerRole. В примере — имя атрибута cn. Получаются два имени: users, dep_dev
- Производится поиск ролей Svacer с именем users и dep_dev. Если такие роли найдены, то пользователю они будут добавлены. Так как в примере роль dep_dev не создана, то будет добавлена только роль users.
Удаление ролей автоматически не производится. Вместо этого предлагается ручного режим синхронизации ролей пользователя. Для синхронизации ролей с текущими группами, в которых состоит пользователь, используется команда cli
svacer ldap sync_roles --login [user_login] --server [server_name] --apply
Данная команда проверит наличие пользователя user_login в соответствующей роли группе LDAP и если его в группе не будет, уберет роль у пользователя. Также команда добавит недостающие роли, на основе механизма, описанного выше (при входе пользователя). Флаг apply позволяет "оценить" получаемые изменения прежде чем они будут применены. По умолчанию флаг apply = false.
Автоматическое назначение пользователю LDAP некоторой роли также возможно осуществить, указав необходимую роль в параметре user.defaultRole конфигурационного файла LDAP. Данная роль будет назначена в том случае, если она существует на момент входа пользователя в систему. Добавление роли будет происходить при каждом входе пользователя в систему. Поэтому даже если у пользователя эту роль удалить явно, она все равно будет добавлена пользователю при следующем входе. Данный механизм назначения роли работает независимо от настройки привязки роли к группе LDAP.
Использование CLI сервера Svacer с поддержкой LDAP
Для выполнения некоторых действий в cli с помощью команды svacer требуется аутентификация пользователя. Для аутентификации с помощью ldap сервера необходимо указать в команде кроме имени пользователя и пароля имя сервера с помощью флага ldap_server (имя сервера регистр-зависимо). Например:
svacer quickdiff --user loginok --password loginok --ldap_server openLDAP2 --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140
Если флаг ldap_server не указан, аутентификация производится механизмами сервера svacer, как и в предыдущих версиях. Параметр ldap_server можно опустить, указав сервер в переменной окружения SVACER_LDAP_SERVER. Например:
SVACER_LDAP_SERVER="openLDAP2" svacer quickdiff --user loginok --password loginok --project zstd --branch zstd_14 --snapshot_v1 v1.4.1 --snapshot_v2 zstd_140
Для получения списка поддерживаемых свейсером LDAP серверов используйте команду:
svacer ldap servers --host 127.0.0.1 --port 8080
Вывод содержит два столбца (имя и URL сервера). В качестве значения для параметра ldap_server необходимо использовать содержимое первого столбца.
Обновление данных LDAP пользователей
Для каждого LDAP пользователя создается соответствующая ему запись в БД Svacer, в которую включается ФИО из LDAP и адрес его электронной почты. Через какое-то время данные пользователей могут меняться, в этом случае возможно обновить данные LDAP пользователей, хранящиеся в Svacer, синхронизировав их с данными LDAP сервера. Для обновления данных одного пользователя можно воспользоваться окном редактирования пользователя, в котором можно нажать кнопку Load from LDAP. В соответствующие окна будут добавлены данные, загруженные из LDAP сервера (см. раздел Управление пользователями).
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду updateUsers команды ldap. Общий синтаксис команды выглядит следующим образом:
svacer ldap updateUsers --onlyEmpty
Флаг onlyEmpty позволяет обновлять только пустые поля ФИО и eMail. Заполненные поля не будут изменены. Команда обновит данные всех пользователей, записи о которых имеются в базе Svacer.
Пример конфигурации сервера Svacer для поддержки аутентификации по LDAP протоколу
Для упрощения настройки интеграции с LDAP сервером, процесс настройки можно разбить на этапы и переходить к следующему только если успешно завершен предыдущий этап. В первую очередь необходимо выяснить актуальные параметры подключения к ldap серверу:
- URL; Например ldap://10.11.12.13:389 или ldaps://10.11.12.13:636
- Учетные данные с которыми будет осуществляться подключение к LDAP серверу при каждой попытке входа пользователем; Например, login: cn=admin,dc=example,dc=com, пароль: 12345678
- Определиться с корнем LDAP дерева (базовый узел), относительно которого будут выполняться все операции; Например: dc=example,dc=com
- Проверить, что с указанными учетными данными возможно подключение к серверу LDAP и просмотр его содержимого с некоторого узла, расположенного ниже базового; Например, с узла ou=users,dc=example,dc=com для рассматриваемого примера. Проверить можно, например, используя следующую команду:
LDAPTLS_REQCERT=never ldapsearch -v -x -D cn=admin,dc=example,dc=com -w 12345678 -b ou=users,dc=example,dc=com -H ldaps://127.0.0.1:636
- для случая поддержки TLS, или
ldapsearch -v -x -D cn=admin,dc=example,dc=com -w 12345678 -b ou=users,dc=example,dc=com -H ldap://127.0.0.1:389
- для случая без поддержки TLS
- Определиться с атрибутом записи, по которой будет осуществляться вход. Например cn, mail или sAMAccountName
- Если используется Active Directory, целесообразно в качестве фильтра для поиска записей о пользователе указать значение (&(objectCategory=Person)(sAMAccountName=*))
Основные настройки LDAP
- Использовать следующий шаблон конфигурации, заменив текст, выделенный жирным, актуальными данными
{ "servers": [ { "name": "test_ldap", "basedn": "dc=example,dc=com", "connection": { "url": "ldap://ldap1.example.com:389", "connectAs": "cn=admin,dc=example,dc=com", "password": "12345678" }, "user": { "basedn": "ou=users", "filter": "(&(objectClass=PosixAccount)(cn=*))", "login": "cn", "info": { "display": "cn", "email": "mail", "firstName": "givenName", "lastName": "sn" } }, "enabled": true } ] }
- Поиск пользователя в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений user.basedn и basedn. В примере это будет узел ou=users,dc=example,dc=com. Полный DN пользователя указывать в user.basedn не нужно (можно указать пустой или не указывать вообще)
- Убедиться, что при старте сервера в логах присутствуют строки:
2023-04-24T12:35:44.650+0300 info Loading ldap configuration from file: ldap2.json 2023-04-24T12:35:44.650+0300 info LDAP server added: test_ldap
- Выполнить команду, заменив хост и порт актуальными значениями
svacer ldap servers --host 127.0.0.1 --port 8080
- Убедиться, что в выводе команды присутствуют записи вида:
Available LDAP servers list: Name: test_ldap Url: ldap://ldap1.example.com:389
- Убедиться, что возможен вход тестовым пользователем через cli:
curl -X POST --data '{"login":"test_login","password":"test_password","auth_type":"ldap","server":"test_ldap"}' 127.0.0.1:8080/api/public/login
Вывод должен быть вида:
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODI5MzYxODcsImlhdCI6MTY4MjMzMTM4Nywicm9sZXMiOlsiYWRtaW5zIl0sInVzZXIiO ..."}
Добавление проверки по группе LDAP
Принадлежность пользователя к группе определяется следующим образом:
- Формируется список всех возможных групп на основе значения group.filter
- Для каждой сформированной группы формируется список входящих в нее пользователей по следующему принципу:
- Каждое значение атрибута group.userMember (их может быть несколько) узла LDAP (соответствующего группе) однозначно идентифицирует некоторого пользователя
- Пользователь входит в группу, если значение атрибута user.group пользователя входит в множество записей, полученных в пункте выше
Для настройки проверки по группе целесообразно выполнить следующие действия:
- Определиться с узлом в LDAP, относительно которого будет производится поиск групп (поле group.basedn). Поиск групп в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений group.basedn и basedn. В примере это будет узел ou=svacer_groups,ou=groups,dc=example,dc=com
- Для Active Directory в поле filter можно указать, например, (&(objectCategory=Group)(cn=dep_ivanov)), что будет означать группу dep_ivanov.
- Изменить конфигурационный файл следующим образом:
{ "name": "test_ldap", ... }, "user": { ... "group": "dn", }, "useGroup": true, "group": {' "basedn": "ou=svacer_groups,ou=groups", "filter": "(&(objectClass=groupOfNames)(cn=*))", "userMember": "member", "display":"cn", }, "enabled": true }
- Перезапустить Svacer
- Убедиться, что возможен вход пользователей, состоящих в группе/группах, и не возможен вход пользователей, не состоящих в группе/группах.
Добавление привязки ролей Svacer к группам LDAP
- Добавить нужные группы в Svacer. Например admins и users.
- Определиться в каком атрибуте LDAP группы будет хранится имя роли (все сравнения будут чувствительны к регистру). Например, пусть это будет атрибут cn
- Изменить конфигурационный файл следующим образом
{ "name": "test_ldap", ... "user": { ... }, "useGroup": true, "group": { "basedn": "ou=svacer_groups,ou=groups", "filter": "(&(objectClass=groupOfNames)(cn=*))", "userMember": "member", "display": "cn", "svacerRole": "cn" }, "enabled": true }
- Убедиться, что пользователю назначаются роли, выполнив команду в cli (требуются учетные данные администратора для проверки; по умолчанию admin / admin). Для проверки привязки ролей Svacer к пользователю loginok можно использовать следующую команду:
svacer ldap sync_roles --login loginok --host 127.0.0.1 --port 8080 --user admin --password admin --server test_ldap
Вывод должен быть следующий:
SvacerUserID: 457039b4-4aef-4857-831d-1c080ea154d4 SvacerUserLogin: loginok LDAPUserDN: cn=loginok,ou=users,dc=example,dc=com Roles: [314e7571-706c-4463-9280-6a4eee03b42d] Links: [cn=admins,ou=svacer_groups,ou=groups,dc=example,dc=com -> admins (314e7571-706c-4463-9280-6a4eee03b42d)] Applied: false
Добавление серверов LDAP, работающих по TLS
- Изменить конфигурационный файл следующим образом:
{ "name": "test_ldap", "basedn": "dc=example,dc=com", "connection": { "url": "ldaps://ldap1.example.com:636", "connectAs": "cn=admin,dc=example,dc=com", "password": "12345678", "ignoreCertCheck": true }, "user": { ... }, ... "enabled": true }
- Убедиться, что возможен вход пользователем LDAP. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками
- Для проверки сертификата LDAP сервера добавить сертификат CA (например, ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл:
{ "name": "test_ldap", "basedn": "dc=example,dc=com", "connection": { "url": "ldaps://ldap1.example.com:636", "connectAs": "cn=admin,dc=example,dc=com", "password": "12345678", "ignoreCertCheck": false, "caCertFiles": ["/etc/ssl/certs/ldap.crt"] }, "user": { ... }, ... }, "enabled": true }
- Убедиться, что в логах сервера присутствуют записи вида:
2023-04-24T13:49:49.298+0300 info added 1 ca certs from ldap.crt
- Убедиться, что пользователь LDAP может зайти в систему
Добавление резервных серверов LDAP
- Добавить в конфигурационный файл резервные сервера в поле mirrors:
{ "name": "test_ldap", "basedn": "dc=example,dc=com", "connection": { "url": "ldaps://ldap1.example.com:636", "mirrors": ["ldaps://ldap2.example.com:636","ldaps://ldap3.example.com:636"], "connectAs": "cn=admin,dc=example,dc=com", "password": "12345678", ... }, "user": { ... }, ... "enabled": true }
- Проверить, что вход пользователя LDAP в систему возможен
- Изменить значение в URL на любое (чтобы сервер, указанный в URL, был не доступен)
- Перезапустить Svacer
- Убедиться, что вход пользователя LDAP в систему возможен
- Поменять значение в URL на верное
Возможные ошибки конфигурации
В случае ошибки входа пользователя в систему сервер выводит текстовые сообщения, указывающие на причину ошибки. Наиболее полную информацию об ошибке можно видеть, использовав флаг --debug
при запуске сервера Svacer. Логи сервера можно посмотреть в GUI Svacer из под пользователя с правами администратора в разделе Settings > Server information. Ниже приводится таблица с перечислением возможных ошибок входа пользователя LDAP в систему.
Сообщения об ошибках и их возможные причины
Действие | Сообщение | Причина | Решение |
---|---|---|---|
Вход в систему | LDAP server unavailable | 1. Нет соединения с сервером 2. Неверные учетные данные для соединения с сервером |
Проверить доступность сервера LDAP с хоста, на котором установлен Svacer. См. утилиту ldapsearch |
Вход в систему | LDAP user is not in group | Пользователь не состоит в заданной конфигурацией группе/группах | Проверить поля user.group, group.filter, group.userMember. В списке групп, полученных с использованием group.filter должна быть хотя бы одна группа, в которую входит пользователь |
Вход в систему | LDAP group not found. Check configuration | Во время поиска групп, подходящих под фильтр, не найдено ни одной группы | Проверить значение поля group.filter и значения basedn, group.basedn |
Вход в систему | LDAP user not allowed or not found | Во время поиска пользователей, подходящих под фильтр, не найдено ни одного пользователя | Проверить значение поля user.filter и значения basedn, user.basedn |
Вход в систему | too much record for user ('%s') found | Поиск пользователя в LDAP с указанными в конфигурации парамтерами дал несколько записей | Проверить значение поля user.filter и значения basedn, user.basedn. Поиск всегда должен давать одну запись |
Запуск сервера | caCert source [%v] ignored | Ошибка поиска сертификатов по указанному шаблону | Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными |
Запуск сервера | Server [%v] configuration has ignoreCertCheck=false, but no CA certs added. In this case LDAP auth may be impossible | Ошибка конфигурации TLS. В результате обработки значений из поля connection.CaCertFiles не было добавлено ни одного сертификата. Это приводит к тому, что Svacer не может проверить сертификат LDAP сервера, а флаг ignoreCertCheck указан в значении false, что приведет к заведомо ошибочной проверке пользователя | Проверить поле connection.caCertFiles конфигурации и убедится, что по указанному в поле шаблону присутствуют сертификаты и к ним есть доступ (проверить права). Все пути должны быть абсолютными |
Для определения проблем с входом пользователей LDAP в систему при первоначальной настройке интеграции, полезно установить флаг trace в значение true. Результатом станет вывод в лог сервера Debug сообщения с указанием этапа обработки запроса и его параметров.