Linux LDAP-клиент через SSSD: централизованная аутентификация
Москва, Щёлковское шоссе, д. 92, корп. 7 · Пн–Пт 9:00–19:00 · +7 903 729-62-41

Настройка Linux LDAP-клиента через SSSD для централизованной аутентификации

Linux LDAP-клиент через SSSD: централизованная аутентификация

Зачем нужен SSSD и что он умеет

SSSD (System Security Services Daemon) — демон для централизованной аутентификации в Linux. Его главная задача: дать Linux-серверу возможность авторизовывать пользователей через Active Directory, FreeIPA или чистый LDAP — так же, как Windows-компьютеры в домене.

Без SSSD каждый Linux-сервер хранит своих пользователей локально. 20 серверов — 20 отдельных баз /etc/passwd. Уволился сотрудник — нужно удалять учётку на каждом. Неудобно и небезопасно. SSSD решает это централизацией.

Что умеет SSSD:

  • Аутентификация через AD, FreeIPA, OpenLDAP
  • Кэширование учётных данных — работает при недоступном сервере каталогов
  • Интеграция с sudo через LDAP
  • SSH-ключи из LDAP/AD
  • Kerberos-аутентификация
  • Ограничение доступа по группам AD

Подключение к Active Directory

Самый распространённый сценарий в нашей практике — Linux-серверы в Windows-домене Active Directory. Разберём пошагово.

До realm join я проверяю две вещи. Первая — DNS: сервер должен резолвить домен через контроллеры AD, иначе realm discover ничего не найдёт. Вторая — время: библиотека Kerberos по умолчанию допускает расхождение часов не больше 300 секунд (параметр clockskew в krb5.conf), поэтому chrony или systemd-timesyncd смотрят на контроллер домена. После ввода SSSD сам меняет пароль учётной записи компьютера: раз в сутки проверяет его возраст и обновляет, если он старше ad_maximum_machine_account_password_age — по умолчанию 30 дней.

Установка и ввод в домен

На Ubuntu 22.04 / Debian 12:

# Установка необходимых пакетов
apt install sssd sssd-ad sssd-tools realmd adcli \
  packagekit samba-common-bin oddjob oddjob-mkhomedir -y

# Проверяем, видим ли домен
realm discover corp.company.ru
# corp.company.ru
#   type: kerberos
#   realm-name: CORP.COMPANY.RU
#   domain-name: corp.company.ru
#   configured: no
#   ...

# Вводим машину в домен (нужны права Domain Admin или делегированные)
realm join corp.company.ru -U Administrator
# Password for Administrator: ****

# Проверяем
realm list
id Administrator@corp.company.ru

Команда realm join автоматически создаёт запись компьютера в AD, генерирует keytab, настраивает sssd.conf и PAM. Это удобнее ручной настройки.

Ручная настройка sssd.conf для AD

Если нужен полный контроль — конфигурируем вручную:

# /etc/sssd/sssd.conf (chmod 600!)
[sssd]
domains = corp.company.ru
config_file_version = 2
services = nss, pam, sudo

[domain/corp.company.ru]
ad_domain = corp.company.ru
krb5_realm = CORP.COMPANY.RU
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = True  # john@corp.company.ru
fallback_homedir = /home/%u@%d
access_provider = ad

# Ограничить вход по группе AD
access_provider = simple
simple_allow_groups = linux-admins@corp.company.ru, linux-users@corp.company.ru

# Запускаем
systemctl enable --now sssd

# Автосоздание домашних каталогов
# /etc/pam.d/common-session
# session optional pam_mkhomedir.so skel=/etc/skel umask=0022
Подключение к FreeIPA
Подключение Linux к Active Directory

Подключение к FreeIPA

FreeIPA — open source-альтернатива AD для Linux-инфраструктуры. Используем у клиентов, где нет Windows-домена.

Требования к DNS и времени здесь те же, что для AD: Kerberos не простит расхождение часов больше пяти минут. Разница в том, что ipa-client-install сам настраивает SSSD, Kerberos и NSS, и руками sssd.conf я на таких серверах обычно не трогаю — все правила доступа (HBAC) и sudo живут на сервере FreeIPA.

Ввод в домен FreeIPA

Подключение Linux к FreeIPA через ipa-client:

# Установка клиента
apt install freeipa-client -y

# Автоматическая настройка (если DNS настроен правильно)
ipa-client-install --mkhomedir

# Ручная настройка с явными параметрами
ipa-client-install \
  --server=ipa.company.ru \
  --domain=company.ru \
  --realm=COMPANY.RU \
  --principal=admin \
  --password='AdminPassword' \
  --mkhomedir \
  --unattended

# Проверяем
ipa whoami
id john@company.ru

FreeIPA настраивает SSSD, Kerberos и NSS автоматически. После ipa-client-install сервер уже в домене — можно проверять аутентификацию.

Sudo через SSSD

Права sudo хранятся в LDAP/AD и применяются на всех серверах сразу — не нужно редактировать sudoers на каждой машине.

Настройка sudo через AD

Конфигурация sudo через LDAP для AD-домена:

# В sssd.conf добавляем:
[domain/corp.company.ru]
# ... существующие настройки ...
sudo_provider = ad

[sssd]
services = nss, pam, sudo  # добавляем sudo

# /etc/sudo-ldap.conf (для классического LDAP-sudo)
uri ldap://ldap.company.ru
sudoers_base ou=SUDOers,dc=company,dc=ru
binddn cn=sudo-reader,ou=Service Accounts,dc=company,dc=ru
bindpw <password>

# /etc/nsswitch.conf
sudoers: files sss  # добавляем sss

# Проверяем
sudo -l -U john@corp.company.ru

В FreeIPA sudo-правила создаются через веб-интерфейс или ipa sudorule-add — намного удобнее, чем LDIF-записи в OpenLDAP.

Диагностика SSSD
Диагностика и отладка SSSD

Диагностика SSSD

SSSD бывает капризным при настройке. Вот инструменты, которые реально помогают.

Про логи: каждый сервис SSSD пишет в свой файл, а debug_level в секции [sssd] включает отладку только для главного процесса, не для провайдера домена и не для nss/pam. Поэтому уровень ставлю в те секции, которые разбираю, обычно [domain/...] и [pam]. Шкала — от 0 до 9, по умолчанию 0x0070, что соответствует 2 (фатальные, критические и серьёзные ошибки). Без перезапуска уровень меняется утилитой sss_debuglevel.

Команды диагностики

Набор команд при возникновении проблем с SSSD:

# Статус и логи
systemctl status sssd
journalctl -u sssd -f

# Детальные логи (добавить в sssd.conf)
# [domain/corp.company.ru]
# debug_level = 7
# systemctl restart sssd
# journalctl -u sssd | tail -100

# Проверка пользователя
id john@corp.company.ru
getent passwd john@corp.company.ru
getent group 'domain admins@corp.company.ru'

# Полная диагностика через sssctl
sssctl user-checks john@corp.company.ru
sssctl domain-status corp.company.ru

# Очистка кэша (при устаревших данных)
sss_cache -E  # очистить всё
sss_cache -u john@corp.company.ru  # конкретный пользователь

# Проверка Kerberos-тикета
kinit john@CORP.COMPANY.RU
klist

Доступ по GPO: почему пользователь AD не может войти

Типичная картина: id user@corp.company.ru возвращает UID и группы, пароль верный, а SSH отвечает «Permission denied». Если в конфиге стоит access_provider = ad, первым делом смотрю на групповые политики. Параметр ad_gpo_access_control по умолчанию равен enforcing: SSSD читает GPO, привязанные к компьютеру, и применяет к Linux-входу те же права, что Windows.

  • SSH и cockpit по умолчанию сопоставлены с правом «Разрешить вход в систему через службу удалённых рабочих столов» (RemoteInteractiveLogonRight). Если хоть одна применяемая политика задаёт это право, войдут только перечисленные в нём пользователи и группы.
  • Консольный вход, su и графические менеджеры входа сопоставлены с правом «Локальный вход в систему» (InteractiveLogonRight).
  • Встроенные группы AD, например Administrators с SID S-1-5-32-544, SSSD в правилах GPO игнорирует — участие в них доступа не даёт.
  • Если контейнер групповой политики недоступен SSSD на чтение, вход по умолчанию запрещается (ad_gpo_ignore_unreadable = False).

На переходный период я включаю режим permissive: правила вычисляются, но не применяются, а в syslog пишется, кого бы не пустили. Для этих сообщений нужен уровень отладки трассировки. Когда в логах чисто, возвращаю enforcing.

[domain/corp.company.ru]
access_provider = ad
ad_gpo_access_control = permissive
# свой PAM-сервис в список для удалённого входа:
# ad_gpo_map_remote_interactive = +my_pam_service

Если GPO для Linux не нужны вовсе, есть значение disabled, но тогда ограничение по группам делаю через access_provider = simple и simple_allow_groups, как в примере выше.

Кэш и производительность в больших доменах

На доменах с тысячами объектов SSSD может заметно тормозить на первом входе или на getent group. Настройки, которые я проверяю в первую очередь:

  • enumerate — по умолчанию FALSE, и я его не включаю. При TRUE SSSD скачивает и хранит все учётки и группы домена; для отображения вторичных групп перечисление не нужно.
  • ignore_group_members = True — SSSD перестаёт запрашивать членов групп. getent group имя покажет группу пустой, зато проверки членства для провайдера доступа, по документации, заметно ускоряются, особенно на группах с большим числом участников.
  • entry_cache_timeout — сколько секунд запись считается свежей, по умолчанию 5400. Новое значение действует только на новые или уже устаревшие записи, поэтому после изменения запускаю sss_cache -E.
  • cache_credentials — по умолчанию FALSE, то есть вход без связи с AD сам по себе не работает. Пароли в кэше хранятся в виде хеша SHA512.
  • offline_credentials_expiration (секция [pam]) — сколько дней после последнего успешного онлайн-входа разрешён вход из кэша. По умолчанию 0, то есть без ограничения; я задаю явное число, чтобы уволенный сотрудник не входил бесконечно на сервер, потерявший связь с доменом.

Чек-лист после ввода сервера в домен

  1. Права на конфиг: /etc/sssd/sssd.conf — обычный файл, владелец root, чтение и запись только root (0600). Те же владелец и права документация требует для файлов в /etc/sssd/conf.d/.
  2. В sssd.conf нет комментариев в конце строк. Формат их не поддерживает, поэтому пояснения вида services = nss, pam, sudo # ... из примеров выше в рабочем файле переношу на отдельную строку.
  3. realm list показывает домен, chronyc tracking или timedatectl — синхронизированное время.
  4. id и getent passwd для доменного пользователя возвращают данные, sssctl domain-status показывает домен онлайн.
  5. SSH-вход пользователем из разрешённой группы проходит, пользователем вне её — отклоняется. Проверяю оба случая: без второго не видно, что ограничение вообще работает.
  6. Вход из кэша: временно закрываю доступ к контроллерам и пробую войти пользователем, который уже входил. Потом возвращаю доступ.
  7. Локальная учётка с SSH-ключом и sudo на месте — на случай, если SSSD или домен недоступны.

Часто задаваемые вопросы

SSSD кэширует данные пользователей — вход работает даже при недоступном AD/LDAP. Поддерживает несколько провайдеров. Интегрирует sudo, SSH-ключи, Kerberos. PAM через pam_ldap проще, но теряет кэширование и не работает при обрыве связи.

id username@domain.local — UID, GID и группы. getent passwd username@domain.local — запись из NSS. sssctl user-checks username@domain.local — полная диагностика. sss_cache -G -U — очистить кэш при проблемах.

Да, для пользователей с кэшированными данными. Параметр cache_credentials = True и offline_credentials_expiration = 7 в секции [pam]. После 7 дней без связи вход блокируется. Всегда держите локальный root с SSH-ключом.

В /etc/pam.d/common-session добавьте: session required pam_mkhomedir.so skel=/etc/skel umask=0022. При первом входе домашний каталог создаётся автоматически.

Да, в sssd.conf: access_provider = simple, simple_allow_groups = linux-admins, linux-users. Только члены этих групп AD смогут войти. Или через access_provider = ad и GPO — гибче, но сложнее.

#linux ldap client #sssd настройка #sssd active directory

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

Подпишитесь на рассылку ITfresh

Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.

Письмо придёт в течение минутыНе нашли его во «Входящих» — загляните в папку «Спам» или «Промоакции» и нажмите «Не спам». Так все следующие выпуски будут приходить прямо в основную почту.
Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.