LDAP configuration: Difference between revisions
Chernykov sv (talk | contribs) No edit summary |
(add 'servers ...' to config example) |
||
(17 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
== | ==== Общий принцип аутентификации ==== | ||
Схема аутентификации с помощью протокола 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 ([[Help:UI manual#Авторизация в пользовательском интерфейсе сервера Svacer|Авторизация]]). | |||
Для аутентификации с помощью 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 — использовать или нет данный сервер | |||
[[LDAP configuration|Подробное описание взаимодействия 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 с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа) | |||
:# Если подключение не удалось создать, то процесс входа завершается с ошибкой | |||
:# Процесс аутентификации пользователя произведен успешно | |||
:# Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет | |||
:# Так как useGroup = true и указан атрибут svacerRole с непустым значением, то производится привязка ролей Savcer пользователя на основе его участия в группах LDAP (смотри соответствующий пункт) | |||
==== Привязка группы 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 сервера (см. раздел [[Help:UI manual#Управление пользователями|Управление пользователями]]). | |||
Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду '''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 | * URL; Например ldap://10.11.12.13:389 или ldaps://10.11.12.13:636 | ||
* Учетные данные с которыми будет осуществляться подключение к LDAP серверу при каждой попытке входа пользователем; Например, login: cn=admin,dc=example,dc=com, пароль: 12345678 | * Учетные данные с которыми будет осуществляться подключение к LDAP серверу при каждой попытке входа пользователем; Например, login: cn=admin,dc=example,dc=com, пароль: 12345678 | ||
* Определиться с корнем LDAP дерева (базовый узел), относительно которого будут выполняться все операции; Например: dc=example,dc=com | * Определиться с корнем LDAP дерева (базовый узел), относительно которого будут выполняться все операции; Например: dc=example,dc=com | ||
* Проверить, что с указанными учетными данными возможно подключение к серверу LDAP и просмотр его содержимого с некоторого узла, расположенного ниже базового; Например, с узла ou=users,dc=example,dc=com для рассматриваемого примера. Проверить можно, например, используя следующую команду: | * Проверить, что с указанными учетными данными возможно подключение к серверу LDAP и просмотр его содержимого с некоторого узла, расположенного ниже базового; Например, с узла ou=users,dc=example,dc=com для рассматриваемого примера. Проверить можно, например, используя следующую команду: | ||
:<pre>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</pre> | |||
для случая поддержки TLS, или | :для случая поддержки TLS, или | ||
:<pre>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</pre> | |||
для случая без поддержки TLS | :для случая без поддержки TLS | ||
* Определиться с атрибутом записи, по которой будет осуществляться вход. Например cn, mail или sAMAccountName | * Определиться с атрибутом записи, по которой будет осуществляться вход. Например cn, mail или sAMAccountName | ||
* Если используется Active Directory, целесообразно в качестве фильтра для поиска записей о пользователе указать значение (&(objectCategory=Person)(sAMAccountName=*)) | * Если используется Active Directory, целесообразно в качестве фильтра для поиска записей о пользователе указать значение (&(objectCategory=Person)(sAMAccountName=*)) | ||
=== Основные настройки LDAP === | ===== Основные настройки 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 не нужно (можно указать пустой или не указывать вообще) | * Поиск пользователя в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений user.basedn и basedn. В примере это будет узел ou=users,dc=example,dc=com. Полный DN пользователя указывать в user.basedn не нужно (можно указать пустой или не указывать вообще) | ||
Line 42: | 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 52: | Line 272: | ||
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODI5MzYxODcsImlhdCI6MTY4MjMzMTM4Nywicm9sZXMiOlsiYWRtaW5zIl0sInVzZXIiO ..."} | {"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2ODI5MzYxODcsImlhdCI6MTY4MjMzMTM4Nywicm9sZXMiOlsiYWRtaW5zIl0sInVzZXIiO ..."} | ||
=== Добавление проверки по группе LDAP === | ===== Добавление проверки по группе LDAP ===== | ||
Принадлежность пользователя к группе определяется следующим образом: | Принадлежность пользователя к группе определяется следующим образом: | ||
* Формируется список всех возможных групп на основе | * Формируется список всех возможных групп на основе значения group.filter | ||
* Для каждой сформированной группы формируется список входящих в нее пользователей по следующему принципу: | * Для каждой сформированной группы формируется список входящих в нее пользователей по следующему принципу: | ||
** Каждое значение атрибута group.userMember (их может быть несколько) узла LDAP (соответствующего группе) однозначно идентифицирует некоторого пользователя | ** Каждое значение атрибута group.userMember (их может быть несколько) узла LDAP (соответствующего группе) однозначно идентифицирует некоторого пользователя | ||
Line 60: | Line 280: | ||
Для настройки проверки по группе целесообразно выполнить следующие действия: | Для настройки проверки по группе целесообразно выполнить следующие действия: | ||
* Определиться с узлом в LDAP, относительно которого будет производится поиск групп (поле group.basedn). Поиск групп в каталоге LDAP будет производится от узла, DN которого является конкатенацией значений group.basedn и basedn. В примере это будет узел ou=svacer_groups,ou=groups,dc=example,dc=com | * Определиться с узлом в 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. | * Для 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 | ||
* Убедиться, что возможен вход пользователей, состоящих в группе/группах, и не возможен вход пользователей, не состоящих в группе/группах. | * Убедиться, что возможен вход пользователей, состоящих в группе/группах, и не возможен вход пользователей, не состоящих в группе/группах. | ||
=== Добавление привязки ролей Svacer к группам LDAP === | ===== Добавление привязки ролей Svacer к группам LDAP ===== | ||
* Добавить нужные группы в Svacer. Например admins и users. | * Добавить нужные группы в Svacer. Например admins и users. | ||
* Определиться в каком атрибуте LDAP группы будет хранится имя роли (все сравнения будут чувствительны к регистру). Например, пусть это будет атрибут cn | * Определиться в каком атрибуте LDAP группы будет хранится имя роли (все сравнения будут чувствительны к регистру). Например, пусть это будет атрибут cn | ||
* Изменить конфигурационный файл следующим образом | * Изменить конфигурационный файл следующим образом | ||
{ | |||
"name": "test_ldap", | "name": "test_ldap", | ||
... | |||
"user": { | "user": { | ||
... | |||
}, | |||
''' "useGroup": true, ''' | |||
''' "group": { ''' | |||
''' "basedn": "ou=svacer_groups,ou=groups", ''' | |||
''' "filter": "(&(objectClass=groupOfNames)(cn=*))", ''' | |||
''' "userMember": "member", ''' | |||
''' "display": "cn", ''' | |||
''' "svacerRole": "cn" ''' | |||
''' }, ''' | |||
"enabled": true | |||
} | |||
* Убедиться, что пользователю назначаются роли, выполнив команду в cli (требуются учетные данные администратора для проверки; по умолчанию admin | |||
* Убедиться, что пользователю назначаются роли, выполнив команду в 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 109: | 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 | ||
=== Добавление серверов LDAP, работающих по TLS === | ===== Добавление серверов 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. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками | ||
* Для проверки сертификата LDAP сервера добавить сертификат CA (например ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл: | * Для проверки сертификата 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 | 2023-04-24T13:49:49.298+0300 info added 1 ca certs from ldap.crt | ||
* Убедиться, что пользователь LDAP может зайти в систему | * Убедиться, что пользователь LDAP может зайти в систему | ||
=== Добавление резервных серверов LDAP === | ===== Добавление резервных серверов LDAP ===== | ||
* Добавить в конфигурационный файл резервные сервера в поле mirrors: | * Добавить в конфигурационный файл резервные сервера в поле 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 в систему возможен | * Проверить, что вход пользователя LDAP в систему возможен | ||
* Изменить значение в URL на любое (чтобы сервер, указанный в URL, был не доступен) | * Изменить значение в URL на любое (чтобы сервер, указанный в URL, был не доступен) | ||
Line 175: | Line 400: | ||
* Убедиться, что вход пользователя LDAP в систему возможен | * Убедиться, что вход пользователя LDAP в систему возможен | ||
* Поменять значение в URL на верное | * Поменять значение в URL на верное | ||
==== Возможные ошибки конфигурации ==== | |||
В случае ошибки входа пользователя в систему сервер выводит текстовые сообщения, указывающие на причину ошибки. Наиболее полную информацию об ошибке можно видеть, использовав флаг <code>--debug</code> при запуске сервера Svacer. Логи сервера можно посмотреть в GUI Svacer из под пользователя с правами администратора в разделе '''Settings > Server information'''. Ниже приводится таблица с перечислением возможных ошибок входа пользователя LDAP в систему. | |||
Сообщения об ошибках и их возможные причины | '''Сообщения об ошибках и их возможные причины''' | ||
{| class="wikitable" style="margin:auto" | {| class="wikitable" style="margin:auto" | ||
|- | |- | ||
!Действие !! Сообщение !! Причина !! Решение | !Действие !! Сообщение !! Причина !! Решение | ||
|- | |- | ||
| Вход в систему || LDAP server unavailable ||1.Нет соединения с сервером | | Вход в систему || LDAP server unavailable || 1. Нет соединения с сервером<br/>2. Неверные учетные данные для соединения с сервером || Проверить доступность сервера LDAP с хоста, на котором установлен Svacer. См. утилиту ldapsearch | ||
|- | |- | ||
| Вход в систему || LDAP user is not in group||Пользователь не состоит в заданной конфигурацией группе/группах||Проверить поля user.group, group.filter | | Вход в систему || LDAP user is not in group||Пользователь не состоит в заданной конфигурацией группе/группах||Проверить поля user.group, group.filter, group.userMember. В списке групп, полученных с использованием group.filter должна быть хотя бы одна группа, в которую входит пользователь | ||
|- | |- | ||
| Вход в систему || LDAP group not found. Check configuration || Во время поиска групп, подходящих под фильтр, не | | Вход в систему || LDAP group not found. Check configuration || Во время поиска групп, подходящих под фильтр, не найдено ни одной группы || Проверить значение поля group.filter и значения basedn, group.basedn | ||
|- | |- | ||
| Вход в систему || LDAP user not allowed or not found || Во время поиска пользователей, подходящих под фильтр, не найдено ни одного пользователя || Проверить значение поля user.filter и значения basedn, user.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. Поиск всегда должен давать одну запись | | Вход в систему || 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 сообщения с указанием этапа обработки запроса и его параметров. |
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 сообщения с указанием этапа обработки запроса и его параметров.