Как установить и настроить OpenLDAP на VPS
Когда пользователей и сервисов становится больше десятка, заводить каждому отдельный логин на каждом сервере — путь к хаосу: пароли расходятся, увольнение сотрудника требует обхода дюжины систем, а аудит доступа превращается в археологию. OpenLDAP решает эту задачу так же, как решал её последние тридцать лет: единый каталог пользователей и групп, к которому подключается всё остальное — SSH, VPN, почта, Samba, Wi-Fi через RADIUS, десятки самостоятельных приложений с поддержкой LDAP-бинда. Разберём, как установить и настроить OpenLDAP на VPS с нуля: поднять slapd, спроектировать структуру каталога, добавить пользователей и группы, включить TLS и закрыть каталог правами доступа.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое OpenLDAP и когда он нужен
LDAP — это протокол доступа к иерархическому каталогу данных, а OpenLDAP — самая распространённая свободная реализация LDAP-сервера, известная под именем демона slapd. Каталог устроен как дерево: от корневого домена (base DN, например dc=example,dc=com) отходят организационные единицы (ou=people, ou=groups), а в них лежат записи — пользователи, группы, иногда серверы и другие объекты. Каждая запись описывается набором атрибутов согласно схеме — objectClass задаёт, какие атрибуты обязательны и допустимы.
Стоит честно сказать, где OpenLDAP уместен, а где нет. Это не SSO-портал с красивым веб-интерфейсом и OAuth2/OIDC из коробки — для таких сценариев есть Keycloak или Authentik. LDAP — низкоуровневый протокол каталога, к которому по прямому бинду подключаются десятки классических систем: OpenSSH через nss-pam-ldapd или sssd, Samba как бэкенд пользователей домена, Postfix и Dovecot для почты, VPN-серверы, принт-серверы, сетевое оборудование. Более того, современные SSO-платформы вроде Keycloak умеют подключать OpenLDAP как бэкенд федерации пользователей — тогда LDAP остаётся источником истины, а OIDC-фасад берёт на себя Keycloak. Если нужен именно такой фундамент под аутентификацию — устанавливаем OpenLDAP.
Установка slapd и первичная настройка
На Debian и Ubuntu OpenLDAP ставится пакетом slapd, а утилиты командной строки для работы с каталогом — отдельным пакетом ldap-utils.
apt update
apt install -y slapd ldap-utils
В интерактивном режиме установщик сразу спросит пароль администратора каталога. Если вы разворачиваете сервер через автоматизацию и хотите задать домен и пароль без диалогов, предварительно заполните debconf:
debconf-set-selections <<EOF
slapd slapd/internal/generated_adminpw password СЛОЖНЫЙ_ПАРОЛЬ
slapd slapd/internal/adminpw password СЛОЖНЫЙ_ПАРОЛЬ
slapd slapd/password2 password СЛОЖНЫЙ_ПАРОЛЬ
slapd slapd/password1 password СЛОЖНЫЙ_ПАРОЛЬ
slapd slapd/domain string example.com
slapd shared/organization string Example Org
slapd slapd/backend select MDB
slapd slapd/purge_database boolean true
slapd slapd/move_old_database boolean true
slapd slapd/no_configuration boolean false
EOF
dpkg-reconfigure -f noninteractive slapd
Домен example.com при этом превращается в base DN dc=example,dc=com — от него дальше строится всё дерево каталога. Backend MDB (Memory-Mapped Database) — рекомендуемый бэкенд хранения, использовать его правильнее устаревшего HDB. После установки OpenLDAP работает через динамическую конфигурацию cn=config в /etc/ldap/slapd.d — прямая правка slapd.conf в современных версиях не применяется, изменения вносятся LDIF-файлами через ldapmodify и ldapadd. Проверить, что сервис жив, и заглянуть в содержимое базового домена:
systemctl status slapd
ldapsearch -x -LLL -b dc=example,dc=com
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверСтруктура каталога: организационные единицы
Прежде чем добавлять пользователей, создайте в дереве два раздела — для людей и для групп. Это устоявшаяся конвенция, которой придерживается подавляющее большинство LDAP-развёртываний, и её понимают все клиентские приложения по умолчанию.
Создайте файл base.ldif:
dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people
dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups
Примените его от имени администратора каталога (пароль — тот, что задали при установке):
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f base.ldif
Флаг -x включает простую аутентификацию по паролю вместо SASL, -D задаёт DN, от чьего имени выполняется операция, -W просит ввести пароль интерактивно. LDIF (LDAP Data Interchange Format) — стандартный текстовый формат описания записей каталога, им же оформляются почти все дальнейшие операции: добавление, изменение, удаление объектов. Держите такие файлы под версионным контролем — заодно получите рабочую документацию структуры каталога.
Добавление пользователей и групп
Пользовательские записи в OpenLDAP обычно комбинируют сразу несколько объектных классов: inetOrgPerson даёт человекочитаемые атрибуты вроде имени и фамилии, posixAccount и shadowAccount — атрибуты, нужные для входа в Unix-системы через NSS/PAM (uid, домашний каталог, шелл, хеш пароля). Схемы cosine, nis и inetorgperson, необходимые для этих классов, современный пакет slapd подключает по умолчанию при установке — отдельно добавлять их не нужно.
Сгенерируйте хеш пароля отдельной командой, не храните пароль открытым текстом в LDIF:
slappasswd -s ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ
Команда вернёт строку вида {SSHA}хеш — её и подставляем в атрибут userPassword. Файл user.ldif:
dn: uid=ivan,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: ivan
sn: Petrov
givenName: Ivan
cn: Ivan Petrov
displayName: Ivan Petrov
uidNumber: 10000
gidNumber: 10000
userPassword: {SSHA}вставьте_хеш_сюда
gecos: Ivan Petrov
loginShell: /bin/bash
homeDirectory: /home/ivan
Группа описывается классом posixGroup, а членство перечисляется через memberUid:
dn: cn=developers,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: developers
gidNumber: 10000
memberUid: ivan
Добавьте обе записи:
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f user.ldif
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f group.ldif
uidNumber и gidNumber должны быть уникальны в каталоге и не пересекаться с диапазоном локальных системных пользователей — обычно для LDAP-аккаунтов резервируют диапазон от 10000. Проверить, что запись появилась и содержит нужные атрибуты:
ldapsearch -x -LLL -b "ou=people,dc=example,dc=com" "(uid=ivan)"
Для изменения существующей записи (например, смены пароля) используется ldapmodify с LDIF, где указан changetype: modify и операция replace, add или delete для конкретного атрибута — переписывать всю запись целиком не нужно.
Включение TLS для защищённого соединения
Простая аутентификация LDAP (-x) по незашифрованному каналу отправляет пароль почти открытым текстом — приемлемо для теста на loopback, но не для прода. Для VPS с публичным IP шифрование обязательно, будь то ldaps:// на 636 порту или StartTLS поверх обычного 389.
Проще всего использовать сертификат Let's Encrypt, если у сервера каталога есть собственное DNS-имя — процесс выпуска и обновления подробно описан в статье про установку Let's Encrypt на VPS. Для внутреннего каталога, не смотрящего в интернет напрямую, подойдёт и самоподписанный сертификат — клиенты внутри сети всё равно доверяют ему явно.
Дальше сертификат нужно подключить к cn=config. Файл tls.ldif:
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap-server.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap-server.key
-
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca-certificates.crt
Применяется он не через обычный бинд, а через локальный SASL-механизм EXTERNAL по сокету ldapi:///, доступному только root на самом сервере:
ldapmodify -Y EXTERNAL -H ldapi:/// -f tls.ldif
Убедитесь, что ключ сертификата читаем пользователем openldap: chown root:openldap /etc/ssl/private/ldap-server.key && chmod 640 /etc/ssl/private/ldap-server.key. Чтобы демон слушал ещё и защищённый порт 636, отредактируйте /etc/default/slapd:
SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"
Перезапустите сервис и проверьте соединение:
systemctl restart slapd
ldapsearch -H ldaps://localhost -x -b dc=example,dc=com
StartTLS на обычном порту 389 проверяется флагом -ZZ (требовать успешный апгрейд соединения):
ldapsearch -x -ZZ -H ldap://localhost -b dc=example,dc=com
Если видите ошибку сертификата на клиенте — чаще всего дело в том, что клиент не знает о вашем CA. Для самоподписанного сертификата на клиентской стороне в /etc/ldap/ldap.conf укажите TLS_CACERT с путём к тому же файлу сертификата.
Права доступа: ACL и ограничение бинда
По умолчанию OpenLDAP довольно щедр на чтение — анонимный пользователь может прочитать почти весь каталог, кроме паролей. Для боевого сервера правила доступа стоит сузить явно. ACL задаются на уровне конкретной базы данных, в записи olcDatabase={1}mdb,cn=config (точный номер базы можно уточнить через slapcat или поиском по cn=config).
Файл acl.ldif с базовым, разумно строгим набором правил:
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 attrs=shadowLastChange by self write by * read
olcAccess: {2}to * by self write by dn.base="cn=admin,dc=example,dc=com" write by users read by * none
Логика такая: пароль (userPassword) виден только самому владельцу для записи и анонимному соединению для проверки бинда, но не читается никем больше. Остальные атрибуты доступны на чтение только авторизованным пользователям (users), а полностью анонимный доступ к каталогу закрыт. Примените так же через ldapmodify -Y EXTERNAL -H ldapi:/// -f acl.ldif.
Сетевой уровень тоже стоит закрыть: если каталог обслуживает только сервисы внутри вашей сети или за VPN, не открывайте 389 и 636 порты всему интернету — ограничьте фаервол конкретными адресами. Базовая настройка разобрана в статье про UFW на VPS; не будет лишним и защитить SSH через fail2ban — сам OpenLDAP не банит по IP за подбор пароля, эту работу берёт на себя периметр вокруг него.
Резервную копию каталога снимайте регулярно — это простой текстовый LDIF-дамп, который легко хранить и версионировать:
slapcat -n 1 > /root/backup/ldap-$(date +%F).ldif
Восстановление из такого дампа делается остановкой slapd, очисткой каталога данных и командой slapadd -n 1 -l backup.ldif — но перед этим стоит потренироваться на тестовом сервере, чтобы не потерять каталог в боевой ситуации.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Чем OpenLDAP отличается от Keycloak или Authentik?
OpenLDAP — это низкоуровневый протокол и хранилище каталога, к которому подключаются по прямому бинду десятки классических систем (SSH, Samba, почта, VPN). Keycloak и Authentik — современные SSO-платформы с веб-интерфейсом и поддержкой OIDC/SAML; они часто используют LDAP как источник пользователей через федерацию, а не заменяют его. Подробнее о них — в статьях про установку Keycloak и Authentik.
Обязательно ли включать TLS?
Для сервера с публичным IP — да. Простой бинд по паролю без шифрования канала передаёт пароль почти в открытом виде, и в интернете это недопустимо. Если каталог доступен только внутри приватной сети или VPN, риск ниже, но лучше не полагаться на изоляцию сети как единственную защиту.
Почему в дереве каталога используется формат dc=example,dc=com, а не просто имя организации?
Это конвенция, привязывающая базовый DN к DNS-домену организации — так проще интегрировать каталог с другими системами, которые ожидают именно такую структуру (Kerberos-реалмы, Samba-домены, многие готовые LDAP-клиенты). Технически можно назвать base DN и иначе, но лучше придерживаться стандарта.
Можно ли редактировать конфигурацию slapd напрямую в текстовом файле?
В современных версиях OpenLDAP (2.4 и новее) конфигурация хранится динамически в cn=config под /etc/ldap/slapd.d, а не в классическом slapd.conf. Изменения вносятся LDIF-файлами через ldapmodify -Y EXTERNAL -H ldapi:///, ручная правка бинарных файлов конфигурации не поддерживается.
Как подключить Linux-клиента, чтобы пользователи из LDAP могли входить по SSH?
На клиенте ставится libnss-ldap/libpam-ldap либо, что современнее и надёжнее, sssd с LDAP-бэкендом — он же кеширует записи для офлайн-входа при кратковременной недоступности каталога. Это отдельная тема, выходящая за рамки настройки самого сервера.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →