Проблема
С ростом парка серверов и рабочих станций перед системным администратором неизбежно встаёт задача централизованного управления учётными записями. Держать десятки и сотни локальных пользователей на каждом хосте вручную это прямой путь к хаосу, ошибкам и дырам в безопасности. Уволенный сотрудник остаётся в /etc/passwd забытого сервера. Пароли не синхронизированы. Аудит входа превращается в пытку. Решением является служба каталогов на основе протокола LDAP. OpenLDAP это открытая реализация, десятилетиями применяемая в Linux инфраструктурах. Однако её настройка с нуля пугает даже опытных администраторов. Нужно разобраться с DIT, схемами, ACL, индексами и TLS. Настройка OpenLDAP часто воспринимается как чёрная магия, но на деле процесс вполне линеен, если идти по проверенному алгоритму. В этой статье мы развернём OpenLDAP сервер на Debian или Ubuntu, настроим TLS, создадим базовую структуру каталога и подключим к нему клиентские машины.
Решение
Вместо использования графических обёрток или сторонних скриптов мы настроим всё вручную, опираясь на официальное руководство OpenLDAP Software 2.6 Administrator’s Guide и документацию пакетов Debian. Это даст полное понимание каждого компонента и позволит в дальнейшем гибко расширять конфигурацию. В качестве серверной ОС будем использовать Debian 12 (Bookworm). Все команды совместимы с Ubuntu 22.04/24.04 и производными. Второй частью статьи станет подключение клиента на примере стандартного модуля libnss-ldapd и libpam-ldapd (nslcd). Итоговая схема. OpenLDAP работает по протоколу ldaps (LDAP over TLS), обслуживает запросы аутентификации с любых хостов сети, пароли хранятся в виде хешей SSHA-512.
Пошаговая инструкция
Шаг 1. Установка пакетов OpenLDAP
На чистой системе выполните установку демона slapd и утилит управления.
text
sudo apt update
sudo apt install slapd ldap-utils -y
В процессе установки инсталлятор Debian предложит задать пароль администратора LDAP. Введите сложный пароль и запомните его. Это главный пароль для управления каталогом. Если окно не появилось (или вы его пропустили), задайте пароль позже через dpkg-reconfigure slapd.
Сразу после установки выполните базовую настройку через встроенный мастер.
text
sudo dpkg-reconfigure slapd
Ответьте на вопросы.
ВопросРекомендуемый ответПояснениеOmit OpenLDAP server configuration?NoМы хотим настроить сервер сейчас.DNS domain namecompany.localВаш будущий базовый DN (например, dc=company,dc=local).Organization nameCompany LtdПроизвольное имя организации (атрибут o).Administrator passwordСложныйПароль123!Пароль для cn=admin,dc=company,dc=local.Database backendMDBСовременный высокопроизводительный движок (Memory-Mapped DB).Remove database when slapd is purged?NoЧтобы случайно не удалить данные при переустановке пакета.Move old database?YesЕсли есть старая база, перенести.
После завершения мастер сгенерирует конфигурационные файлы в директории /etc/ldap/slapd.d/.
Шаг 2. Проверка базовой работоспособности
Выполните поиск по каталогу анонимно и от имени администратора.
text
# Анонимный запрос (должен вернуть namingContexts)
ldapsearch -x -H ldap://localhost -b "" -s base namingContexts
# Запрос от имени администратора (потребует пароль)
ldapsearch -x -H ldap://localhost -D "cn=admin,dc=company,dc=local" -W -b "dc=company,dc=local"
Первая команда покажет базовый DN. Вторая должна вернуть пустой результат (в каталоге ещё нет записей).
Шаг 3. Настройка TLS для безопасной передачи данных
Работать с LDAP без шифрования в продакшене недопустимо. Настроим самоподписанный сертификат (для внутренней сети этого достаточно; для публичных сервисов используйте Let’s Encrypt).
Создайте сертификат и ключ.
text
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/ssl/private/ldap.key \
-out /etc/ssl/certs/ldap.crt \
-subj "/CN=ldap.company.local"
sudo chown openldap:openldap /etc/ssl/private/ldap.key
sudo chmod 600 /etc/ssl/private/ldap.key
Теперь добавьте TLS конфигурацию в OpenLDAP. Создайте LDIF файл tls.ldif.
text
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ldap.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.key
-
add: olcTLSVerifyClient
olcTLSVerifyClient: never
Примените изменения.
text
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
Включите прослушивание порта 636 (ldaps) в файле /etc/default/slapd (для систем с systemd этого может не требоваться, но проверим).
text
# В /etc/default/slapd добавьте строку:
SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
Перезапустите сервис.
text
sudo systemctl restart slapd
Проверьте подключение по защищённому каналу.
text
ldapsearch -x -H ldaps://localhost -D "cn=admin,dc=company,dc=local" -W -b "dc=company,dc=local" -Z
Шаг 4. Создание базовой структуры каталога (DIT)
Каталог должен содержать организационные единицы (OU) для пользователей, групп и политик. Создайте файл base.ldif.
text
# Корень каталога (уже должен существовать после мастера, но если нет, добавьте)
dn: dc=company,dc=local
objectClass: dcObject
objectClass: organization
o: Company Ltd
dc: company
# Подразделение для пользователей
dn: ou=People,dc=company,dc=local
objectClass: organizationalUnit
ou: People
# Подразделение для групп
dn: ou=Groups,dc=company,dc=local
objectClass: organizationalUnit
ou: Groups
Загрузите структуру.
text
ldapadd -x -H ldaps://localhost -D "cn=admin,dc=company,dc=local" -W -f base.ldif
Шаг 5. Создание первого пользователя и группы
Подготовьте LDIF файл user1.ldif.
text
# Создаём группу
dn: cn=admins,ou=Groups,dc=company,dc=local
objectClass: posixGroup
cn: admins
gidNumber: 5000
# Создаём пользователя
dn: uid=jdoe,ou=People,dc=company,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: jdoe
cn: John Doe
givenName: John
sn: Doe
loginShell: /bin/bash
uidNumber: 10001
gidNumber: 5000
homeDirectory: /home/jdoe
userPassword: {SSHA}хэш_пароля
Пароль рекомендуется генерировать утилитой slappasswd.
text
sudo slappasswd -h {SSHA} -s "СильныйПароль123"
Скопируйте полученную строку {SSHA}... в поле userPassword LDIF файла и загрузите.
text
ldapadd -x -H ldaps://localhost -D "cn=admin,dc=company,dc=local" -W -f user1.ldif
Проверьте созданного пользователя.
text
ldapsearch -x -H ldaps://localhost -D "cn=admin,dc=company,dc=local" -W -b "ou=People,dc=company,dc=local"
Шаг 6. Настройка ACL (Access Control Lists)
По умолчанию пароли пользователей (userPassword) видны любому анониму. Исправим это.
Создайте LDIF файл acl.ldif для изменения базы данных olcDatabase={1}mdb.
text
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by self write
by anonymous auth
by dn="cn=admin,dc=company,dc=local" write
by * none
olcAccess: {1}to dn.base=""
by * read
olcAccess: {2}to *
by self write
by dn="cn=admin,dc=company,dc=local" write
by users read
by * none
Примените изменения.
text
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f acl.ldif
Теперь действуют следующие правила.
Аноним может только аутентифицироваться (auth), но не читать пароль.
Пользователь может менять только свой пароль.
Администратор имеет полный доступ.
Остальные аутентифицированные пользователи могут читать любые записи, кроме паролей.
Шаг 7. Настройка клиента для аутентификации через LDAP
На клиентской машине (например, на другой Linux станции) установите пакеты.
text
sudo apt install libnss-ldapd libpam-ldapd nslcd ldap-utils -y
При установке libnss-ldapd мастер задаст несколько вопросов. Ответьте так.
ВопросОтветLDAP server URIldaps://<IP_сервера_OpenLDAP>Base DNdc=company,dc=localLDAP version3Make local root database admin?YesDoes the LDAP database require login?No (мы используем анонимный поиск)LDAP account for rootcn=admin,dc=company,dc=localLDAP root account passwordпароль администратора
После установки отредактируйте /etc/nsswitch.conf, добавив ldap в строки passwd, group и shadow.
text
passwd: files ldap
group: files ldap
shadow: files ldap
Перезапустите службу nslcd.
text
sudo systemctl restart nslcd
Теперь можно проверить видимость доменных пользователей.
text
getent passwd jdoe
Вывод должен содержать информацию о пользователе jdoe.
Чтобы разрешить вход по SSH под LDAP пользователем, отредактируйте /etc/pam.d/common-session и /etc/pam.d/common-password (обычно они уже настроены через pam-auth-update). Для автоматического создания домашней директории при первом входе добавьте в /etc/pam.d/common-session.
text
session required pam_mkhomedir.so skel=/etc/skel umask=0077
После этого доменный пользователь jdoe сможет войти по SSH, и его домашняя директория будет создана автоматически.
Устранение распространённых проблем
СимптомВероятная причинаРешениеldapsearch выдаёт Can't contact LDAP serverslapd не слушает нужный интерфейс или портПроверьте sudo netstat -tlnp | grep slapd. Убедитесь, что в /etc/default/slapd указаны URI ldap:/// ldaps:///. Для systemd систем проверьте вывод sudo systemctl status slapd на предмет ошибок.При подключении клиента ошибка TLS: certificate is not validСамоподписанный сертификат не добавлен в доверенные на клиентеНа клиенте скопируйте /etc/ssl/certs/ldap.crt с сервера в /usr/local/share/ca-certificates/ и выполните sudo update-ca-certificates. Либо используйте опцию TLS_REQCERT allow в /etc/nslcd.conf (менее безопасно).Пользователи из LDAP видны через getent, но вход по паролю отклоняетсяPAM не настроен на использование LDAPВыполните sudo pam-auth-update и отметьте галочкой «Unix authentication» и «LDAP Authentication». Убедитесь, что в /etc/pam.d/common-auth есть строка auth [success=2 default=ignore] pam_unix.so nullok и ссылка на pam_ldap.so.userPassword возвращается в открытом видеСхема использует securityObject и передачу пароля без хешаИспользуйте только slappasswd -h {SSHA} или {SSHA512} для хеширования. Проверьте ACL: атрибут userPassword должен быть запрещён к чтению для посторонних.slapd не запускается после изменения конфигурацииОшибка в LDIF файле (синтаксис, неподдерживаемый атрибут)Запустите sudo slapd -d 256 в foreground режиме для подробного лога. Проверьте синтаксис LDIF: sudo ldapmodify -n -v -f ваш_файл.ldif.Клиент медленно выполняет запросы к LDAPОтсутствует кеширование на клиенте или не настроены индексы на сервереНа сервере в olcDatabase={1}mdb добавьте индексы через LDIF: olcDbIndex: uid pres,eq, olcDbIndex: cn pres,eq,sub. На клиенте включите кеш nscd или sssd вместо nslcd.
Настройка OpenLDAP после первого успешного развёртывания перестаёт казаться сложной и становится мощным инструментом в руках администратора. Служба каталогов на базе OpenLDAP способна обслуживать тысячи учётных записей, не требуя платных лицензий и громоздких графических оснасток. Построенный по данной инструкции сервер готов к промышленной эксплуатации в Linux инфраструктуре. Шифрование TLS защищает трафик. ACL разграничивают доступ. Клиентские машины прозрачно получают информацию о пользователях.