Проблема
С ростом парка серверов и рабочих станций перед системным администратором неизбежно встаёт задача централизованного управления учётными записями. Держать десятки и сотни локальных пользователей на каждом хосте вручную прямой путь к хаосу, ошибкам и дырам в безопасности: уволенный сотрудник остаётся в /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 и утилит управления:
bash
sudo apt update
sudo apt install slapd ldap-utils -y
В процессе установки инсталлятор Debian предложит задать пароль администратора LDAP. Введите сложный пароль и запомните его это главный пароль для управления каталогом. Если окно не появилось (или вы его пропустили), задайте пароль позже через dpkg-reconfigure slapd.
Сразу после установки выполните базовую настройку через встроенный мастер:
bash
sudo dpkg-reconfigure slapd
Ответьте на вопросы:
| Вопрос | Рекомендуемый ответ | Пояснение |
|---|---|---|
Omit OpenLDAP server configuration? | No | Мы хотим настроить сервер сейчас. |
DNS domain name | company.local | Ваш будущий базовый DN (например, dc=company,dc=local). |
Organization name | Company Ltd | Произвольное имя организации (атрибут o). |
Administrator password | СложныйПароль123! | Пароль для cn=admin,dc=company,dc=local. |
Database backend | MDB | Современный высокопроизводительный движок (Memory-Mapped DB). |
Remove database when slapd is purged? | No | Чтобы случайно не удалить данные при переустановке пакета. |
Move old database? | Yes | Если есть старая база перенести. |
После завершения мастер сгенерирует конфигурационные файлы в директории /etc/ldap/slapd.d/.
Шаг 2. Проверка базовой работоспособности
Выполните поиск по каталогу анонимно и от имени администратора:
bash
# Анонимный запрос (должен вернуть 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).
Создайте сертификат и ключ:
bash
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:
ldif
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
Примените изменения:
bash
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
Включите прослушивание порта 636 (ldaps) в файле /etc/default/slapd (для систем с systemd этого может не требоваться, но проверим):
bash
# В /etc/default/slapd добавьте строку:
SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
Перезапустите сервис:
bash
sudo systemctl restart slapd
Проверьте подключение по защищённому каналу:
bash
ldapsearch -x -H ldaps://localhost -D "cn=admin,dc=company,dc=local" -W -b "dc=company,dc=local" -Z
Шаг 4. Создание базовой структуры каталога (DIT)
Каталог должен содержать организационные единицы (OU) для пользователей, групп и политик. Создайте файл base.ldif:
ldif
# Корень каталога (уже должен существовать после мастера, но если нет — добавьте)
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
Загрузите структуру:
bash
ldapadd -x -H ldaps://localhost -D "cn=admin,dc=company,dc=local" -W -f base.ldif
Шаг 5. Создание первого пользователя и группы
Подготовьте LDIF-файл user1.ldif:
ldif
# Создаём группу
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:
bash
sudo slappasswd -h {SSHA} -s "СильныйПароль123"
Скопируйте полученную строку {SSHA}... в поле userPassword LDIF-файла и загрузите:
bash
ldapadd -x -H ldaps://localhost -D "cn=admin,dc=company,dc=local" -W -f user1.ldif
Проверьте созданного пользователя:
bash
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:
ldif
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
Примените:
bash
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f acl.ldif
Теперь:
- Аноним может только аутентифицироваться (
auth), но не читать пароль. - Пользователь может менять только свой пароль.
- Администратор имеет полный доступ.
- Остальные аутентифицированные пользователи могут читать любые записи, кроме паролей.
Шаг 7. Настройка клиента для аутентификации через LDAP
На клиентской машине (например, на другой Linux-станции) установите пакеты:
bash
sudo apt install libnss-ldapd libpam-ldapd nslcd ldap-utils -y
При установке libnss-ldapd мастер задаст несколько вопросов. Ответьте так:
| Вопрос | Ответ |
|---|---|
LDAP server URI | ldaps://<IP_сервера_OpenLDAP> |
Base DN | dc=company,dc=local |
LDAP version | 3 |
Make local root database admin? | Yes |
Does the LDAP database require login? | No (мы используем анонимный поиск) |
LDAP account for root | cn=admin,dc=company,dc=local |
LDAP root account password | пароль администратора |
После установки отредактируйте /etc/nsswitch.conf, добавив ldap в строки passwd, group и shadow:
passwd: files ldap
group: files ldap
shadow: files ldap
Перезапустите службу nslcd:
bash
sudo systemctl restart nslcd
Теперь можно проверить видимость доменных пользователей:
bash
getent passwd jdoe
Вывод должен содержать информацию о пользователе jdoe.
Чтобы разрешить вход по SSH под LDAP-пользователем, отредактируйте /etc/pam.d/common-session и /etc/pam.d/common-password (обычно они уже настроены через pam-auth-update). Для автоматического создания домашней директории при первом входе добавьте в /etc/pam.d/common-session:
session required pam_mkhomedir.so skel=/etc/skel umask=0077
После этого доменный пользователь jdoe сможет войти по SSH, и его домашняя директория будет создана автоматически.
Устранение распространённых проблем
| Симптом | Вероятная причина | Решение |
|---|---|---|
ldapsearch выдаёт Can't contact LDAP server | slapd не слушает нужный интерфейс или порт | Проверьте 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 разграничивают доступ, а клиентские машины прозрачно получают информацию о пользователях.







