Анализ выполнения 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

Внесенные изменения применяются автоматически.

Пример настройки

Пример настройки логирования детализированной информации в отдельный файл:

  1. Создайте на контроллере домена каталог для размещения лог-файла:

    sudo mkdir -p /var/log/elles/
  2. Чтобы повысить уровень логирования для класса ldapsrv до 5 и перенаправить соответствующую информацию в файл в созданном каталоге, измените значение параметра log level в файле конфигурации Эллес smb.conf:

    [global]
        ...
        log level = 3 \
                ldapsrv:5@/var/log/elles/ldapsrv.log
        ...

    Изменения в настройках логирования в файле smb.conf применяются автоматически.

  3. Для проверки корректности настройки выполните любой поисковый запрос и убедитесь, что информация о нем добавлена в файл 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-запросов по следующим атрибутам:

Атрибут Описание Поддерживаемые условия

duration

Время выполнения запроса

>=

sid

SID пользователя, от имени которого выполнялся запрос

Полное или частичное совпадение строки

ip

IP-адрес источника запроса

Полное или частичное совпадение без учета порта

filter

Подстрока фильтра запроса

Полное или частичное совпадение строки

base

Объект каталога, начиная с которого выполняется поиск (basedn)

Полное или частичное совпадение строки

scope

Область поиска

  • base — один объект;

  • sub — один уровень дерева;

  • one — поддерево целиком

Включение фильтрации

Для включения фильтрации необходимо перечислить атрибуты со значениями, по которым требуется отфильтровать логируемые 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