Анализ выполнения LDAP-запросов
Эллес обеспечивает следующие возможности для анализа выполнения LDAP-запросов:
-
логирование детализированной информации о параметрах и длительности выполнения LDAP-запросов, обрабатываемых сервером, с поддержкой фильтрации по параметрам запроса;
-
получение плана выполнения запроса LDAP при вызове операции поиска с помощью утилиты
ldbsearch.
Под операцией поиска понимается операция запроса и получения данных в LDAP согласно RFC 4511: Lightweight Directory Access Protocol (LDAP), 4.5 Search Operation.
Логирование детализированной информации
Детализированная информация о LDAP-запросах фиксируется при уровне логирования не ниже 5 в рамках класса отладки ldapsrv (см. описание настроек логирования в разделе
«Логирование Эллес»).
| Включение детализированного логирования LDAP-запросов может оказывать влияние на производительность системы. Администратору Эллес следует ответственно подходить к использованию этой возможности и прибегать к ней только в качестве временной меры для выявления запросов, которые приводят к значительному увеличению нагрузки на базу данных и требуют оптимизации. |
Для удобства сбора и дальнейшего анализа может быть настроено логирование работы LDAP-сервера в отдельный файл.
Включение логирования
Возможные варианты настройки для включения логирования детализированной информации в разделе [global] в файле конфигурации Эллес smb.conf включают:
-
повышение общего уровня логирования:
log level = 5
-
повышение уровня логирования только для класса отладки
ldapsrv:log level = 0 \ ldapsrv:5 -
повышение уровня логирования для класса отладки
ldapsrvс указанием отдельного файла (каталог для размещения файла должен существовать):log level = 0 \ ldapsrv:5@/path/to/log/file/filename.log
Внесенные изменения применяются автоматически.
Пример настройки
Пример настройки логирования детализированной информации в отдельный файл:
-
Создайте на контроллере домена каталог для размещения лог-файла:
sudo mkdir -p /var/log/elles/
-
Чтобы повысить уровень логирования для класса
ldapsrvдо5и перенаправить соответствующую информацию в файл в созданном каталоге, измените значение параметраlog levelв файле конфигурации Эллес smb.conf:[global] ... log level = 3 \ ldapsrv:5@/var/log/elles/ldapsrv.log ...Изменения в настройках логирования в файле smb.conf применяются автоматически.
-
Для проверки корректности настройки выполните любой поисковый запрос и убедитесь, что информация о нем добавлена в файл ldapsrv.log:
ldbsearch -H ldap://localhost -s base -b '' -U Administrator ... tail -f /var/log/elles/ldapsrv.log [2025/05/19 14:36:58.619133, 5] ../../source4/ldap_server/ldap_backend.c:1006(ldapsrv_SearchRequest) ldapsrv_SearchRequest: ldb_request BASE dn= filter=(|(objectClass=*)(distinguishedName=*)) [2025/05/19 14:36:58.645365, 5] ../../source4/ldap_server/ldap_backend.c:1241(ldapsrv_SearchRequest) ldapsrv_SearchRequest: LDAP Query: Duration was 0.03s, SearchRequest by S-1-5-7 from ipv4:127.0.0.1:53826 filter: [(|(objectClass=*)(distinguishedName=*))] basedn: [] scope: [BASE] result: Success ...
Выключение логирования
Для выключения логирования детализированной информации о LDAP-запросах выполните любое из следующих действий в файле конфигурации Эллес smb.conf:
-
понизьте уровень логирования для класса отладки
ldapsrvдо4или ниже;Например:
[global] ... log level = 3 \ ldapsrv:3@/var/log/elles/ldapsrv.log ... -
удалите отдельную настройку уровня логирования для класса отладки
ldapsrvи понизьте общий уровень логирования в параметреlog levelдо4или ниже; -
удалите строку с параметром
log levelполностью для возврата к настройкам логирования по умолчанию.
Внесенные изменения применяются автоматически.
Фильтрация логируемых LDAP-запросов
Для уменьшения количества регистрируемых в логе LDAP-запросов Эллес предоставляет возможность их фильтрации по атрибутам.
Атрибуты для фильтрации
Доступна фильтрация LDAP-запросов по следующим атрибутам:
| Атрибут | Описание | Поддерживаемые условия |
|---|---|---|
|
Время выполнения запроса |
|
|
SID пользователя, от имени которого выполнялся запрос |
Полное или частичное совпадение строки |
|
IP-адрес источника запроса |
Полное или частичное совпадение без учета порта |
|
Подстрока фильтра запроса |
Полное или частичное совпадение строки |
|
Объект каталога, начиная с которого выполняется поиск ( |
Полное или частичное совпадение строки |
|
Область поиска |
|
Включение фильтрации
Для включения фильтрации необходимо перечислить атрибуты со значениями, по которым требуется отфильтровать логируемые LDAP-запросы, в параметре ldapsrv:query stat filter в разделе [global] в файле конфигурации Эллес smb.conf.
При задании значения следует учитывать следующие ограничения:
-
для объединения нескольких условий (фильтрация по нескольким атрибутам) поддерживается только оператор «И»;
-
отсутствует возможность указания приоритетов выполнения условий (скобки в фильтрах с несколькими условиями).
Настроить фильтрацию по атрибутам можно как до, так и после включения логирования детализированной информации о LDAP-запросах.
Внесенные изменения применяются автоматически.
Формат фильтра
Формат задания фильтра в значении параметра ldapsrv:query stat filter:
[global]
...
ldapsrv:query stat filter = duration:<value> sid:<value> ip:<value> filter:<value> base:<value> scope:<value>
...
Описание формата:
-
имя атрибута, используемого в качестве фильтра, отделяется от значения символом
:без пробела; -
атрибуты отделяются друг от друга пробелами;
-
перечисленные атрибуты объединяются по условию «И».
Пример фильтра
Пример фильтра с полным набором атрибутов:
[global]
...
ldapsrv:query stat filter = duration:0.0001 sid:S-1-5-21-2950752316-4271903779-3806773975-500 ip:10.0.156.4 filter:(objecClass=group) base:dc=samdom,dc=example,dc=com scope=sub
...
После сохранения изменений в smb.conf при логировании сохраняется только информация об операциях поиска, отвечающих заданным условиям фильтрации.
Выключение фильтрации
Чтобы выключить фильтрацию сохраняемой в лог информации, выполните любое из следующих действий в файле конфигурации Эллес smb.conf:
-
закомментируйте строку с параметром
ldapsrv:query stat filter(для комментирования строк в smb.conf используется символ#); -
задайте в параметре
ldapsrv:query stat filterпустое значение:ldapsrv:query stat filter =
-
удалите строку с параметром
ldapsrv:query stat filterполностью.
Получение плана выполнения LDAP-запроса
Эллес позволяет получить план выполнения LDAP-запроса при вызове операции поиска локально на контроллере домена Эллес с помощью доработанной утилиты ldbsearch с указанием пути к файлу базы данных.
Для получения плана выполнения LDAP-запроса пользователь должен:
-
иметь права для получения данных в результате выполнения запроса;
-
иметь права доступа на чтение к файлам базы данных на конкретном сервере контроллера домена.
Поскольку круг лиц с такими полномочиями четко ограничен, обеспечивается достаточный уровень информационной безопасности при использовании данной функциональности.
Формат вызова ldbsearch
Формат вызова утилиты ldbsearch для получения плана выполнения LDAP-запроса:
ldbsearch -H /app/inno-samba/private/sam.ldb '<filter>' --profile [options]
Описание формата:
-
-H— путь к базе данных Эллес на контроллере домена (по умолчанию после установки пакета inno-samba — /app/inno-samba/private/sam.ldb); -
<filter>— LDAP-фильтр для запроса данных; -
--profile— включение в вывод плана выполнения LDAP-запроса; -
прочие опции, доступные при работе с утилитой
ldbsearch.
Пример вызова ldbsearch
Пример вызова утилиты ldbsearch для получения плана выполнения LDAP-запроса с фрагментом вывода:
sudo ldbsearch -H /app/inno-samba/private/sam.ldb '(&(objectClass=person)(name=User1))' memberOf --profile -U Administrator
...
# record 1
dn: CN=User1,CN=Users,DC=samdom,DC=example,DC=com
memberOf: CN=Group1,CN=Users,DC=samdom,DC=example,DC=com
0.000020 | > ldb_kv_search() // search the database with a LDAP-like expression. chooses a search method
0.000076 | base: DC=samdom,DC=example,DC=com
0.000093 | scope: LDB_SCOPE_DEFAULT
0.000122 | AND
0.000142 | NOT
0.000186 | isDeleted=TRUE
0.000207 | AND
0.000240 | objectClass=person
0.000272 | name=User1
0.000393 | > ldb_kv_search_base() // search the database for a single simple dn
0.000410 | DN: DC=samdom,DC=example,DC=com
0.000430 | > ldb_kv_search_dn1() // search the database for a single simple dn, returning all attributes in a single message
0.000447 | DN: DC=samdom,DC=example,DC=com
0.000466 | > ldb_kv_key_dn_from_idx() // Look in the index to find the key for this DN.
0.000508 | DN: DC=samdom,DC=example,DC=com
0.000529 | > ldb_kv_index_dn_attr() // return a list of matching objects using a one-level index
0.000552 | DN: DC=samdom,DC=example,DC=com
0.000582 | > ldb_kv_dn_list_load() // return the @IDX list in an index entry for a dn as a struct dn_list
0.000601 | DN: @INDEX:@IDXDN:DC=SAMDOM,DC=EXAMPLE,DC=COM
0.000616 | - have no transaction cache
0.000636 | > ldb_kv_search_dn1() // search the database for a single simple dn, returning all attributes in a single message
0.000653 | DN: @INDEX:@IDXDN:DC=SAMDOM,DC=EXAMPLE,DC=COM
0.000698 | - result: Message: payload size=32 attrs=2 vals=2 DN=
0.000723 | - return LDB_SUCCESS
0.000742 | = directly fetched 1 messages (117 bytes)
0.000759 | < ldb_kv_search_dn1(), elapsed 0.000105
0.000784 | - result: DN list: count=1 (strict=false)
0.000805 | - return LDB_SUCCESS
0.000823 | < ldb_kv_dn_list_load(), elapsed 0.000240
0.000844 | - result: DN list: count=1 (strict=false)
0.000868 | - result: Key truncation: KEY_NOT_TRUNCATED
0.000890 | - return LDB_SUCCESS
0.000908 | < ldb_kv_index_dn_attr(), elapsed 0.000380
0.000984 | - result Key: GUID=\xEB\x8FX\x02JG\x1DK\x84\x85\xD3\xFB\x1D\xE1\xB9I
0.001010 | - return LDB_SUCCESS
0.001031 | < ldb_kv_key_dn_from_idx(), elapsed 0.000565
0.001072 | - result: Message: payload size=25 attrs=0 vals=0 DN=DC=samdom,DC=example,DC=com
0.001092 | - return LDB_SUCCESS
0.001110 | = directly fetched 1 messages (8948 bytes)
0.001129 | < ldb_kv_search_dn1(), elapsed 0.000679
0.001149 | - result: DN: DC=samdom,DC=example,DC=com
0.001172 | - return LDB_SUCCESS
0.001191 | < ldb_kv_search_base(), elapsed 0.000798
...
# Referral
ref: ldap://samdom.example.com/DC=DomainDnsZones,DC=samdom,DC=example,DC=com
# returned 2 records
# 1 entries
# 1 referrals