Product SiteDocumentation Site

6.18.5. ldapsearch

ldapsearch — утилита для поиска информации в LDAP. Синтаксис:
ldapsearch <параметры> <фильтр> <атрибуты>
ldapsearch открывает соединение с сервером LDAP, подключается к нему и выполняет поиск с помощью фильтра.
Если утилита ldapsearch найдет одну или несколько записей, то значения указанных атрибутов этих записей будут переданы в стандартный поток вывода. Если в этом списке указан знак *, возвращаются все пользовательские атрибуты. Если в этом списке указан знак +, возвращаются все операционные атрибуты. Если атрибуты не указаны, то возвращаются все пользовательские атрибуты.
Результаты поиска отображаются в виде расширенной версии LDIF. Формат вывода контролируется с помощью параметра -L.

Таблица 6.30. Параметры команды ldapsearch

Параметр
Описание
Параметры поиска
-a {never|always|search|find}
Задает способ преобразования псевдонимов. Может принимать значения: never (по умолчанию), always, search или find, указывающие, соответственно, что псевдонимы не преобразуются, преобразуются всегда, преобразуются при поиске, либо преобразуются только при определении базового объекта для поиска
-A
Получить только атрибуты (без значений)
-b basedn
Позволяет переопределить заданную по умолчанию начальную точку поиска
-c
Режим продолжения операции (не останавливать поиск при ошибках)
-E [!]ext[=extparam]
Указывает расширения поиска. Знак '!' обозначает критичность расширения.
Общие расширения:
  • [!]domainScope (диапазон домена)
  • !dontUseCopy
  • [!]mv=<filter> (RFC 3876 фильтр совпавших значений)
  • [!]pr=<size>[/prompt|noprompt] (RFC 2696 постраничный вывод результатов/запрос вывода)
  • [!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...] (RFC 2891 сортировка на стороне сервера)
  • [!]subentries[=true|false] (RFC 3672 подзаписи)
  • [!]sync=ro[/<cookie>] (RFC 4533 LDAP Sync refreshOnly)
    [!]sync=rp[/<cookie>][/<slimit>] (LDAP Sync refreshAndPersist)
  • [!]vlv=<before>/<after>(/<offset>/<count>|:<value>) (ldapv3-vlv-09 вид виртуального списка)
  • [!]deref=derefAttr:attr[,...][;derefAttr:attr[,...][;...]]
  • [!]<oid>[=:<b64value>] (общий контроль; нет обработки ответа)
-f file
Считать серию строк из файла file и выполнить по одному поиску LDAP для каждой строки. В этом случае заданный в командной строке фильтр filter интерпретируется как шаблон, в котором первое и только первое вхождение %s заменяется строкой из файла file. Любые другие вхождения символа % в шаблоне будут рассматриваться как ошибка. Если требуется, чтобы в поисковом фильтре присутствовал символ %, он должен быть закодирован как \25 (смотрите RFC 4515). Если в качестве значения file указан символ «-», то строки считываются со стандартного ввода.
-F prefix
URL-префикс для временных файлов (по умолчанию: file://path, где path либо /tmp/.private/<user>, либо значение, указанное в параметре -T)
-l limit
Ограничение на время поиска (в секундах). Значение 0 (ноль) или none означает, что ограничений нет. Значение max означает максимальное допустимое протоколом значение (целое число)
-L[LL]
Управление выводом результатов поиска в формате обмена данными LDAP (LDAP Data Interchange Format): -L — вывести ответы в формате LDIFv1, -LL — отключить вывод комментариев, -LLL — отключить вывод версии LDIF.
-M[M]
Включить элемент управления Manage DSA IT. -MM делает этот элемент управления критичным.
-P {2|3}
Версия протокола LDAP (по умолчанию 3)
-s {base|one|sub|children}
Задает область поиска. Может принимать одно из следующих значений: base, one, sub (по умолчанию) или children, что означает поиск только по базовому объекту, на одном уровне, по всему поддереву и по дочерним записям соответственно
-S attr
Отсортировать возвращаемые записи по атрибуту attr. По умолчанию возвращаемые записи не сортируются. Если в качестве attr задана строка нулевой длины (""), записи сортируются по компонентам их уникального имени Distinguished Name. По умолчанию ldapsearch выводит записи по мере их получения. При использовании параметра -S все данные сначала получаются, потом сортируются, потом выводятся.
-t[t]
При указании одного -t полученные непечатаемые значения записываются в набор временных файлов (полезно при работе со значениями, содержащими несимвольные данные, такими как jpegPhoto или audio). При указании второго -t все полученные значения записываются в файлы.
-T path
Временные файлы записываются в указанный в path каталог (по умолчанию /tmp/.private/<user>)
-u
Включить в вывод форму удобного для пользователя имени (User Friendly Name, UFN) уникального имени (Distinguished Name, DN)
-z limit
Ограничить количество возвращаемых в результате поиска записей значением limit. Значение 0 (ноль) или none означает, что ограничений нет. Значение max означает максимальное допустимое протоколом значение (целое число).
Общие параметры
-d debuglevel
Установить уровень отладки LDAP
-D binddn
Использовать указанное в binddn уникальное имя Distinguished Name при подсоединении к каталогу LDAP. При SASL-подсоединениях сервер будет игнорировать это значение.
-e [!]ext[=extparam]
Указывает общие расширения. Знак '!' обозначает критичность расширения.
Общие расширения:
  • [!]assert=<filter> (RFC 4528; фильтр RFC 4515)
  • [!]authzid=<authzid> (RFC 4370; "dn:<dn>" или "u:<user>")
  • [!]chaining[=<resolveBehavior>[/<continuationBehavior>]]
  • [!]manageDSAit (RFC 3296)
  • [!]noop
  • ppolicy
  • [!]postread[=<attrs>] (RFC 4527; разделённый запятыми список атрибутов)
  • [!]preread[=<attrs>] (RFC 4527; разделённый запятыми список атрибутов)
  • [!]relax
  • [!]sessiontracking
  • abandon, cancel, ignore (сигнал SIGINT посылает abandon/cancel, либо в ответ на него посылается ignore; если расширение помечено как критичное, сигнал SIGINT не принимается; ненастоящие элементы управления
-h host
Сервер LDAP
-H URI
Указывает URI (возможно, несколько), ссылающийся на LDAP-сервер (серверы). В URI допускаются поля: протокол/хост/порт.
-I
Использовать интерактивный режим SASL.
-n
Демонстрируется, что будет сделано, но реальный поиск не выполняется. Используется для отладки совместно с параметром -v
-N
Не использовать обратное разрешение DNS для получения канонического имени хоста SASL.
-O props
Параметры безопасности SASL
-o opt[=optparam]
Указывает опции общего назначения.
Возможные опции:
  • nettimeout=<timeout> (в секундах, либо «none» или «max»)
  • ldif-wrap=<width> (в символах, либо «no» для предотвращения переноса строк)
-p порт
Порт, на котором сервер LDAP принимает запросы. Номер порта по умолчанию — 389. Если номер порта не задан, и указан параметр -Z, то применяется номер порта LDAP SSL по умолчанию, равный 636.
-Q
Использовать тихий режим SASL. Запросы не выводятся никогда.
-R realm
Задаёт realm аутентификационного идентификатора для SASL. Форма realm зависит от того, какой механизм аутентификации в действительности используется.
-U authcid
Идентификатор аутентификации SASL. Форма идентификатора зависит от того, какой механизм аутентификации в действительности используется.
-v
Запустить в подробном режиме (диагностические сообщения посылаются в стандартный вывод)
-V[V]
Вывести информацию о версии. При указании -VV, после вывода информации о версии осуществляется выход. При указании -V, после вывода информации о версии выполняется поиск согласно заданным критериям.
-w passwd
Использовать указанное значение passwd в качестве пароля для простой аутентификации.
-W
Запрашивать ввод пароля для простой аутентификации (используется для того, чтобы не указывать пароль в командной строке).
-x
Использовать простую аутентификацию
-X authzid
Идентификатор авторизации SASL ("dn:<dn>" или "u:<user>")
-y file
Считать пароль из файла file.
В качестве пароля используется всё содержимое файла. Поэтому файл не должен содержать символа переноса строки.
-Y mech
Задаёт механизм SASL, который будет использоваться для аутентификации. Если параметр не указан, программа выберет лучший из известных серверу механизмов.
-Z[Z]
Запустить запрос TLS (-ZZ для запроса успешного ответа)

6.18.5.1. Фильтр

Фильтр должен быть указан в строковом формате фильтров LDAP (см. RFC 4515). Если фильтр не указан, используется фильтр по умолчанию (objectClass=*).
Синтаксис LDAP-фильтра имеет вид:
<Атрибут><оператор сравнения><значение>
Вместо имени атрибута можно использовать его идентификатор (Attribute-Id). Тело фильтра должно быть заключено в скобки.

Таблица 6.31. Примеры LDAP-фильтров

Запрос
LDAP фильтр
Все пользователи:
(sAMAccountType=805306368)
Отключенные (Disabled) пользователи:
(&(sAMAccountType=805306368)(useraccountcontrol:1.2.840.113556.1.4.803:=2))
Заблокированные (Locked) пользователи:
(&(sAMAccountType=805306368)(badPwdCount>=4))
Пользователи, у которых в настройках указано «Пароль никогда не истекает»
(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=65536))
Пользователи которые не меняли пароль с 5 мая 2023 года (см. https://www.epochconverter.com/ldap для преобразования даты во временную метку Windows)
(&(objectCategory=person)(pwdLastSet<=133278047990000000))
Пользователи с незаполненным полем mail
(&(objectCategory=group)(!(mail=*)))
Пользователи, которые должны сменить пароль при следующем входе в систему
(&(sAMAccountType=805306368)(pwdLastSet=0))
Пользователи с ограниченным сроком действия учетной записи
(&(sAMAccountType=805306368)(accountExpires>=1)(accountExpires<=9223372036854775806))
Пользователи, созданные за определенный период (формат даты: YYYY MM DD HH mm ss.s Z)
(&(sAMAccountType=805306368)(whenCreated>=20230401000000.0Z<=20230701000000.0Z))
Все компьютеры
(objectCategory=computer)
Все контроллеры домена
(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))
Контроллеры домена, доступные только для чтения
(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=67108864))
Группы, в которых нет пользователей
(&(objectCategory=group)(!(member=*)))
Группы, с ключевым словом admin в имени
(&(objectCategory=group)(samaccountname=*admin*))
Все группы безопасности (Security)
(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))
Все члены группы Sales (без учёта вложенности)
(memberOf=CN=Sales,CN=Users,DC=test,DC=alt)
Все члены группы Sales (с учётом вложенности)
(memberOf:1.2.840.113556.1.4.1941:=CN=Sales,CN=Users,DC=test,DC=alt)
Все группы, в которые входит пользователь testldap
(&(objectCategory=group)(member=CN=testldap,CN=Users,DC=test,DC=alt)))
Все подразделения (OU)
(objectCategory=organizationalUnit)
Все объекты групповой политики
(objectCategory=groupPolicyContainer)
Все отношения доверия
(objectClass=trustedDomain)
Объекты связанные с ролями FSMO
(fsMORoleOwner=*)
PDC Emulator
(&(objectClass=domainDNS)(fSMORoleOwner=*))
RID Master
(&(objectClass=rIDManager)(fSMORoleOwner=*))
Объект AD с определенным SID
(objectSID=S-1-5-21-1723588197-2340999690-1379671080-1105)

6.18.5.2. Формат вывода

Если найдена одна или несколько записей, то каждая запись передается в поток вывода в следующем формате:
Отличительное имя (DN)
имя_атрибута: значение
имя_атрибута: значение
имя_атрибута: значение
…
Записи разделяются пустыми строками.
Если задан параметр -t вместо реальных значений атрибутов будут выводиться URI временных файлов, в которые эти значения помещаются. Если задан параметр -A будут выводиться только имена атрибутов.

Примечание

Значение атрибута записывается в 7-битной кодировке ASCII и отделяется от его имени символом «:». Значения, не подходящие под эту кодировку, записываются в кодировке base64 и отделяются от имени атрибута символами «::»:
имя_атрибута:: base64_значение_атрибута
Например:
dn:: Q0490JfQsNC50YbQtdCy0LAg0J7Qu9GM0LPQsCxDTj1Vc2VycyxEQz10ZXN0LERDPWFsdA==
cn:: 0JfQsNC50YbQtdCy0LAg0J7Qu9GM0LPQsA==

…
$  echo "0JfQsNC50YbQtdCy0LAg0J7Qu9GM0LPQsA==" | base64 -d 
Зайцева Ольга

Чтобы отобразить строки в кодировке base64 можно использовать следующую команду:
$ ldapsearch -LLL -D testldap@test.alt -x -W | perl -MMIME::Base64 -MEncode=decode -n -00 -e 's/\n
+//g;s/(?<=:: )(\S+)/decode("UTF-8",decode_base64($1))/eg;print'

6.18.5.3. Примеры

Вывести всех пользователей, фамилия которых начинается с буквы «К»:
$ ldapsearch -LLL -H ldap://192.168.0.122:389 \
-D testldap@test.alt -b "dc=test,dc=alt" \
-x -W "(&(sAMAccountName=*)(sn=К*))" cn sn
где:
  • -H ldap://192.168.0.122:389 — сервер LDAP;
  • -D testldap@test.alt — пользователь с правом чтения в каталоге LDAP;
  • -b "dc=test,dc=alt" — контейнер AD, в котором будет выполняться поиск;
  • -x — использовать простую аутентификацию;
  • -W — спросить пароль;
  • "(&(sAMAccountName=*)(sn=К*))" — выражение, по которому будут отфильтрованы результаты;
  • cn sn — поля, которые необходимо вывести.
Параметры по умолчанию можно задать в файле /etc/openldap/ldap.conf, например:
BASE    dc=test,dc=alt
URI     ldap://dc1.test.alt
Команда с использованием базы поиска и URI по умолчанию:
$ ldapsearch -LLL -D testldap@test.alt \
-x -W "(&(sAMAccountName=*)(sn=К*))" cn sn
Вывести фамилию и электронную почту всех пользователей, из подразделения OU, у которых непустое поле mail:
$ ldapsearch -LLL -H ldap://192.168.0.122:389 \
-D testldap@test.alt -b "ou=OU,dc=test,dc=alt" -s one \
-x -W "(&(sAMAccountName=*)(mail=К*))" sn mail
В данном примере не будут выведены записи только из подразделения OU, но не из его дочерних подразделений.
Считать последовательность строк из файла new.filter и выполнить функцию поиска LDAP для каждой строки:
$ ldapsearch -H ldap://192.168.0.122:389 \ -D testldap@test.alt -b "dc=test,dc=alt" -x -W -f new.filter "(samaccountname=%s)" cn
Содержимое файла new.filter:
z*
ivanov
k*
*k
Команда выполняет поиск по поддереву для каждого фильтра, начиная с samaccountname=z*. Когда этот поиск завершается, начинается поиск для фильтра cn=ivanov и т.д. Пример вывода вышеуказанной команды с параметром -n:
 LDAPv3
# base <dc=test,dc=alt> with scope subtree
# filter pattern: (samaccountname=%s)
# requesting: dn
#

#
# filter: (samaccountname=z*)
#

#
# filter: (samaccountname=ivanov)
#

#
# filter: (samaccountname=k*)
#

#
# filter: (samaccountname=*k)
#