Как управлять и использовать серверы LDAP с помощью утилит OpenLDAP

Вступление

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

Предпосылки

Для начала вы должны иметь доступ к системе с установленным и настроенным OpenLDAP. Вы можете узнать, как настроить сервер OpenLDAP https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-openldap-and-phpldapadmin-on-an-ubuntu-14-04- сервер [здесь]. Вы должны быть знакомы с основной терминологией, используемой при работе со службой каталогов LDAP. This Guide можно использовать для более подробного ознакомления с этими темами.

Установка инструментов

Вышеуказанные предварительные условия предполагают, что у вас уже есть доступ к системе LDAP, но вы, возможно, еще не установили инструменты OpenLDAP, описанные в этом руководстве.

В системе Ubuntu или Debian вы можете установить эти инструменты через репозитории + apt +. Обновите локальный индекс пакета и установите его, набрав:

sudo apt-get update
sudo apt-get install ldap-utils

В CentOS или Fedora вы можете получить соответствующие файлы, используя + yum +. Установите их, набрав:

sudo yum install openldap-clients

После того, как вы установили правильные пакеты, продолжайте ниже.

Подключение к экземпляру LDAP

Большинство инструментов OpenLDAP являются чрезвычайно гибкими, жертвуя краткой структурой команд для возможности взаимодействия с системами в нескольких различных ролях. Из-за этого пользователь должен выбрать множество аргументов, чтобы выразить минимум, необходимый для подключения к серверу LDAP.

В этом разделе мы сосредоточимся на создании аргументов, необходимых для связи с сервером, в зависимости от типа операции, которую вы хотите выполнить. Обсуждаемые здесь аргументы будут использоваться в различных инструментах, но мы будем использовать + ldapsearch + для демонстрационных целей.

Указание сервера

Инструменты OpenLDAP требуют, чтобы вы указали метод аутентификации и местоположение сервера для каждой операции. Чтобы указать сервер, используйте флаг + -H +, за которым следуют протокол и сетевое расположение рассматриваемого сервера.

Для базового незашифрованного соединения схема протокола будет + ldap: // + следующим образом:

ldapsearch -H ldap:// . . .

Если вы общаетесь с локальным сервером, вы можете не указывать доменное имя или IP-адрес сервера (вам все равно необходимо указать схему).

Если вы используете LDAP через SSL для соединения с вашим сервером LDAP, вместо этого вы захотите использовать схему + ldaps: // + (обратите внимание, что это устаревший метод. Проект OpenLDAP рекомендует вместо этого использовать обновление STARTTLS на обычном порту LDAP. Узнайте, как настроить эту ссылку: [здесь]):

ldapsearch -H ldaps:// . . .

Эти протоколы предполагают порт по умолчанию («+ 389 » для обычного LDAP и « 636 +» для LDAP по SSL). Если вы используете нестандартный порт, вам нужно добавить его в конец с двоеточием и номером порта.

Чтобы подключиться к каталогу LDAP на сервере, к которому вы обращаетесь через Linux IPC (межпроцессное взаимодействие), вы можете использовать протокол + ldapi: // +. Это более безопасно и необходимо для некоторых задач администрирования:

ldapsearch -H ldapi:// . . .

Поскольку схема + ldapi + требует локального соединения, нам никогда не придется указывать здесь имя сервера. Однако, если вы изменили расположение файла сокета в конфигурации сервера LDAP, вам нужно будет указать новое расположение сокета как часть адреса.

Анонимный Bind

LDAP требует, чтобы клиенты идентифицировали себя, чтобы сервер мог определять уровень доступа к запросам на предоставление. Это работает с использованием механизма LDAP, называемого «привязка», который по сути является просто термином, связывающим ваш запрос с известным объектом безопасности. Существует три отдельных типа аутентификации, которые понимает LDAP.

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

Инструменты OpenLDAP предполагают SASL-аутентификацию (мы обсудим это мгновенно) по умолчанию, поэтому, чтобы разрешить анонимное связывание, мы должны дать аргумент + -x +. В сочетании со спецификацией сервера это будет выглядеть примерно так:

ldapsearch -H ldap:// -x

Если вы введете это без предоставления дополнительных аргументов, вы должны получить что-то вроде этого:

Вывод для ldapsearch с анонимной привязкой

# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

Это говорит о том, что инструмент не нашел то, что мы искали. Так как мы не предоставили параметры запроса, это ожидаемо, но оно показывает нам, что сервер принял наше анонимное связывание.

Простая аутентификация

Второй способ аутентификации на сервере LDAP - это простая привязка. Простое связывание использует запись на сервере LDAP для аутентификации запроса. DN (отличительное имя) записи функционирует как имя пользователя для аутентификации. Внутри записи атрибут определяет пароль, который должен быть предоставлен во время запроса.

Нахождение корневого входа DIT и привязки RootDN

Для аутентификации с использованием простой аутентификации вам необходимо знать родительский элемент в верхней части иерархии DIT, который называется корневой, базовой или суффиксной записью, в которую помещаются все остальные записи. Вы также должны знать DN для привязки.

Как правило, во время установки сервера LDAP начальный DIT устанавливается и настраивается с административной записью, называемой rootDN, и паролем. При запуске это будет единственный DN, который настроен для привязок.

Если вы не знаете корневую запись сервера LDAP, к которому вы подключаетесь, вы можете запросить специальную «мета» запись вне обычного DIT LDAP для получения информации о том, о каких корневых записях DIT он знает (это называется корневым DSE). , Вы можете запросить эту запись для имен DIT, набрав:

ldapsearch -H ldap:// -x -LLL -s base -b "" namingContexts

Сервер LDAP должен вернуть корневые записи, о которых он знает, что будет выглядеть примерно так:

Результаты корневых записей LDAP

dn:
namingContexts:

Выделенная область является корнем DIT. Мы можем использовать это для поиска записи для привязки. Запись администратора обычно использует объектный класс + simpleSecurityObject +, чтобы получить возможность установить пароль в записи. Мы можем использовать это для поиска записей с этим классом:

ldapsearch -H ldap:// -x -LLL -b "" "(objectClass=simpleSecurityObject)" dn

Это даст вам список записей, которые используют этот класс. Обычно есть только один:

Результаты поиска simpleSecurityObject

dn:

Это учетная запись rootDN, к которой мы можем привязаться. Вы должны были настроить пароль для этой учетной записи во время установки сервера. Если вы не знаете пароль, вы можете воспользоваться this guide, чтобы сбросить пароль ,

Выполнять связывание

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

Опять же, нам нужно будет указать местоположение сервера LDAP и предоставить флаг + -x +, чтобы указать, что мы не хотим использовать аутентификацию SASL. Чтобы выполнить фактическое связывание, нам нужно будет использовать флаг + -D +, чтобы указать DN для привязки, и предоставить пароль с помощью команды + -w + или + -W +. Опция + -w + позволяет вам ввести пароль как часть команды, тогда как опция + -W + предложит вам ввести пароль.

Пример привязки запроса к rootDN будет выглядеть так:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -W

Мы должны получить тот же результат, что и наша анонимная привязка, указывая, что наши учетные данные были приняты. Привязка к записи часто дает вам дополнительные привилегии, которые недоступны через анонимную привязку. Привязка к rootDN дает вам доступ на чтение / запись ко всему DIT, независимо от контроля доступа.

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

SASL обозначает простой уровень аутентификации и безопасности. Это структура для соединения методов аутентификации с протоколами, чтобы обеспечить гибкую систему аутентификации, которая не привязана к конкретной реализации. Вы можете проверить страницу wikipedia, чтобы узнать о различных доступных методах.

Ваш LDAP-сервер, вероятно, будет поддерживать только подмножество возможных механизмов SASL. Чтобы узнать, какие механизмы это позволяет, вы можете набрать:

ldapsearch -H ldap:// -x -LLL -s base -b "" supportedSASLMechanisms

Результаты, которые вы видите, будут отличаться в зависимости от схемы, которую вы использовали для подключения. Для незашифрованной схемы + ldap: // + большинство систем по умолчанию разрешают:

ldap: // SupportedSASLMechanisms

dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5

Если вы используете схему + ldapi: // +, которая использует безопасное межпроцессное взаимодействие, у вас, вероятно, будет расширенный список вариантов:

ldapsearch -H ldapi:// -x -LLL -s base -b "" supportedSASLMechanisms

ldapi: // SupportedSASLMechanisms

dn:
supportedSASLMechanisms: DIGEST-MD5
supportedSASLMechanisms: EXTERNAL
supportedSASLMechanisms: NTLM
supportedSASLMechanisms: CRAM-MD5
supportedSASLMechanisms: LOGIN
supportedSASLMechanisms: PLAIN

Настройка большинства методов аутентификации SASL может занять некоторое время, поэтому мы не будем здесь подробно останавливаться на этом. Хотя аутентификация SASL, как правило, выходит за рамки этой статьи, нам следует поговорить о методе + EXTERNAL +, который мы видим доступным для использования со схемой + ldapi: // +.

Механизм + EXTERNAL + указывает, что аутентификация и безопасность обрабатываются некоторыми другими средствами, связанными с соединением. Например, его можно использовать с SSL для обеспечения шифрования и аутентификации.

Чаще всего вы увидите, что он используется с интерфейсом + ldapi: // + с пользователями root или + sudo +. Поскольку + ldapi: // + использует сокеты Unix, пользователь, инициирующий запрос, может быть получен и использован для аутентификации для определенных операций. DIT, который LDAP использует для конфигурации, использует этот механизм для аутентификации пользователя root для чтения и внесения изменений в LDAP. Эти запросы выглядят примерно так:

sudo ldapsearch -H ldapi:// -Y EXTERNAL . . .

Это используется для изменения конфигурации LDAP, которая обычно хранится в DIT, начиная с корневой записи + cn = config +.

Настройка файла .ldaprc

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

Глобальный файл конфигурации клиента находится по адресу + / etc / ldap / ldap.conf +, но вы в основном захотите добавить изменения в файл конфигурации вашего пользователя, расположенный в вашем домашнем каталоге по адресу + + / .ldaprc +. Создайте и откройте файл с этим именем в текстовом редакторе:

nano ~/.ldaprc

Внутри, основные настройки, которые вы, вероятно, хотите настроить: + BASE +, + URI + и + BINDDN +:

  • * + BASE + *: Базовый DN по умолчанию, используемый для указания записи, с которой должен начинаться поиск. Это будет отменено, если в командной строке будет указана другая база поиска (подробнее об этом мы узнаем в следующем разделе).

  • * + URI + *: адрес, по которому можно связаться с сервером LDAP. Это должно включать схему (+ ldap + для обычного LDAP, + ldaps + для LDAP через SSL и + ldapi + для LDAP через сокет IPC), за которым следуют имя и порт сервера. Имя можно оставить неактивным, если сервер расположен на той же машине, а порт можно отключить, если сервер работает на порте по умолчанию для выбранной схемы.

  • * + BINDDN + *: Указывает запись LDAP по умолчанию для привязки. Это используется для предоставления информации «учетной записи» для доступа, который вы хотите использовать. Вам все равно нужно будет указать любой пароль в командной строке.

Это позаботится о простой информации аутентификации. Если вы используете аутентификацию SASL, проверьте + man ldap.conf +, чтобы увидеть параметры для настройки учетных данных SASL.

Если нашей базовой записью LDAP является + dc = пример, dc = com +, сервер расположен на локальном компьютере, и мы используем + cn = admin, dc = пример, dc = com + для привязки, мы может иметь файл + ~ / .ldaprc +, который выглядит следующим образом:

~ / .Ldaprc

BASE    dc=example,dc=com
URI     ldap://
BINDDN  cn=admin,dc=example,dc=com

Используя это, мы могли бы выполнить основной поиск, просто указав не-SASL-аутентификацию и предоставив пароль, связанный с записью администратора. Это обеспечит полный поиск в поддереве базового DN по умолчанию, который мы указали:

ldapsearch -x -w

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

Использование ldapsearch для запроса записей DIT и Lookup

Теперь, когда мы хорошо разбираемся в том, как проходить аутентификацию и указывать сервер LDAP, мы можем немного больше поговорить о реальных инструментах, которые есть в вашем распоряжении. Для большинства наших примеров мы предполагаем, что выполняем эти операции на том же сервере, на котором размещен сервер LDAP. Это означает, что наша спецификация хоста будет пустой после схемы. Мы также предполагаем, что базовая запись DIT, которой управляет сервер, предназначена для + dc = example, dc = com +. Корневое имя будет + cn = admin, dc = пример, dc = com +. Давайте начнем.

Мы начнем с + ldapsearch +, поскольку до сих пор использовали его в наших примерах. Системы LDAP оптимизированы для операций поиска, чтения и поиска. Если вы используете каталог LDAP, большинство ваших операций будут, вероятно, поиском или поиском. Инструмент + ldapsearch + используется для запроса и отображения информации в DIT LDAP.

Мы рассмотрели часть синтаксиса, который отвечает за присвоение имен и подключение к серверу, который выглядит примерно так:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -W

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

База поиска и область применения

В LDAP место, где начинается поиск, называется * база поиска *. Это запись в DIT, с которой начнется операция, и она будет действовать как якорь. Мы определяем базу поиска, передавая имя записи с флагом + -b +.

Например, чтобы начать с корня нашего примера + dc =, dc = com + DIT, мы можем использовать его в качестве базы поиска, например:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -b "dc=example,dc=com"

Эта команда должна создавать каждую запись под примером + dc =, dc = com +, к которой у пользователя, с которым вы связаны, есть доступ. Если мы используем другую запись, получим другой раздел дерева. Например, если мы начнем с записи администратора, вы можете получить только запись администратора:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -b "cn=admin,dc=example,dc=com"

база поиска в cn = admin, dc = пример, dc = com

# extended LDIF
#
# LDAPv3
# base <cn=admin,dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# admin, example.com
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9ejN2UmHoRjdha09tQY96TC9IN0kxYUVCSjhLeXBsc3A=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Мы указали базу в этих примерах, но мы можем дополнительно сформировать способ, которым инструмент ищет результаты, указав область поиска. Этот параметр устанавливается параметром + -s + и может быть любым из следующих:

  • * + sub + *: область поиска по умолчанию, если не указано иное. Это ищет саму базовую запись и любых потомков на всем пути вниз по дереву. Это самая большая сфера.

  • * + base + *: Это только поиск самой базы поиска. Он используется для возврата записи, указанной в базе поиска и лучше определенной как поиск, чем поиск.

  • * + one + *: поиск только непосредственных потомков / потомков базы поиска (один уровень иерархии ниже базы поиска). Это не включает саму поисковую базу и не включает поддерево ниже любой из этих записей.

  • * + children + *: эта функция работает так же, как область видимости + sub +, но она не включает в себя саму базу поиска (ищет каждую запись ниже, но не включает базу поиска).

Используя флаг + -s + и флаг + -b +, мы можем начать формировать области DIT, в которые мы хотим, чтобы инструмент смотрел. Например, мы можем видеть всех дочерних элементов первого уровня нашей базовой записи, используя область видимости + one +, например:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -b "dc=example,dc=com" -s one -LLL dn

Мы добавили + -LLL dn + в конец, чтобы немного отфильтровать вывод. Мы обсудим это позже в этой статье. Если бы мы добавили еще несколько записей в дерево, это могло бы привести к следующим результатам:

выход

dn: cn=admin,dc=example,dc=com

dn: ou=groups,dc=example,dc=com

dn: ou=people,dc=example,dc=com

Если бы мы хотели видеть все под записью + ou = people +, мы могли бы установить это как базу поиска и использовать область видимости + children +:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -b "ou=people,dc=example,dc=com" -s children -LLL dn

Изменяя базу поиска и область поиска, вы можете работать только с теми частями DIT, которые вас интересуют. Это улучшит ваш запрос, выполнив поиск только в разделе дерева, и вернет только те записи, которые вас интересуют.

Удаление постороннего вывода

Прежде чем двигаться дальше, давайте поговорим о том, как удалить некоторые дополнительные выходные данные, которые создает + ldapsearch +.

Большая часть дополнительного вывода контролируется флагами + -L +. Вы можете использовать от нуля до трех флагов + -L + в зависимости от уровня вывода, который вы хотели бы видеть. Чем больше флагов + -L + вы добавите, тем больше информации будет подавлено. Это может быть хорошей идеей воздерживаться от подавления любых выходных данных при обучении или устранении неполадок, но при нормальной работе использование всех трех уровней, вероятно, приведет к лучшему опыту.

Если вы используете аутентификацию SASL, при изменении, например, + cn = config + DIT, вы можете дополнительно использовать флаг + -Q +. Это включит тихий режим SASL, который удалит все выходные данные, связанные с SASL. Это хорошо при использовании метода + -Y EXTERNAL +, но будьте осторожны, если вы используете механизм, который запрашивает учетные данные, потому что это также будет подавлено (что приведет к ошибке аутентификации).

Фильтры поиска и фильтры выходных атрибутов

Чтобы фактически выполнить поиск, а не просто выводить всю область поиска, вам нужно указать поисковый фильтр.

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

В качестве примера мы могли видеть, есть ли запись в примере + dc =, dc = com + DIT с атрибутом имени пользователя (+ uid +), установленным в «jsmith». При этом выполняется поиск в каждой записи в области поиска атрибута, для которого установлено это значение:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -b "dc=example,dc=com" -LLL "(uid=jsmith)"

В приведенном выше примере мы использовали оператор равенства, который проверяет точное совпадение значения атрибута. Существуют и другие операторы, которые работают так, как вы ожидаете. Например, для поиска записей, которые contain атрибут, не заботясь о наборе значений, вы можете использовать оператор «присутствие», который является просто знаком равенства с подстановочным знаком в правой части сравнения. Мы могли бы искать записи, содержащие пароль, набрав:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -b "dc=example,dc=com" -LLL "(userPassword=*)"

Вот некоторые полезные поисковые фильтры:

  • * Equality *: Использует оператор + = + для точного совпадения значения атрибута.

  • * Presence *: использует + = * + для проверки существования атрибута без учета его значения.

  • * Больше или равно *: Использует оператор +> = + для проверки значений, больших или равных данному значению.

  • * Меньше или равно *: использует оператор + ⇐ + для проверки значений, меньших или равных данному значению.

  • * Substring *: использует + = + со строкой и подстановочный знак + * + как часть строки. Используется для указания части значения, которое вы ищете.

  • * Близость *: Использует оператор + ~ = +, чтобы приблизительно соответствовать тому, что справа. Это не всегда поддерживается сервером LDAP (в этом случае вместо него будет выполняться поиск равенства или подстроки).

Вы также можете отменить большинство поисков, заключив поисковый фильтр в дополнительный набор скобок с префиксом «!». Например, для поиска всех записей организационной единицы мы могли бы использовать этот фильтр:

"(ou=*)"

Для поиска всех записей, которые не являются записями организационной единицы, мы могли бы использовать этот фильтр:

"(!(ou=*)"

Модификатор отрицания меняет значение поискового фильтра, который следует.

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

Например, мы можем искать все записи, которые имеют идентификаторы пользователей, но отображать только связанное компонентное имя каждой записи, набрав:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -b "dc=example,dc=com" -LLL "(uid=*)" cn

Это может создать список, который выглядит следующим образом:

Выход

dn: uid=bwright,ou=People,dc=example,dc=com
cn: Brian Wright

dn: uid=jsmith1,ou=People,dc=example,dc=com
cn: Johnny Smith

dn: uid=sbrown2,ou=People,dc=example,dc=com
cn: Sally Brown

Если мы хотим увидеть описание их записи, мы можем просто добавить это в список отображаемых атрибутов:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -b "dc=example,dc=com" -LLL "(uid=*)" cn description

Вместо этого будет показано что-то вроде этого:

Выход

dn: uid=bwright,ou=People,dc=example,dc=com
cn: Brian Wright
description: Brian Wright from Marketing.  Brian takes care of marketing, pres
s, and community.  Ask him for help if you need any help with outreach.

dn: uid=jsmith1,ou=People,dc=example,dc=com
cn: Johnny Smith
description: Johnny Smith from Accounting.  Johnny is in charge of the company
 books and hiring within the Accounting department.

dn: uid=sbrown2,ou=People,dc=example,dc=com
cn: Sally Brown
description: Sally Brown from engineering.  Sally is responsible for designing
 the blue prints and testing the structural integrity of the design.

Если фильтр атрибутов не задан, возвращаются все атрибуты. Это можно сделать явно с помощью символа «*». Чтобы вернуть операционные атрибуты (специальные атрибуты метаданных, управляемые в фоновом режиме для каждой записи), вы можете использовать специальный символ «+». Например, чтобы увидеть рабочие атрибуты для нашего rootDN, мы могли бы набрать:

ldapsearch -H ldap:// -x -D "cn=admin,dc=example,dc=com" -b "dc=example,dc=com" -LLL "(cn=admin)" "+"

Результаты будут выглядеть примерно так:

Выход

dn: cn=admin,dc=example,dc=com
structuralObjectClass: organizationalRole
entryUUID: cdc718a0-8c3c-1034-8646-e30b83a2e38d
creatorsName: cn=admin,dc=example,dc=com
createTimestamp: 20150511151904Z
entryCSN: 20150514191233.782384Z#000000#000#000000
modifiersName: cn=admin,dc=example,dc=com
modifyTimestamp: 20150514191233Z
entryDN: cn=admin,dc=example,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE

Поиск соединения

Сложный поиск включает в себя объединение двух или более отдельных поисковых фильтров для получения более точных результатов. Фильтры поиска объединяются, заключая их в другой набор скобок с реляционным оператором в качестве первого элемента. Это легче продемонстрировать, чем объяснить.

Реляционные операторы - это символ «&», который работает как логическое И, и символ «|», который обозначает логическое ИЛИ. Они предшествуют фильтрам, чьи отношения они определяют во внешнем наборе скобок.

Таким образом, чтобы найти запись, которая имеет описание и адрес электронной почты в нашем домене, мы могли бы создать фильтр следующим образом:

"(&(description=*)(mail=*@example.com))"

Чтобы запись была возвращена, в ней должны быть определены оба этих атрибута.

Символ ИЛИ вернет результаты, если любой из подфильтров верен. Если мы хотим вывести записи, для которых у нас есть контактная информация, мы можем попробовать фильтр следующим образом:

"(|(telephoneNumber=*)(mail=*)(street=*))"

Здесь мы видим, что оператор может применять более двух подфильтров. Мы также можем вкладывать эти логические конструкции по мере необходимости для создания довольно сложных шаблонов.

Использование ldapmodify и Variations для изменения или создания записей LDAP

До сих пор мы фокусировались исключительно на команде + ldapsearch +, которая полезна для поиска, поиска и отображения записей и сегментов ввода в LDAP DIT. Это удовлетворит требования большинства пользователей только для чтения, но нам нужен другой инструмент, если мы хотим изменить объекты в DIT.

Команда + ldapmodify + управляет DIT посредством использования файлов LDIF. Вы можете узнать больше о файлах LDIF и особенностях их использования для изменения или добавления записей, просмотрев https://www.digitalocean.com/community/tutorials/how-to-use-ldif-files-to-make. -changes-to-an-openldap-system [это руководство].

Базовый формат + ldapmodify + близко соответствует синтаксису + ldapsearch +, который мы использовали в этом руководстве. Например, вам все равно нужно будет указать сервер с флагом + -H +, аутентифицироваться с использованием флага + -Y + для аутентификации SASL или + -x +, + -D + и `+ - [W | w] + `флаги для простой аутентификации.

Применение изменений из файла LDIF

После предоставления этих стандартных параметров наиболее распространенным действием является чтение файла LDIF и его применение к DIT. Это можно сделать с помощью опции + -f + (если вы не используете опцию + -f +, вам нужно будет ввести изменение, используя формат LDIF в командной строке). Вам нужно будет создать файл LDIF самостоятельно, используя синтаксис, описанный в руководстве, указанном выше:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -f

Это прочитает файл LDIF и применит изменения, указанные в. Для команды + ldapmodify + в каждом изменении LDIF должен быть указан + changetype +. Команда + ldapmodify + является наиболее общей формой команд манипуляции DIT.

Если ваш LDIF-файл добавляет новые записи и _ не включает_ + changetype: add + для каждой записи, вы можете использовать флаг + -a + с + ldapmodify + или просто использовать команду + ldapadd +, которая в основном псевдонимы этого поведения. Например, файл LDIF, который include + changetype + будет выглядеть так:

LDIF с измененным типом

dn: ou=newgroup,dc=example,dc=com

objectClass: organizationalUnit
ou: newgroup

Чтобы обработать этот файл, вы можете просто использовать + ldapmodify +:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -f

Тем не менее, файл также может быть создан without + changetype + `, например так:

LDIF без изменения типа

dn: ou=newgroup,dc=example,dc=com
objectClass: organizationalUnit
ou: newgroup

В этом случае, чтобы добавить эту запись в DIT, вам нужно либо использовать флаг + -a + с + ldapmodify +, либо использовать команду + ldapadd +. Или:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w   -f

Или это:

-H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -f

Аналогичные команды доступны для удаления записей (+ ldapdelete +) и перемещения записей LDAP (+ ldapmodrdn +). Использование этих команд избавляет от необходимости явно указывать в файлах + changetype: delete + и + changetype: modrdn + соответственно. Для каждого из них вам решать, какой формат использовать (указывать ли изменение в файле LDIF или в командной строке).

Тестирование изменений и обработка ошибок

Если вы хотите выполнить пробный запуск любого файла LDIF, вы можете использовать флаги + -n + и + -v +. Это скажет вам, какое изменение будет выполнено без изменения фактического DIT:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w   -f

Как правило, если при обработке файла LDIF возникает ошибка, операция немедленно останавливается. Как правило, это самое безопасное, потому что часто запросы на изменение в файле изменяют DIT в предположении, что предыдущие изменения были применены правильно.

Однако, если вы хотите, чтобы команда продолжала работу с файлом, пропуская изменения, вызывающие ошибки, вы можете использовать флаг + -c +. Возможно, вы также захотите использовать флаг + -S +, чтобы указать файл, в который могут быть записаны ошибки, чтобы вы могли исправить ошибочные запросы и перезапустить их:

ldapmodify -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w   -f

Таким образом, у вас будет журнал (с комментариями, указывающими ошибочные записи) для оценки после операции.

Различные другие команды LDAP

Команды, которые мы уже рассмотрели, выполняют наиболее распространенные операции LDAP, которые вы будете использовать ежедневно. Есть еще несколько команд, о которых полезно знать.

ldappasswd

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

Старый пароль следует указывать либо с помощью флага + -a + (старый пароль указывается в строке как следующий элемент), либо с помощью флага + -A + (запрашивается старый пароль), либо с помощью `+ -t + `флаг (старый пароль читается из файла, указанного как следующий элемент). Это необязательно для некоторых реализаций LDAP, но требуется для других, поэтому лучше включить.

Новый пароль должен быть указан с помощью флага + -s + (новый пароль указывается в строке как следующий элемент), флага + -S + (запрашивается новый пароль) или `+ -T + `флаг (новый пароль читается из файла, заданного как следующий элемент).

Таким образом, типичное изменение может выглядеть так:

ldappasswd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -a  -s

Если запись не указана, запись, которая используется для привязки, будет изменена. Если вы привязываетесь к административной записи, вы можете изменить другие записи, к которым у вас есть права на запись, указав их после команды.

ldappasswd -H ldap:// -x -D "cn=admin,dc=example,dc=com" -w  -a  -s  ""

Чтобы узнать больше об изменении и сбросе паролей, ознакомьтесь с this guide.

ldapwhoami

Команда + ldapwhoami + может рассказать вам, как сервер LDAP видит вас после аутентификации.

Если вы используете анонимную или простую аутентификацию, результаты, вероятно, будут не слишком полезными («анонимная» или точно запись, к которой вы привязываете, соответственно). Однако для аутентификации SASL это может помочь понять, как выглядит ваш механизм аутентификации.

Например, если мы используем механизм + -Y EXTERNAL + SASL с + sudo + для выполнения операций над + cn = config + DIT, мы можем проверить с помощью + ldapwhoami +, чтобы увидеть DN аутентификации:

sudo ldapwhoami -H ldapi:// -Y EXTERNAL -Q

вывод ldapwhoami

dn:gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth

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

ldapurl

Инструмент + ldapurl + позволяет вам создавать URL-адреса LDAP, указывая различные компоненты, включенные в ваш запрос. URL-адреса LDAP - это способ запроса ресурсов с сервера LDAP через стандартизированный URL-адрес. Это неаутентифицированные соединения, доступные только для чтения. Многие решения LDAP больше не поддерживают URL-адреса LDAP для запроса ресурсов, поэтому их использование может быть ограничено в зависимости от используемого вами программного обеспечения.

Стандартный URL-адрес LDAP отформатирован с использованием следующего синтаксиса:

ldap://:/????

Компоненты следующие:

  • + base_dn +: базовый DN, с которого начинается поиск.

  • + attr_to_return +: атрибуты соответствующих объектов, которые вас интересуют. Они должны быть разделены запятыми.

  • + search_scope +: область поиска. Либо база, саб, один, либо дети.

  • + filter +: поисковый фильтр, используемый для выбора записей, которые должны быть возвращены.

  • + extension: + Расширения LDAP, которые вы хотите указать. Мы не будем освещать это здесь.

Каждый из пунктов в URL разделен знаком вопроса. Вам не нужно указывать элементы, которые вы не используете, но поскольку тип элемента определяется по его положению в строке, вы должны оставить «слот» пустым для этого элемента, что оставит вас с несколькими вопросительными знаками в ряд. Вы можете остановить URL, как только добавите свою информацию (вам не нужны знаки вопроса в конце, чтобы обозначать неиспользуемые «слоты»).

Например, URL может выглядеть следующим образом:

ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)

Если бы вы передавали это в инструмент + ldapurl +, вы бы использовали флаг + -H + и поместили URL в кавычки:

ldapurl -H "ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)"

Команда разбила бы его на части так:

вывод ldapurl

scheme: ldap
host: localhost
port: 389
dn: dc=chilidonuts,dc=tk
selector: dn
selector: ou
scope: sub
filter: (ou=*)

Вы также можете использовать эти флаги для обратного процесса и объединения URL-адреса LDAP. Они отражают различные компоненты URL-адреса LDAP:

  • + -S +: схема URL (+ ldap +, + ldaps + или + ldapi +). Схема + ldap + используется по умолчанию.

  • + -h +: имя или адрес сервера LDAP

  • + -p +: порт сервера LDAP. Значение по умолчанию будет зависеть от схемы.

  • + -b +: базовый DN для запуска запроса

  • + -a +: список разделенных запятыми атрибутов для возврата

  • + -s +: область поиска для использования (базовая, подчиненная, дочерняя или одна)

  • + -f +: фильтр LDAP для выбора возвращаемых записей

  • + -e +: расширения LDAP для указания

Используя их, вы можете напечатать что-то вроде этого:

ldapurl -h localhost -b "dc=example,dc=com" -a dn,ou -s sub -f "(ou=*)"

Команда вернет созданный URL, который будет выглядеть следующим образом:

вывод ldapurl

ldap://localhost:389/dc=example,dc=com?dn,ou?sub?(ou=*)

Это можно использовать для создания URL-адресов, которые можно использовать с клиентом LDAP, способным взаимодействовать с использованием этого формата.

ldapcompare

Инструмент + ldapcompare + может использоваться для сравнения атрибута записи со значением. Это используется для выполнения простых проверок утверждений для проверки данных.

Процесс включает в себя связывание, как обычно, в зависимости от запрашиваемых данных, предоставление DN записи и подтверждения для проверки. Утверждение дается путем указания атрибута, а затем значения, разделенного одним или двумя двоеточиями. Для простых строковых значений следует использовать один двоеточие. Двойное двоеточие означает, что задано значение в кодировке base64.

Таким образом, вы можете утверждать, что Джон является членом группы «powerusers» примерно так:

ldapcompare -H ldap:// -x "ou=powerusers,ou=groups,dc=example,dc=com" "member:uid=john,ou=people,dc=example,dc=com"

Если он в группе, он вернет + TRUE +. Если нет, команда вернет + FALSE. Если DN, используемый для связывания, не имеет достаточных привилегий для чтения рассматриваемого атрибута, он вернет + UNDEFINED +.

Это может быть использовано в качестве основы для системы авторизации путем проверки членства в группе до выполнения запрошенных действий.

Заключение

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