OpenLDAP — это сервер каталога, в котором удобно хранить учётные записи, группы и служебные объекты для собственной сети. В отличие от файла /etc/passwd, каталог рассчитан на сотни и тысячи записей, поддерживает централизованную аутентификацию, разграничение доступа и репликацию. Ниже — практический путь от установки slapd на Debian или Ubuntu до подключения рабочих станций через SSSD, с резервным копированием и диагностикой.
Когда каталог оправдан
Для трёх компьютеров и пяти пользователей LDAP — лишняя сложность. Каталог начинает приносить пользу, когда несколько сервисов должны проверять одни и те же учётные записи, когда нужно централизованно отключать доступ сотрудника и когда требуется единая структура групп и прав.
- единый вход для почты, файлового сервера и внутренних приложений;
- централизованная блокировка учётной записи при увольнении;
- понятная структура подразделений и групп;
- возможность реплики между площадками.
Сразу определите базовый DN. Если домен example.ru, база будет dc=example,dc=ru. Администратором обычно делают cn=admin,dc=example,dc=ru, а пользовательские записи складывают в ou=people.
Установка и первичная настройка
sudo apt update
sudo apt install slapd ldap-utils
sudo dpkg-reconfigure slapd
Установщик спросит DNS-имя домена, пароль администратора, тип базы MDB и удалять ли базу при удалении пакета. При ошибке в домене dpkg-reconfigure пересоздаст базу, но записи придётся загрузить заново.
Проверьте службу и выполните поиск от имени администратора:
sudo systemctl status slapd
ldapsearch -x -H ldap://127.0.0.1 -b "dc=example,dc=ru" -D "cn=admin,dc=example,dc=ru" -W
Если в ответе есть dn: dc=example,dc=ru, сервер работает. Конфигурация хранится не в текстовом файле, а в каталоге /etc/ldap/slapd.d в формате cn=config. Менять её лучше через ldapmodify, а не редактировать файлы руками.
Структура каталога и пользователи
Создайте подразделения people и groups. Записи удобно готовить в LDIF-файле: так их можно хранить в системе контроля версий и повторять на другом сервере.
dn: ou=people,dc=example,dc=ru
objectClass: organizationalUnit
ou: people
dn: uid=ivanov,ou=people,dc=example,dc=ru
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: ivanov
cn: Ivan Ivanov
sn: Ivanov
givenName: Ivan
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/ivanov
loginShell: /bin/bash
mail: ivanov@example.ru
Для входа по SSH и работы с правами нужна группа, gidNumber которой совпадает с gidNumber пользователя. Минимальная запись выглядит так:
dn: cn=users,ou=groups,dc=example,dc=ru
objectClass: posixGroup
cn: users
gidNumber: 10001
memberUid: ivanov
Загрузка файла выполняется от администратора каталога:
ldapadd -x -H ldap://127.0.0.1 -D "cn=admin,dc=example,dc=ru" -W -f people.ldif
Следите за уникальностью uidNumber и gidNumber. Дубликаты дают разным людям доступ к одним и тем же файлам, а SSSD начинает путать записи.
Пароли и права доступа
Пароль задаётся хешем, а не открытым текстом. slappasswd сгенерирует значение для атрибута userPassword.
slappasswd -h '{SSHA}' -s 'СложныйПароль'
Строку подставьте в LDIF:
dn: uid=ivanov,ou=people,dc=example,dc=ru
changetype: modify
replace: userPassword
userPassword: {SSHA}...
ldapmodify -x -H ldap://127.0.0.1 -D "cn=admin,dc=example,dc=ru" -W -f set-password.ldif
Права описываются в 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 attrs=shadowLastChange by self write by * read
olcAccess: {2}to * by self read by users read by * none
Применяйте ACL через локальное подключение с SASL EXTERNAL: sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f acl.ldif. Добавьте индексы, иначе поиск по почте будет перебирать весь каталог:
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcDbIndex
olcDbIndex: objectClass eq
olcDbIndex: entryCSN,entryUUID eq
olcDbIndex: uid,cn,mail eq,sub
Затем выполните sudo slapindex -n 1 при остановленном slapd.
Шифрование трафика
Передавать пароли по сети без TLS нельзя. Для внутреннего сервера подойдёт сертификат от собственного удостоверяющего центра, для теста — самоподписанный. Ключ должен быть доступен только службе openldap.
sudo install -d -o openldap -g openldap /etc/ldap/ssl
sudo openssl req -x509 -nodes -days 825 -newkey rsa:3072 \
-keyout /etc/ldap/ssl/ldap.key -out /etc/ldap/ssl/ldap.crt \
-subj "/CN=ldap.example.ru" \
-addext "subjectAltName=DNS:ldap.example.ru"
sudo chown -R openldap:openldap /etc/ldap/ssl
sudo chmod 640 /etc/ldap/ssl/ldap.key
Пути к сертификату прописываются в cn=config. После перезапуска проверьте, что порт 636 действительно отвечает и отдаёт сертификат.
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.key
sudo systemctl restart slapd
openssl s_client -connect ldap.example.ru:636 -showcerts </dev/null
Самоподписанный сертификат придётся добавить в доверенные на каждом клиенте; в производственной сети удобнее использовать внутренний CA.
Подключаем клиентов через SSSD
На рабочей станции установите sssd-ldap, libnss-sss и libpam-sss, затем опишите домен. Для поиска используется отдельная служебная учётная запись с правом чтения, а не администратор каталога.
[sssd]
services = nss, pam
domains = example.ru
[domain/example.ru]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://ldap.example.ru
ldap_search_base = dc=example,dc=ru
ldap_default_bind_dn = cn=reader,ou=services,dc=example,dc=ru
ldap_default_authtok = CHANGE_ME
ldap_tls_reqcert = demand
cache_credentials = true
Файл /etc/sssd/sssd.conf должен иметь права 600 и принадлежать root. После запуска проверьте, что пользователь виден системе, и включите создание домашнего каталога при первом входе через pam-auth-update.
sudo chmod 600 /etc/sssd/sssd.conf
sudo systemctl enable --now sssd
getent passwd ivanov
id ivanov
Резервное копирование и диагностика
Каталог нельзя копировать на работающем сервере обычным tar: база MDB должна быть согласована. Используйте slapcat, а восстановление выполняйте при остановленной службе.
sudo slapcat -n 1 -l /root/ldap-$(date +%F).ldif
sudo systemctl stop slapd
sudo slapadd -n 1 -l /root/ldap-2026-11-06.ldif
sudo systemctl start slapd
При проблемах смотрите журнал службы и проверяйте аутентификацию отдельно от приложений:
sudo journalctl -u slapd -n 50 --no-pager
ldapwhoami -x -H ldaps://ldap.example.ru -D "uid=ivanov,ou=people,dc=example,dc=ru" -W
Команда ldapwhoami показывает, под кем реально прошла аутентификация. Если она работает, а приложение нет, ищите ошибку в bind DN, базе поиска или ACL.
Чек-лист
- базовый DN и структура подразделений зафиксированы заранее;
- порты 389 и 636 закрыты снаружи, доступ только из своей сети;
- TLS обязателен, самоподписанный сертификат роздан клиентам;
- служебная учётная запись имеет только чтение;
- slapcat выполняется по расписанию, восстановление проверено;
- индексы добавлены, журнал и метрики собираются.
Итог
OpenLDAP даёт своей сети единый каталог пользователей и групп, но требует дисциплины: понятной структуры DN, аккуратных ACL, обязательного TLS и регулярных резервных копий. Начните с одной площадки и небольшого набора записей, подключите клиентов через SSSD и только потом думайте о репликации. Для небольшой сети каталог может показаться избыточным, но при росте числа сервисов он окупается управляемостью и единой точкой отключения доступа.