LDAP configuration: Difference between revisions

From Svacer Wiki
No edit summary
(add 'servers ...' to config example)
 
(20 intermediate revisions by 3 users not shown)
Line 1: Line 1:
== Пример конфигурации сервера Svacer для поддержки аутентификации по LDAP протоколу ==
====  Общий принцип аутентификации ====
Схема аутентификации с помощью протокола LDAP следующая:


Для упрощение настройки интеграции с LDAP сервером, процесс настройки можно разбить на этапы и переходить к следующему только если успешно завершен предыдущий этап. В первую очередь необходимо выяснить акутальные параметры подключения к 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 для рассматриваемого примера. Проверить можно, например, используя следующую команду:
  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>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, или  
  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>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 =====
* Использовать следующий шаблон конфигурации, заменив текст, выделенный жирным, акутальными данными:
* Использовать следующий шаблон конфигурации, заменив текст, выделенный жирным, актуальными данными
{
  {
      "name": "test_ldap",
    "servers": [
      "basedn": '''"dc=example,dc=com"''',
      {
      "connection": {
        "name": "test_ldap",
        "url": '''"ldap://ldap1.example.com:389"''',
        "basedn": '''"dc=example,dc=com"''',
        "connectAs": '''"cn=admin,dc=example,dc=com"''',
        "connection": {
        "password": '''"12345678"'''
          "url": '''"ldap://ldap1.example.com:389"''',
      },
          "connectAs": '''"cn=admin,dc=example,dc=com"''',
      "user": {
          "password": '''"12345678"'''
        "basedn": '''"ou=users"''',
        },
        "filter": '''"(&(objectClass=PosixAccount)(cn=*))"''',
        "user": {
        "login": '''"cn"''',
          "basedn": '''"ou=users"''',
        "info": {
          "filter": '''"(&(objectClass=PosixAccount)(cn=*))"''',
          "display": "cn",
          "login": '''"cn"''',
          "email": "mail",
          "info": {
          "firstName": "givenName",
            "display": "cn",
          "lastName": "sn"
            "email": "mail",
        }
            "firstName": "givenName",
      },
            "lastName": "sn"
      "enabled": true
          }
        },
        "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
* Выполнить команду в cli, заменив хост и порт актуальными значениями
* Выполнить команду, заменив хост и порт актуальными значениями
   ./svacer ldap servers --host 127.0.0.1 --port 8080
   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.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",
    "name": "test_ldap",
      ….
    ...
      },
    },
      "user": {
    "user": {
      ….
      ...
      '''"group": "dn"''',
      '''"group": "dn"''',
      },       
    },       
      '''"useGroup": true,'''
    '''"useGroup": true,'''
      '''"group": {''''
    '''"group": {''''
      '''"basedn": "ou=svacer_groups,ou=groups",'''
    '''"basedn": "ou=svacer_groups,ou=groups",'''
      '''"filter": "(&(objectClass=groupOfNames)(cn=*))",'''
    '''"filter": "(&(objectClass=groupOfNames)(cn=*))",'''
      '''"userMember": "member",'''
    '''"userMember": "member",'''
      '''"display":"cn",'''
    '''"display":"cn",'''
      },
    },
      "enabled": true
    "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, '''
    ''' "useGroup": true, '''
    ''' "group": { '''
    ''' "group": { '''
    ''' "basedn": "ou=svacer_groups,ou=groups", '''
    ''' "basedn": "ou=svacer_groups,ou=groups", '''
    ''' "filter": "(&(objectClass=groupOfNames)(cn=*))", '''
    ''' "filter": "(&(objectClass=groupOfNames)(cn=*))", '''
    ''' "userMember": "member", '''
    ''' "userMember": "member", '''
    ''' "display": "cn", '''
    ''' "display": "cn", '''
    ''' "svacerRole": "cn" '''
    ''' "svacerRole": "cn" '''
    ''' }, '''
    ''' }, '''
    "enabled": true
    "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
* Убедиться, что пользователю назначаются роли, выполнив команду в 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 (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
   Applied: false


=== Добавление серверов LDAP, работающих по TLS ===
===== Добавление серверов LDAP, работающих по TLS =====
* Изменить конфигурационный файл, следующим образом:
* Изменить конфигурационный файл следующим образом:
{
  {
      "name": "test_ldap",
    "name": "test_ldap",
      "basedn": "dc=example,dc=com",
    "basedn": "dc=example,dc=com",
      "connection": {
    "connection": {
        "url": "'''ldaps'''://ldap1.example.com:'''636'''",
      "url": "'''ldaps'''://ldap1.example.com:'''636'''",
        "connectAs": "cn=admin,dc=example,dc=com",
      "connectAs": "cn=admin,dc=example,dc=com",
        "password": "12345678",
      "password": "12345678",
        "ignoreCertCheck": '''true'''
      "ignoreCertCheck": '''true'''
      },
    },
      "user": {
    "user": {
      …..
      ...
        },       
    },       
      …..
    ...
      "enabled": true
    "enabled": true
      }
  }
 
* Убедиться, что возможен вход пользователем LDAP. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками
* Убедиться, что возможен вход пользователем LDAP. Для проверки можно использовать утилиту curl, как указано в примере с основными настройками
* Для проверки сертификата LDAP сервера добавить сертификат CA (например ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл:
* Для проверки сертификата LDAP сервера добавить сертификат CA (например, ldap.crt) в папку с сертификатами (например, /etc/ssl/certs/) и внести следующие изменения в конфигурационный файл:
  {
  {
      "name": "test_ldap",
    "name": "test_ldap",
      "basedn": "dc=example,dc=com",
    "basedn": "dc=example,dc=com",
      "connection": {
    "connection": {
        "url": "ldaps://ldap1.example.com:636",
      "url": "ldaps://ldap1.example.com:636",
        "connectAs": "cn=admin,dc=example,dc=com",
      "connectAs": "cn=admin,dc=example,dc=com",
        "password": "12345678",
      "password": "12345678",
        "ignoreCertCheck": '''false''',   
      "ignoreCertCheck": '''false''',   
        '''"caCertFiles": ["/etc/ssl/certs/ldap.crt"]'''
      '''"caCertFiles": ["/etc/ssl/certs/ldap.crt"]'''
        },
    },
        "user": {
    "user": {
          …..
      ...
        },       
    },       
        …..
    ...
      },
    },
      "enabled": true
    "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",
    "name": "test_ldap",
      "basedn": "dc=example,dc=com",
    "basedn": "dc=example,dc=com",
      "connection": {
    "connection": {
        "url": "ldaps://ldap1.example.com:636",
      "url": "ldaps://ldap1.example.com:636",
        '''"mirrors": ["ldaps://ldap2.example.com:636","ldaps://ldap3.example.com:636"],'''
      '''"mirrors": ["ldaps://ldap2.example.com:636","ldaps://ldap3.example.com:636"],'''
        "connectAs": "cn=admin,dc=example,dc=com",
      "connectAs": "cn=admin,dc=example,dc=com",
        "password": "12345678",
      "password": "12345678",
                    …..
      ...
      },
    },
      "user": {
    "user": {
    …...
      ...
        },       
    },       
      …...
    ...
      "enabled": true
    "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"
|-
!Действие !! Сообщение !! Причина !! Решение
|-
| Вход в систему || LDAP server unavailable || 1. Нет соединения с сервером<br/>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 сообщения с указанием этапа обработки запроса и его параметров.

Latest revision as of 14:38, 1 August 2024

Общий принцип аутентификации

Схема аутентификации с помощью протокола LDAP следующая:

  1. Сервер запускается с указанием конфигурационного файла с настройками для LDAP аутентификации
  2. В форме аутентификации пользователь выбирает нужный тип аутентификации (svacer или LDAP)
  3. При выборе аутентификации LDAP, после заполнения необходимых параметров, запрос на аутентификацию отправляется на сервер Svacer
  4. Сервер Svacer, используя настройки из конфигурационного файла, обращается к внешнему LDAP серверу и проводит проверку пользователя
  5. В случае успешной аутентификации, в БД сервера Svacer создается запись (если ее еще нет) для пользователя, чтобы можно было управлять ролями данного пользователя
  6. Сервер возвращает токен безопасности для дальнейшей работы, аналогичный токену, возвращаемому при аутентификации локальных пользователей

Для каждого пользователя, успешно прошедшего проверку на 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 из примера выше

  1. 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)
  2. Если подключение к хосту невозможно (хост недоступен), то пробуются хосты 192.168.11.72,192.168.11.73 с параметрами, аналогичными параметрам пункта 1
  3. Если подключение невозможно, процесс входа завершается с ошибкой
  4. Производится поиск пользователя в 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
    • поиск производится по всему поддереву
  5. Если пользователей не найдено или найдено больше 1 пользователя, процесс входа завершается с ошибкой
  6. Флаг 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 пользователя для данной процедуры). Если атрибут найден, считается что пользователь принадлежит группе.
    • Если пользователь не принадлежит ни к одной группе, процесс входа завершается с ошибкой
  7. Производится попытка подключения к хосту LDAP с параметрами, аналогичными параметрам из пункта 1, за исключением логина (cn=ivanov_ii,cn=users,dc=domain,dc=home,dc=org) и пароля пользователя (введен в поле пароль формы входа)
  8. Если подключение не удалось создать, то процесс входа завершается с ошибкой
  9. Процесс аутентификации пользователя произведен успешно
  10. Производится создание локального пользователя svacer с именем ivanov_ii, если его еще нет
  11. Так как 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 сервера (см. раздел Управление пользователями).

Также данные пользователей можно обновить с помощью интерфейса командной строки. Для этого можно использовать подкоманду 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 сообщения с указанием этапа обработки запроса и его параметров.