OpenLDAP: установка и настройка централизованной аутентификации

Проблема

С ростом парка серверов и рабочих станций перед системным администратором неизбежно встаёт задача централизованного управления учётными записями. Держать десятки и сотни локальных пользователей на каждом хосте вручную прямой путь к хаосу, ошибкам и дырам в безопасности: уволенный сотрудник остаётся в /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 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. Проверка базовой работоспособности

Выполните поиск по каталогу анонимно и от имени администратора:

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 URIldaps://<IP_сервера_OpenLDAP>
Base DNdc=company,dc=local
LDAP version3
Make local root database admin?Yes
Does the LDAP database require login?No (мы используем анонимный поиск)
LDAP account for rootcn=admin,dc=company,dc=local
LDAP root account passwordпароль администратора

После установки отредактируйте /etc/nsswitch.conf, добавив ldap в строки passwdgroup и 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 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,eqolcDbIndex: cn pres,eq,sub. На клиенте включите кеш nscd или sssd вместо nslcd.

OpenLDAP настройка после первого успешного развёртывания перестаёт казаться сложной и становится мощным инструментом в руках администратора. Служба каталогов на базе OpenLDAP способна обслуживать тысячи учётных записей, не требуя платных лицензий и громоздких графических оснасток. Построенный по данной инструкции сервер готов к промышленной эксплуатации в Linux-инфраструктуре: шифрование TLS защищает трафик, ACL разграничивают доступ, а клиентские машины прозрачно получают информацию о пользователях.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu