SSSD и LDAP
Провайдер ldap — это ручной способ: вы сами говорите SSSD, где каталог, в каком дереве искать людей и чем к нему подключаться. Он же спасает, когда каталог есть, а домена Active Directory нет — или когда в AD нет прав заводить компьютеры.
Разница с провайдером ad принципиальная: машинной учётной записи здесь нет. Машина не «входит в домен», она всего лишь читает каталог служебной записью. Значит, и единого входа через Kerberos не будет — пароль проверяется в каталоге.
Минимальный конфиг
[sssd]
config_file_version = 2
services = nss, pam
domains = ldap.example.com
[domain/ldap.example.com]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://ldap.example.com
ldap_search_base = dc=example,dc=com
ldap_default_bind_dn = cn=sssd-reader,ou=services,dc=example,dc=com
ldap_default_authtok = <пароль служебной учётки>
Что здесь что:
| Опция | Смысл |
|---|---|
ldap_uri |
Адрес каталога: ldaps:// (TLS сразу) или ldap:// + ldap_id_use_start_tls = true |
ldap_search_base |
Корень поиска пользователей и групп |
ldap_default_bind_dn |
Служебная учётная запись для чтения каталога |
ldap_default_authtok |
Её пароль. Файл sssd.conf из-за этого обязан быть 600 |
ldap_default_authtok_type |
Тип пароля, если нужен не обычный: password или obfuscated_password |
ldap_id_use_start_tls |
Шифровать соединение через StartTLS вместо ldaps:// |
Схема каталога: что искать
Каталоги описывают учётные записи по-разному, и SSSD нужно сказать, по какой схеме читать:
ldap_schema |
Когда |
|---|---|
rfc2307 |
Классический LDAP (OpenLDAP) с posixAccount / posixGroup, UID и GID есть прямо в каталоге |
rfc2307bis |
То же, но группы — через groupOfNames |
ad |
Каталог Active Directory, к которой обращаются по LDAP, а не провайдером ad |
Если признаков POSIX нет (в AD UID/GID в каталоге не хранятся, там SID), включают сопоставление идентификаторов:
ldap_id_mapping = true
Тогда SSSD сам вычисляет UID и GID из SID — так же, как это делает провайдер ad. Значение по умолчанию зависит от схемы: при ad — включено, при rfc2307 — выключено, и его надо ставить явно, если UID в каталоге нет.
Соответствие «атрибут каталога → поле системы» настраивается отдельно; полный список — в man 5 sssd-ldap-attributes (uid, uidNumber, gidNumber, homeDirectory, loginShell и прочие).
Группы и их корни
Пользователей и группы часто ищут в разных местах:
ldap_search_base = dc=example,dc=com
ldap_group_search_base = ou=groups,dc=example,dc=com
ldap_user_search_base = ou=people,dc=example,dc=com
ldap_group_nesting_level задаёт, на сколько уровней вложенности разворачивать группы. Значение по умолчанию — 2: этого мало, если группы вложены глубже, и тогда «пользователь не в группе», хотя в каталоге он в ней.
Доступ: фильтр вместо «все, кто есть в каталоге»
По умолчанию пускают любого, кого нашли. Чтобы ограничить:
access_provider = ldap
ldap_access_filter = (memberOf=cn=linux-admins,ou=groups,dc=example,dc=com)
Проверка доступа (ldap_access_order) умеет и другие правила — срок действия учётной записи (ldap_account_expire_policy), блокировку, выход за пределы кэша. Но начинать всегда стоит с одного фильтра: предсказуемо и видно, что происходит.
TLS и сертификаты
Открытый LDAP в сети — это пароль учётной записи, уходящий по сети. Поэтому:
ldaps://(порт 636) — TLS устанавливается сразу;ldap://+ldap_id_use_start_tls = true(порт 389) — соединение начинается открытым и шифруется командой StartTLS.
Если сертификат выдан своим удостоверяющим центром, его надо предъявить SSSD, иначе проверка не пройдёт:
ldap_tls_cacert = /etc/ssl/certs/ca-certificates.crt
Полный список опций TLS (ldap_tls_cert, ldap_tls_key, ldap_tls_reqcert, ldap_tls_cipher_suite) — в man 5 sssd-ldap.
Порядок проверки
Идти надо снизу вверх: сначала «видит ли каталог обычный инструмент», потом «видит ли SSSD», и только потом «пускает ли вход».
# 1. Каталог отвечает и служебная учётка читает дерево
$ ldapsearch -x -H ldaps://ldap.example.com \
-D 'cn=sssd-reader,ou=services,dc=example,dc=com' -W \
-b 'dc=example,dc=com' '(uid=user)' uid uidNumber gidNumber
# 2. SSSD нашёл того же пользователя
$ getent passwd user@ldap.example.com
$ id user@ldap.example.com
# 3. Вход и доступ
$ sudo sssctl user-checks user@ldap.example.com
# 4. Кэш и журнал, если что-то не сходится
$ sudo sss_cache -E
$ sudo tail -n 50 /var/log/sssd/sssd_ldap.example.com.log
Если ldapsearch находит пользователя, а getent — нет, дело почти всегда в трёх вещах: не тот ldap_search_base, отсутствует uidNumber без ldap_id_mapping, или каталог не пускает служебную учётную запись по фильтру поиска.
Каталог есть, а пароль меняют в нём
Смена пароля через SSSD (passwd для доменного пользователя) требует, чтобы каталог разрешал запись. Опции ldap_chpass_uri, ldap_chpass_dns_service_name и ldap_chpass_update_last_change — в man 5 sssd-ldap. Если запись запрещена, пароль меняют инструментами каталога, а SSSD только читает.
Источники
man 5 sssd-ldap— перечень опцийldap_*и их значения по умолчанию;man 5 sssd-ldap-attributes— сопоставление атрибутов;man 5 sssd.conf— общие опции. Пакетsssd-common2.12.0-1ubuntu5.5 (проверено 18.10.2026).man 1 ldapsearch— пакетldap-utils.
Что ещё не проверено
- Конфиг сверен с man-страницами пакета, но не запускался: каталога LDAP у нас нет. Это описание настроек, а не отчёт о прогоне.
- Сопоставление атрибутов (
sssd-ldap-attributes) зависит от того, как заведён конкретный каталог: без доступа к нему правильный набор атрибутов не подобрать.
Комментарии
Пока комментариев нет.