Использование LDAP-клиента

Рейтинг: 71.7% · 16 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Использование LDAP-клиента

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2]
  6. Управление модулями ядра в рантайме [201.3]
  7. Кастомизация запуска системы [202.1]
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1]
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3]
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента (вы здесь)
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2]
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1]
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3]
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 32. Использование LDAP-клиента

Раньше или позже инженер упирается в задачу: один источник учётных записей, групп, хостов и сертификатов на всю инфраструктуру вместо россыпи локальных /etc/passwd. Этим источником почти всегда оказывается LDAP-каталог (OpenLDAP, FreeIPA, Active Directory). В этом уроке мы не поднимаем сервер - его разбирает соседняя тема - а учимся быть грамотным клиентом: понимать, как устроен каталог, и уверенно читать и менять записи утилитами ldapsearch, ldapadd, ldapmodify и ldapdelete. Это ровно объект 210.3 и навык, который пригодится при настройке SSSD, почты, Samba и любого сервиса с централизованной аутентификацией.

Изображение

Как это работает

LDAP - это не база в привычном смысле, а протокол доступа к древовидному каталогу. Данные лежат в дереве, которое называют DIT (Directory Information Tree). Каждый лист и каждая ветка - это запись (entry), и у каждой записи есть уникальный путь от корня - DN (Distinguished Name). DN читается справа налево, от корня к листу, например cn=anna,ou=people,dc=cyberlake,dc=ru. Самый левый кусок, cn=anna, это RDN (Relative DN) - имя записи относительно её родителя. RDN обязан быть уникальным среди соседей, иначе путь перестанет быть однозначным.

Внутри записи лежат атрибуты в форме имя: значение. Атрибут может быть многозначным: у одного пользователя несколько mail или несколько memberOf. Какие атрибуты разрешены и какие обязательны, диктует objectClass - это как тип записи. Структурный objectClass (например inetOrgPerson) задаёт каркас, вспомогательные (auxiliary, например posixAccount) досыпают атрибуты для конкретной задачи, скажем UID и домашний каталог для входа в Linux. Схема каталога - это правила игры: попытка положить атрибут, не предусмотренный ни одним objectClass записи, отлетит с ошибкой objectClass violation.

Чтобы каталог тебя послушал, нужно представиться - это операция bind (привязка). Анонимный bind часто разрешён только на чтение публичных полей. Для записи нужен аутентифицированный bind: simple - это DN плюс пароль открытым текстом (поэтому строго поверх TLS), либо SASL - механизмы вроде EXTERNAL (по сертификату или по unix-сокету от root) или GSSAPI (Kerberos). После bind сервер проверяет ACL и решает, что тебе видно и что можно менять.

Обмен записями между человеком и каталогом идёт в текстовом формате LDIF (LDAP Data Interchange Format). Это простой текст: блок начинается со строки dn:, дальше атрибуты, блоки разделяются пустой строкой. Тот же LDIF используется и для описания изменений - тогда добавляется строка changetype со значением add, modify или delete. Понимать LDIF обязательно: и ldapadd, и ldapmodify читают именно его.

Команды и примеры

Сначала ставим клиентские утилиты. Пакеты называются по-разному:

Код: Выделить всё

# Debian 13 / Ubuntu 24.04
sudo apt install ldap-utils

# RHEL 10 / Fedora 41+
sudo dnf install openldap-clients
Базовый поиск. Ключ -x просит simple bind (без -x пойдёт SASL), -H задаёт URI сервера, -b - точку старта поиска (search base), -D и -W - DN для привязки и запрос пароля интерактивно:

Код: Выделить всё

ldapsearch -x -H ldap://dir.cyberlake.ru \
  -D "cn=admin,dc=cyberlake,dc=ru" -W \
  -b "ou=people,dc=cyberlake,dc=ru" \
  "(uid=anna)" cn mail uidNumber
Строка в скобках - это фильтр в префиксной нотации RFC 4515. Несколько частых форм:

Код: Выделить всё

(uid=anna)                     один атрибут
(objectClass=posixAccount)     все учётки POSIX
(&(objectClass=person)(mail=*))   И: персона и почта задана
(|(uid=anna)(uid=ivan))           ИЛИ
(!(memberOf=cn=blocked,...))      НЕ
(cn=an*)                          подстановка
Перечисленные после фильтра имена (cn mail uidNumber) ограничивают вывод этими атрибутами. Полезные ключи: -LLL убирает служебные комментарии и версию (чистый LDIF), -s base|one|sub задаёт глубину (только сама база, один уровень, всё поддерево), -ZZ требует StartTLS и валит запрос, если шифрование не поднялось.

Чтобы каждый раз не писать -H и -b, заводим клиентский конфиг. В Debian это /etc/ldap/ldap.conf, в RHEL/Fedora - /etc/openldap/ldap.conf (или ~/.ldaprc для своего):

Код: Выделить всё

BASE    dc=cyberlake,dc=ru
URI     ldaps://dir.cyberlake.ru
TLS_CACERT /etc/ssl/certs/cyberlake-ca.crt
После этого ldapsearch -x "(uid=anna)" подставит BASE и URI сам.

Добавление записи. Готовим LDIF-файл и скармливаем ldapadd (это тот же ldapmodify с подразумеваемым changetype: add):

Код: Выделить всё

# new.ldif
dn: uid=petr,ou=people,dc=cyberlake,dc=ru
objectClass: inetOrgPerson
objectClass: posixAccount
uid: petr
cn: Petr Sokolov
sn: Sokolov
uidNumber: 10005
gidNumber: 10000
homeDirectory: /home/petr
mail: petr@cyberlake.ru

Код: Выделить всё

ldapadd -x -D "cn=admin,dc=cyberlake,dc=ru" -W -f new.ldif
Изменение. Здесь LDIF описывает операцию, а не конечное состояние:

Код: Выделить всё

# mod.ldif
dn: uid=petr,ou=people,dc=cyberlake,dc=ru
changetype: modify
replace: mail
mail: petr.sokolov@cyberlake.ru
-
add: mail
mail: p.sokolov@cyberlake.ru

Код: Выделить всё

ldapmodify -x -D "cn=admin,dc=cyberlake,dc=ru" -W -f mod.ldif
Дефис на отдельной строке разделяет несколько операций над одной записью. Действия: add (добавить значение), replace (заменить все значения атрибута), delete (удалить значение или весь атрибут).

Удаление записи целиком - по DN:

Код: Выделить всё

ldapdelete -x -D "cn=admin,dc=cyberlake,dc=ru" -W \
  "uid=petr,ou=people,dc=cyberlake,dc=ru"
Если каталог локальный и ты root, привязку по паролю можно заменить на SASL EXTERNAL через unix-сокет - это штатный способ администрировать конфиг OpenLDAP:

Код: Выделить всё

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config
Частые грабли
  • Забыли -x: утилита по умолчанию пробует SASL, и поверх неготового сервера вы получаете невнятную ошибку вместо ожидаемого запроса пароля.
  • Передали пароль через -w на скучной командной строке - он осядет в history и в ps. Используйте -W (спросит) или -y файл.
  • objectClass violation при ldapadd: не хватает обязательного атрибута (например sn для inetOrgPerson) или указан атрибут вне всех objectClass. Сверяйтесь со схемой.
  • Путаница LDIF на add и на modify: для ldapadd объявляются objectClass и атрибуты, для ldapmodify нужны строки changetype и действие (add/replace/delete) с разделителем-дефисом.
  • simple bind по ldap:// без TLS гонит пароль открытым текстом по сети. Для записи всегда ldaps:// или -ZZ (StartTLS).
  • Перепутан search base: -b указывает не на ту ветку, и поиск молча возвращает ноль записей. Проверьте DN базы.
  • Кавычки и пробелы в DN: cn=Petr Sokolov должен быть в кавычках для шелла, а запятая внутри значения экранируется обратным слешем.
Мини-лаба
  • Установите клиентские утилиты (ldap-utils или openldap-clients) на свой стенд.
  • Пропишите BASE и URI вашего тестового каталога в ldap.conf и убедитесь, что ldapsearch -x "(objectClass=*)" -s base работает без явных -H и -b.
  • Выполните поиск всех POSIX-учёток фильтром (objectClass=posixAccount), выведите только uid и uidNumber, сравните с -LLL и без.
  • Создайте LDIF на одну запись inetOrgPerson + posixAccount и добавьте её через ldapadd.
  • Напишите LDIF с changetype: modify, который replace для loginShell и add для второго mail, примените ldapmodify.
  • Проверьте результат повторным ldapsearch по uid этой записи.
  • Удалите запись через ldapdelete и убедитесь, что поиск её больше не находит.
Контрольные вопросы
  • Чем DN отличается от RDN и в каком порядке читается DN относительно корня дерева?
  • Какую роль играет objectClass и что произойдёт при попытке добавить атрибут, не предусмотренный ни одним objectClass записи?
  • Запишите фильтр, который найдёт всех person с заданным mail, но не входящих в группу cn=blocked.
  • Чем отличается LDIF для ldapadd от LDIF для ldapmodify и зачем нужна строка-дефис?
  • Что делает ключ -x, чем simple bind отличается от SASL EXTERNAL и когда применяют второй?
  • В каких файлах живёт клиентский ldap.conf в Debian и в RHEL и какие директивы избавляют от ручного указания -H и -b?
👍2 ❤️ 🔥1 😄 🤔1
Аватара пользователя
archfan
Сообщения: 1
Зарегистрирован: 14 май 2026, 05:47

Re: Использование LDAP-клиента

Сообщение archfan »

А зачем -x вообще, если есть SASL EXTERNAL? У меня на ldapi:/// под рутом и так пускает без пароля, и поверх tls не паримся.
👍 ❤️ 🔥2 😄 🤔
Аватара пользователя
vaultsre
Сообщения: 2
Зарегистрирован: 28 май 2026, 06:48

Re: Использование LDAP-клиента

Сообщение vaultsre »

Споткнулся на ldapmodify: накатал replace и забыл строку с дефисом перед вторым действием. Сервер ругнулся, минут десять тупил пока не дошло что дефис разделяет операции.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Аутентификация PAM и SSSD [210.2]
Следующая глава →
Сервер OpenLDAP [210.4]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей