Сервер OpenLDAP [210.4]

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

Сервер OpenLDAP [210.4]

Сообщение 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]
Урок 33. Сервер OpenLDAP [210.4]

Каталог LDAP - это сетевая база с иерархическими записями, заточенная под чтение: учётки пользователей, группы, хосты, сертификаты, настройки приложений. Задача администратора в этом уроке - поднять slapd, настроить его через современную динамическую конфигурацию cn=config, спроектировать дерево записей (DIT), залить данные через LDIF, ускорить поиск индексами, закрыть доступ через ACL, наладить репликацию syncrepl и снять корректный бэкап. Это фундамент, на котором потом строятся SSSD, почта, Samba и единый вход.

Изображение

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

Каталог - это дерево записей (DIT, Directory Information Tree). Каждая запись имеет уникальное имя DN (Distinguished Name), собранное из RDN снизу вверх, например uid=anna,ou=people,dc=lab,dc=local. Запись состоит из атрибутов, а набор разрешённых атрибутов и обязательных среди них задаёт objectClass. Сами объектные классы и атрибуты описаны в схемах (schema): inetOrgPerson, posixAccount, groupOfNames и так далее. Без подключённой схемы сервер отвергнет запись с неизвестным атрибутом - это не бюрократия, а гарантия целостности данных.

Раньше slapd читал текстовый slapd.conf и требовал перезапуска на каждое изменение. С версии 2.3 действует динамическая конфигурация: сам сервер хранится как поддерево cn=config и правится онлайн через LDAP-операции, без рестарта. Физически это каталог /etc/openldap/slapd.d (RHEL) или /etc/ldap/slapd.d (Debian) с LDIF-файлами, но руками их трогать нельзя - только через ldapmodify к сокету ldapi:///. Схемы тоже стали частью cn=config (ветка cn=schema,cn=config), а не отдельными include.

Бэкенд хранения по умолчанию сейчас mdb (LMDB) - memory-mapped база, быстрая и без отдельной возни с кешами, она заменила устаревший hdb/bdb. Поиск в каталоге без индекса - это линейный перебор всех записей, поэтому атрибуты, по которым ищут (uid, cn, mail, member), индексируют. Доступ режут ACL: правила вида "к каким записям и атрибутам, кому, какой уровень" применяются сверху вниз, и первое подошедшее правило выигрывает - порядок критичен. Репликация делается через syncrepl: реплика-потребитель подписывается на изменения у поставщика и подтягивает их, отслеживая состояние через cookie и значения contextCSN.

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

Установка и запуск. Debian/Ubuntu кладёт сервер в пакет slapd, утилиты в ldap-utils:

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

# Debian 13 / Ubuntu 24.04
apt install slapd ldap-utils
dpkg-reconfigure slapd        # переспросит домен, пароль admin, базу

# RHEL 10 / Fedora 41+
dnf install openldap-servers openldap-clients
systemctl enable --now slapd
Смотрим конфигурацию онлайн. Запрос идёт через локальный сокет с авторизацией по UNIX-сокету (EXTERNAL), пароль не нужен:

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

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config dn
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn
Подключение своей схемы. Готовый .schema конвертируют в LDIF и добавляют в cn=config:

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

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
Наполнение DIT. Базовые записи описываем в LDIF и заливаем как обычный пользователь каталога:

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

# base.ldif
dn: dc=lab,dc=local
objectClass: dcObject
objectClass: organization
o: Lab
dc: lab

dn: ou=people,dc=lab,dc=local
objectClass: organizationalUnit
ou: people

dn: uid=anna,ou=people,dc=lab,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
cn: Anna Petrova
sn: Petrova
uid: anna
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/anna
userPassword: {SSHA}...

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

ldapadd -x -D cn=admin,dc=lab,dc=local -W -f base.ldif
slappasswd -h '{SSHA}'    # сгенерировать хеш для userPassword
Индексы. Правим ветку базы (olcDatabase={1}mdb) на лету:

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

# index.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uid eq
olcDbIndex: cn,mail eq,sub
olcDbIndex: member eq

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

ldapmodify -Y EXTERNAL -H ldapi:/// -f index.ldif
# для старых данных пересобрать индекс на остановленном slapd:
systemctl stop slapd && slapindex && systemctl start slapd
ACL. Правила хранятся в olcAccess той же базы. Классика - сам пользователь меняет свой пароль, остальное читают аутентифицированные:

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

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword by self write by anonymous auth by * none
olcAccess: {1}to * by self read by users read by * none
Репликация syncrepl. На реплике в её базу добавляют блок olcSyncrepl с адресом поставщика, фильтром и интервалом, плюс включают olcMirrorMode при двунаправленной схеме. Бэкап делают двумя путями: логический дамп slapcat (на остановленном или с учётом онлайн-консистентности) и отдельно дамп конфигурации:

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

slapcat -n 1 -l data.ldif                 # дамп данных
slapcat -b cn=config -l config.ldif       # дамп конфигурации
# восстановление: slapadd на пустой остановленной базе
slapadd -n 1 -l data.ldif
Частые грабли
  • Правка файлов в slapd.d вручную - сервер их перезапишет или перестанет стартовать. Только ldapmodify через ldapi:///.
  • Забыли подключить схему - получаете ошибку "objectClass: value #N invalid per syntax" или "attribute type undefined". Сначала схема, потом данные.
  • slapcat запущен параллельно с пишущим slapd на старых бэкендах даёт битый дамп. На mdb читать безопаснее, но для гарантии останавливайте сервис или используйте онлайн-метод.
  • ACL пишут от частного к общему: правило "to *" поставленное первым перекрывает все последующие, доступ к паролям ломается.
  • Изменили индексы, но не пересобрали slapindex - новые данные индексируются, старые ищутся перебором, поиск "тормозит выборочно".
  • Репликация молчит - забыли создать на реплике учётку для биндинга или не открыли порт 389/636; сверяйте contextCSN на обоих узлах.
  • Перепутали authentication при bind: для cn=config почти всегда EXTERNAL по сокету, для данных - simple bind с -x -D -W.
Мини-лаба
  • Установите slapd и клиентские утилиты, проверьте, что сервис активен и слушает 389.
  • Через ldapsearch -Y EXTERNAL по cn=config найдите имя своей базы данных (olcDatabase={N}mdb) и текущий suffix.
  • Создайте base.ldif с корнем dc=lab,dc=local, ou=people и одним пользователем (хеш пароля через slappasswd), залейте ldapadd.
  • Добавьте индексы для uid и mail через ldapmodify, при необходимости остановите сервис и выполните slapindex.
  • Настройте ACL так, чтобы пользователь менял только свой userPassword, а читали запись только аутентифицированные; проверьте ldapwhoami и ldappasswd.
  • Снимите бэкап данных и конфигурации через slapcat в два файла, удалите тестовую запись и восстановите её из дампа.
Контрольные вопросы
  • Чем динамическая конфигурация cn=config принципиально отличается от slapd.conf и почему нельзя редактировать файлы в slapd.d напрямую?
  • Как из распределения DN собирается дерево DIT и какую роль играет objectClass при добавлении записи?
  • Какой механизм авторизации используется при правке cn=config через ldapi:/// и почему не нужен пароль?
  • Зачем нужен slapindex и в каком случае одного добавления olcDbIndex недостаточно?
  • В каком порядке slapd применяет правила olcAccess и к чему приводит ошибочный порядок для атрибута userPassword?
  • Чем отличается syncrepl-потребитель от поставщика и по каким атрибутам контролируют консистентность реплик?
👍4 ❤️2 🔥 😄 🤔1
Аватара пользователя
Notsure1
Сообщения: 1
Зарегистрирован: 29 май 2026, 14:45

Re: Сервер OpenLDAP [210.4]

Сообщение Notsure1 »

А почему мой ldapmodify к cn=config отвечает Insufficient access, хотя я под рутом? Оказалось надо именно -Y EXTERNAL через ldapi:///, а не -x с паролем - по TCP рут это просто anonymous.
👍2 ❤️1 🔥 😄 🤔1
Аватара пользователя
cudakun
Сообщения: 1
Зарегистрирован: 29 май 2026, 06:48

Re: Сервер OpenLDAP [210.4]

Сообщение cudakun »

Поймал затык: добавил olcDbIndex для mail, но старые записи по нему всё равно ищутся медленно. Помог только slapindex на остановленном slapd, онлайн он индекс задним числом не пересобирает.
👍3 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Использование LDAP-клиента
Следующая глава →
Почтовый сервер Postfix [211.1]

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

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

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

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

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