Аутентификация LDAP

Общие сведения о протоколе LDAP

Протокол LDAP (Lightweight Directory Access Protocol) — облегченный протокол доступа к каталогам. Протокол LDAP представляет собой сетевой протокол для доступа к службе каталогов X.500, созданный IETF, как облегченный вариант разработанного ITU-T протокола DAP.

LDAP использует TCP/IP, как правило, LDAP-сервер принимает входящие соединения на порт 389 по протоколам TCP или UDP, для LDAP-сеансов, инкапсулированных в SSL, используется порт 636.

LDAP позволяет производить операции аутентификации (bind), поиска (search) и сравнения (compare), а также операции импорта и синхронизации данных с каталогом LDAP: добавление, изменение или удаление записей.

Любая запись в каталоге LDAP состоит из одного или нескольких атрибутов и обладает уникальным именем DN (Distinguished Name). Уникальное имя может выглядеть следующим образом: "cn=Иван Петров, ou=Сотрудники, dc=example, dc=com".

Уникальное имя состоит из одного или нескольких относительных уникальных имен RDN (Relative Distinguished Name), разделенных запятой. Относительное уникальное имя имеет вид: "имяАтрибута=значение". На одном уровне каталога не может существовать двух записей с одинаковыми относительными уникальными именами. Данная структура уникального имени позволяет представить записи в каталоге LDAP в виде дерева. Запись может состоять только из атрибутов, определенных в описании класса записи (object class). Классы записи, в свою очередь, объединены в схемы (schema), в которых определяются обязательные атрибуты для данного класса и опциональные атрибуты, а также тип и правила сравнения атрибутов.

LDAP является широко используемым стандартом. Одной из наиболее популярных его реализаций является служба каталогов ActiveDirectory (Microsoft Windows), предназначенная для централизации управления сетями Windows. Свои реализации служб каталогов на основе LDAP предлагают и другие крупные компании, например, Novell и Sun. Существуют также свободно распространяемые открытые реализации LDAP, например, OpenLDAP.

Интеграция приложения SMP с LDAP-сервером реализуется для решения следующих задач:

  • импорт информации из хранилища LDAP-сервера в систему;
  • использование информации из хранилища LDAP-сервера для аутентификации пользователей при входе в систему.

Инструкция по настройке LDAP-аутентификации

Аутентификация с помощью LDAP позволит пользователям входить в систему, используя учетные данные службы каталогов.

Логины пользователей

Для корректной работы LDAP-аутентификации логины пользователей в системе должны соответствовать логинам в LDAP. Как правило, для этого используется механизм импорта пользователей из хранилища LDAP-сервера (также пользователи могут быть заведены вручную в интерфейсе системы).

Логины в системе могут иметь вид "user1@domain" или просто "user1". Пользователь на форме входа всегда должен набирать тот логин, который заведен в системе, т.е. если логин имеет вид "user1@domain", то обрезать домен при вводе логина недопустимо.

Этапы настройки LDAP-аутентификации

Для настройки LDAP-аутентификации выполните следующие действия:

  1. Импортируйте пользователей из LDAP или создайте вручную.
  2. Добавьте аутентификатор "LDAP" в список используемых типов аутентификаторов в dbaccess.properties, см. dbaccess.properties.
  3. Настройте файл конфигурации ldap-settings.xml, см. ldap-settings.xml .
  4. Настройте логирование ошибок аутентификации, см. Логирование ошибок аутентификации.
  5. Перезапустите приложение. Включить или выключить LDAP-аутентификацию можно только с помощью перезапуска приложения.
  6. Проверьте работу аутентификации.

    Если возникнут проблемы, проверьте настройки ldap-settings.xml и изучите лог sdng.log на предмет ошибок.

    После внесения правок в настройки файла ldap-settings.xml, можно применить новые настройки без перезапуска приложения. Для этого в groovy-консоли приложения выполните скрипт:

    api.ldap.reload();

Использование LDAPs

Если предполагается использовать LDAPs (Secure LDAP), то предварительно необходимо добавить сертификат контроллера домена в доверенные см. Работа с внешними системами через SSL.

Конфигурационные файлы для настройки LDAP-аутентификации

Настройка параметров LDAP-аутентификации осуществляется в конфигурационных файлах приложения:

  • dbaccess.properties;
  • ldap-settings.xml (если файла ldap-settings.xml нет, необходимо создать его вручную).

dbaccess.properties

В списке используемых аутентификаторов (параметр ru.naumen.core.authentication.authenticators) должны быть указаны "LDAP,INTERNAL", см. Аутентификация и авторизация.

ldap-settings.xml

Конфигурационный файл ldap-settings.xml должен находится каталоге, указанном в java-опции -Dext.prop.dir при запуске приложения.

Стандартно путь до конфигурационного файла ldap-settings.xml следующий: [каталог приложения]/conf/ldap-settings.xml.

Настройки файла ldap-settings.xml всегда можно перезагрузить в ходе работы приложения скриптом в консоли системы:

api.ldap.reload();

Скрипт не перезагружает значение параметра ru.naumen.core.authentication.authenticators из конфигурационного файла dbaccess.properties (включить или выключить LDAP-аутентификацию можно только с помощью перезапуска приложения).

Пример файла ldap-settings.xml. Аутентификация в одном домене

Copy
<?xml version="1.0" encoding="UTF-8"?>
<n:configuration xmlns:n="http://www.naumen.ru/ldapSettings" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.naumen.ru/ldapSettings ldapSettings.xsd ">
<defaultSource>source1</defaultSource>
<sources>
    <source>
        <code>source1</code>
        <url>ldap://dc1.sd.local:389</url>
        <connectionTimeout>30000</connectionTimeout>
        <login>administrator@SD.LOCAL</login>
        <password>123qweASD</password>
        <encPassword></encPassword>
        <baseDn>CN=users,DC=sd,DC=local</baseDn>
        <domain>sd.local</domain>
        <searchFilter>sAMAccountName={1}</searchFilter>
        <searchDuplicates>true</searchDuplicates>
    </source>
</sources>
</n:configuration>

Пример файла ldap-settings.xml. Мультидоменная аутентификация

Copy
<?xml version="1.0" encoding="UTF-8"?>
<n:configuration xmlns:n="http://www.naumen.ru/ldapSettings" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.naumen.ru/ldapSettings ldapSettings.xsd ">
<defaultSource>source1</defaultSource>
<sources>
    <source>
        <code>source1</code>
        <url>ldap://dc1.company.local:389/</url>
        <connectionTimeout>30000</connectionTimeout>
        <login></login>
        <password></password>
        <encPassword></encPassword>
        <baseDn>ou=users,dc=company,dc=local</baseDn>
        <domain></domain>
        <searchFilter>uid={1}</searchFilter>
        <searchDuplicates>true</searchDuplicates>
    </source>
    <source>
        <code>source2</code>
        <url>ldap://dc1.sd.local:389</url>
        <connectionTimeout>30000</connectionTimeout>
        <login>administrator@SD.LOCAL</login>
        <password>123qweASD</password>
        <encPassword></encPassword>
        <baseDn>CN=users,DC=sd,DC=local</baseDn>
        <domain>sd.local</domain>
        <searchFilter>sAMAccountName={1}</searchFilter>
        <searchDuplicates>true</searchDuplicates>
    </source>
</sources>
</n:configuration>

Параметры файла ldap-settings.xml с примерами:

  • <sources> — Перечисление блоков source, определяющих подключение к LDAP для поиска и аутентификации пользователя.

    Обязательность: да

    Значение: Набор блоков <source>

  • <source> — Блок, определяющий подключение к LDAP для поиска и аутентификации пользователя.

    Нужный блок определяется по тэгу <domain>

    Обязательность: да

    Значение: Набор тегов <>

  • <defaultSource> — Код блока, который будет использован, если введенный пользователем домен не найден в файле настроек в тэгах <domain> (введен логин: "user1@unexist.inldapsettings.domain") или если пользователь не указал домен (введен логин: "user1")

    Обязательность: да

    Значение должно совпадать со значением одного из тэгов с учетом регистра || Одно из значений тэгов <code> || source1

  • <code> — Код блока. Нужен для идентификации источника в системе и для возможности указать блок по умолчанию в тэге <defaultSource>

    Обязательность: да

    Значение: Строка, пример: "source1"

  • <domain> — Домен, по которому выбирается, использовать ли данный блок для аутентификации LDAP. Значение тэга сравнивается без учета регистра с доменом, который ввел пользователь в окне. Может быть введено несколько значений через запятую

    Обязательность: нет

    Значение: Строка, пример: *domain.local,domain

  • <url> — Строка подключения к домен-контроллеру LDAP (или к нескольким домен-контроллерам)

    Обязательность: да

    Значение: <schema>://<server>:<port>/[<base_dn>]

    Пример 1: "ldap://dc1.naumen.local:389"

    Пример 2: "ldaps://dc1.naumen.local"

    Пример 3: "ldaps://dc1.domain.local ldaps://dc2.domain.local ldaps://dc3.domain.local"

  • <connectionTimeout> — Максимальное время ожидания соединения с сервером аутентификации, в миллисекундах

    Обязательность: нет

    Значение: Целое число. Если не указано, то таймаут будет равен 30000 (30 секундам).

    Если в инсталляции (приложении) присутствует модуль "Мобильное приложение", то необходимо задавать значение меньше 30 секунд.

  • <readTimeout> — Максимальное время ожидания ответа от сервера в миллисекундах. По умолчанию 20000

    Обязательность: нет

    Значение: Целое число.

  • <login> — Имя пользователя для поиска в домене, если анонимный поиск запрещен

    Обязательность: нет

    Значение: Строка. Пример: "administrator@DC.LOCAL"

  • <password> — Пароль пользователя для поиска в домене, если анонимный поиск запрещен

    Обязательность: нет

    Значение: Строка. Пример: "mypass"

  • <encPassword> — Зашифрованный пароль пользователя для поиска в домене, если анонимный поиск запрещен. Используется вместо <password>, когда включено шифрование паролей в файле dbaccess.properties (параметр encryption.enabled, см. Безопасность).

    Обязательность: нет

    Значение: Строка.

  • <baseDn> — Место поиска пользователей в домене для аутентификации. Можно указать только одно место поиска.

    Если требуется ограничить поиск несколькими объектами, используется фильтр <searchFilter>

    Обязательность: да

    Значение: DN Пример: "CN=users,DC=sd,DC=local", "OU=best,OU=admins,DC=sd,DC=local"

  • <searchFilter> — Шаблон поиска пользователя,

    в качестве {0} будет подставлена строка, введенная в качестве логина;

    в качестве {1} будет подставлена строка, введенная в качестве логина, за исключением домена.

    Пример, если в качестве логина введено "user1@domain", то в {0} будет лежать "user1@domain", а в {1} — "user1"

    Обязательность: да

    Значение: Фильтр поиска в LDAP

  • <searchDuplicates> — Параметр определяет, будет ли прекращен поиск, после того как будет найдена запись пользователя в источнике.

    Обязательность: нет.

    Указывается внутри тега <source>.

    • true (по умолчанию) или не указано — поиск производится по всему источнику полностью, даже если запись пользователя уже найдена. Пользователь авторизуется в системе после завершения поиска по всему источнику. Рекомендовано для исключения ошибки дублирования пользователей.

    • false — поиск останавливается, как только найдена запись пользователя, после этого пользователь авторизуется в системе

Фильтр поиска в LDAP:

  1. Для поиска в AD по user1@domain (на странице входа введено "user1@domain"): <searchFilter>userPrincipalName={0}</searchFilter>
  2. Для поиска в AD по user1 (на странице входа введено "user1"): <searchFilter>sAMAccountName={0}</searchFilter>
  3. Для поиска в AD по user1 (на странице входа введено "user1@domain" или "user1"): <searchFilter>sAMAccountName={1}</searchFilter> (универсальный фильтр)
  4. Для поиска в OpenLDAP по user1 (на странице входа введено "user1"): <searchFilter>uid={0}</searchFilter>
  5. Для поиска в OpenLDAP по user1 (на странице входа введено "user1@domain"): <searchFilter>uid={1}</searchFilter>

Принципы работы LDAP аутентификации

Логин пользователя

Пользователь вводит логин и пароль в окне входа в систему.

В начале LDAP аутентификации из логина вычленяется домен, по которому ищется соответствующий source в файле ldap-settings.xml (см. Принцип выбора домена для аутентификации).

Далее по указанному в блоке url производится подключение к соответствующему домен контроллеру. В домене ищется пользователь в соответствии с указанным searchFilter и проверяется его пароль.

После этого при ответе от LDAP об успешной аутентификации логин пользователя ищется в приложении. Если такой логин есть, пользователь успешно заходит в систему. Если пользователя с введенным логином нет в приложении либо LDAP выдал ошибку при попытке подключения или аутентификации, пользователю вернется ошибка о неправильном вводе логина или пароля.

Принцип выбора домена для аутентификации

Правила получения домена из введенной строки:

  • домен = все после символа "@";
  • домен = все до символа "\";
  • если в строке нет символов "\" или "@", домен не определен.

Далее по полученному значению домена происходит поиск подходящего блока в файле ldap-settings.xml по следующим правилам:

  • если домен не определен, берется блок, определенный кодом в тэге <defaultSource>;
  • если домен определен, он ищется среди доменов в тэгах <domain>:

    • если домен найден, берется соответствующий блок;
    • если домен не найден, берется блок, определенный кодом в тэге <defaultSource>.

Логирование ошибок аутентификации

Настоятельно рекомендуется настроить логирование ошибок аутентификации. Логирование ошибок несущественно увеличивает файл журнала sdng.log, поэтому рекомендуется включить его на постоянной основе.

Отображение ошибок аутентификации в логе приложения настраивается в конфигурационном файле:

После настройки конфигурации перезапустите приложение. Ошибки аутентификации будут попадать в лог приложения.