ldap
Общие сведения о протоколе LDAP
Протокол LDAP (Lightweight Directory Access Protocol — облегченный протокол доступа к каталогам) — представляет собой сетевой протокол для доступа к службе каталогов X.500, созданный IETF, как облегченный вариант разработанного ITU-T протокола DAP.
LDAP использует TCP/IP. Как правило, LDAP-сервер принимает входящие соединения на порт 389 по протоколам TCP или UDP, для LDAP-сеансов, инкапсулированных в SSL - используется порт 636. LDAP позволяет производить операции аутентификации (bind), поиска (search) и сравнения (compare), а также операции добавления, изменения или удаления записей.
Любая запись в каталоге LDAP состоит из одного или нескольких атрибутов и обладает уникальным именем (DN — англ. Distinguished Name). Уникальное имя может выглядеть следующим образом: "cn=Иван Петров, ou=Сотрудники, dc=example, dc=com". Уникальное имя состоит из одного или нескольких относительных уникальных имен (RDN — англ. Relative Distinguished Name), разделённых запятой. Относительное уникальное имя имеет вид: "имяАтрибута=значение". На одном уровне каталога не может существовать двух записей с одинаковыми относительными уникальными именами. Данная структура уникального имени позволяет представить записи в каталоге LDAP в виде дерева. Запись может состоять только из тех атрибутов, которые определены в описании класса записи (object class). Классы записи в свою очередь объединены в схемы (schema), в которых определяются обязательные атрибуты для данного класса и опциональные атрибуты, а также тип и правила сравнения атрибутов. LDAP является широко используемым стандартом.
Существуют также свободно распространяемые открытые реализации LDAP, например, Open LDAP.
Интеграция SMP с LDAP-сервером реализуется для решения следующих задач:
- Импорт информации из хранилища LDAP-сервера в SMP;
- Использование информации из хранилища LDAP-сервера для аутентификации пользователей при входе в SMP.
Инструкция по настройке LDAP-аутентификации
Аутентификация с помощью LDAP позволит пользователям входить в систему, используя учетные данные службы каталогов.
Для корректной работы LDAP-аутентификации логины пользователей в системе должны соответствовать логинам в LDAP. Как правило, для этого используется механизм импорта пользователей из хранилища LDAP-сервера. Также пользователи могут быть заведены в SMP вручную.
Логины в SMP могут иметь вид user1@domain или просто user1. Пользователь на форме входа всегда должен набирать тот логин, который заведен в приложении, т.е. если логин имеет вид user1@domain, то обрезать домен при вводе логина недопустимо.
Настройка LDAP-аутентификации осуществляется в файлах dbaccess.properties и ldap-settings.xml. Если файла ldap-settings.xml нет, необходимо создать его вручную.
Для настройки LDAP-аутентификации выполните следующие действия:
- Импортируйте пользователей из LDAP или создайте вручную.
- Добавьте аутентификатор LDAP в список используемых типов аутентификаторов в параметре ru.naumen.core.authentication.authenticators файла dbaccess.properties. Описание файла приведено в разделе dbaccess.properties.
- Настройте файл конфигурации ldap-settings.xml, см. ldap-settings.xml.
- Настройте логирование ошибок аутентификации, см. Логирование ошибок аутентификации.
- Перезапустите приложение. Включить или выключить LDAP-аутентификацию можно только с помощью перезапуска приложения. Если при запуске приложения в файле конфигурации будет обнаружен неизвестный параметр, то приложение не будет запущено. В этом случае необходимо проверить корректность настроек.
- Проверьте работу аутентификации. Если возникнут проблемы, проверьте настройки ldap-settings.xml и изучите лог sdng.log на предмет ошибок.
После внесения правок в настройки файла ldap-settings.xml, можно применить новые настройки без перезапуска приложения.Для этого в groovy-консоли приложения выполните скрипт:
api.ldap.reload();
Конфигурационные файлы для настройки LDAP-аутентификации
Настройка параметров LDAP-аутентификации осуществляется в конфигурационных файлах приложения:
- dbaccess.properties;
- ldap-settings.xml (если файла ldap-settings.xml нет, необходимо создать его вручную).
dbaccess.properties
В списке используемых аутентификаторов должны быть указаны LDAP,INTERNAL(параметр ru.naumen.core.authentication.authenticators, подраздел Аутентификация и авторизация).
Конфигурационный файл ldap-settings.xml должен находиться в каталоге, указанном в java-опции -Dext.prop.dir при запуске приложения — Linux.
Стандартно путь до конфигурационного файла ldap-settings.xml следующий [каталог приложения]/conf/ldap-settings.xml.
Настройки файла ldap-settings.xml всегда можно перезагрузить в ходе работы приложения скриптом в консоли системы:
api.ldap.reload()
Скрипт не перезагружает значение параметра ru.naumen.core.authentication.authenticators из конфигурационного файла dbaccess.properties.
Пример файла ldap-settings.xml. Аутентификация в одном домене.
<?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>
<referral>follow</referral>
</source>
</sources>
</n:configuration>
Пример файла ldap-settings.xml. Мультидоменная аутентификация
<?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>
<referral>follow</referral>
</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>
<referral>follow</referral>
</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> — Максимальное время ожидания соединения с сервером аутентификации, в миллисекундах
Обязательность: нет
Значение: Целое число. Если не указано, то таймаут будет равен 30 000 (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 — поиск останавливается, как только найдена запись пользователя, после этого пользователь авторизуется в системе
-
-
<referral> — Параметр определяет процесс, посредством которого LDAP-сервер, вместо того, чтобы вернуть результат запроса, возвращает ссылку (отсылку, referral) на другой LDAP-сервер, который может содержать дополнительную информацию.
Обязательность: да.
Указывается внутри тега <source>.
Возможные значения:
-
follow (по умолчанию) — переходить по ссылке;
-
throw — выбрасывать ошибку, если получилась ссылка;
-
ignore — игнорировать ссылки.
Примеры:
<referral>follow</referral>
<referral>throw</referral>
<referral>ignore</referral>
-
Управление пулом соединений
Для того, чтобы управлять пулом соединений к серверу LDAP, нужно при запуске приложения указать ключи из Java. Connection Pooling Configuration
Указывать нужно только то, что хочется поменять.
Принципы работы LDAP аутентификации
Логин пользователя
Для успешной аутентификации логин пользователя в системе должен совпадать с тем, что он вводит на странице входа в качестве имени пользователя.
До начала LDAP аутентификации в приложении выполняется поиск пользователя с указанным логином. Если он есть и не заблокирован, то запускается процесс LDAP аутентификации.
В начале LDAP аутентификации из логина вычленяется домен, по которому ищется соответствующий source в файле ldap-settings.xml, см. Принцип выбора домена для аутентификации.
Далее по указанному в блоке URL-адресу производится подключение к серверу LDAP, осуществляется поиск пользователя в соответствии с указанным searchFilter и проверяется его пароль.
Если пользователь на сервере LDAP найден, не заблокирован, пароль не истек и его проверка прошла успешно, то LDAP-сервер отправляет приложению ответ об успешной аутентификации.
После этого логин пользователя ищется в приложении. Если такой логин есть, пользователь успешно заходит в систему.
Если пользователя с введенным логином нет в приложении, либо LDAP выдал ошибку при попытке подключения/аутентификации, пользователю вернется ошибка о неправильном вводе логина или пароля.
Принцип выбора домена для аутентификации
Правила получения домена из введенной строки логина:
- домен = все после символа @;
- домен = все до символа \;
- если в строке нет символов \ или @, домен не определен.
Далее по полученному значению домена происходит поиск подходящего блока в файле ldap-settings.xml по следующим правилам:
- если домен не определен, берется блок, определенный кодом в тэге <defaultSource>;
-
если домен определен, он ищется среди доменов в тэгах <domain>:
- если результат поиска положительный, берется соответствующий блок;
- если домен не найден, берется блок, определенный кодом в тэге <defaultSource>.
Pre-windows2000 имя домена, принцип работы с фильтрацией при работе с логином в виде domain\user1
В системе имеется возможность вводить логин в виде domain\user1. В этом случае механизм аутентификации меняется следующим образом (красным выделено отличие от стандартной процедуры входа через LDAP):
- Введенная строка делится на домен и пользователя;
-
Полученный домен ищется в тэгах <domain> в конфигурационном файле ldap-settings.xml:
- Если домен найден, для взаимодействия с домен-контроллером используются реквизиты из источника, в котором найден домен;
- Если домен не найден, для взаимодействия с домен-контроллером используются реквизиты из источника, определенного как источник по умолчанию;
- В фильтре поиска <searchFilter> за {0} берется domain\user1, за {1} - user1;
-
Полученные в результате поиска DN пользователей дополнительно фильтруются по условию dc=domain, где domain - это введенный пользователем до символа "\" домен:
- Если в результате поиска и фильтрации получен один пользователь, проверяется корректность введенного пароля. Если пароль верный, то пользователь заходит в систему;
- Если в результате поиска и фильтрации пользователей не получено, аутентификация завершается с ошибкой;
- Если в результате поиска и фильтрации получено более одного пользователя, аутентификация завершается с ошибкой.
Логирование ошибок аутентификации
Настоятельно рекомендуется настроить логирование ошибок аутентификации. Логирование ошибок несущественно увеличивает файл журнала sdng.log, поэтому рекомендуется включить его на постоянной основе.
Отображение ошибок аутентификации в логе приложения настраивается в конфигурационном файле log4j2.properties. Описание файла приведено в разделе log4j2.properties.
За вывод в лог информации о процессе аутентификации отвечают следующие настройки.
Поиск авторизованного через службу пользователя в БД SD
logger.authdb.name=ru.naumen.sec.server.employee logger.authdb.level=DEBUG
Общие части аутентификаторов
logger.springauth.name=org.springframework.security.authentication logger.springauth.level=DEBUG
Логеры Kerberos/SPNEGO аутентификатора
logger.secserver.name=ru.naumen.sec.server logger.secserver.level=DEBUG logger.sepnego.name=ru.naumen.sec.server.spnego logger.sepnego.level=DEBUG
Логеры LDAP & AD аутентификаторов
logger.ldap.name=org.springframework.security.ldap logger.ldap.level=DEBUG logger.ldapsearch.name=org.springframework.security.ldap.search logger.ldapsearch.level=DEBUG logger.ldapauth.name=org.springframework.security.ldap.authentication logger.ldapauth.level=DEBUG logger.nauldap.name=ru.naumen.core.server.ldap logger.nauldap.level=DEBUG
Указанные настройки включены в шаблоне файла log4j2.properties, который можно скачать с сайта NAUMEN