Сбой LDAP-аутентификации парализует вход пользователей в корпоративные сервисы. В 80% случаев корень проблемы - неверные учетные данные, сетевая недоступность контроллера домена или расхождение поисковой базы в конфигурации клиента. Эта шпаргалка дает вам точный алгоритм: от проверки пароля утилитой ldapwhoami до анализа трафика через tcpdump и сброса кэша SSSD. Выполните шаги последовательно и верните аутентификацию в строй за 15 минут.
Материал построен на реальных кейсах восстановления доступа к серверам приложений и системам мониторинга. Команды проверены на RHEL-подобных дистрибутивах и Debian, актуальны для OpenLDAP и FreeIPA. Если вы настраивали интеграцию Zabbix с доменом, вам будет знаком контекст - ранее мы разбирали миграцию с локальных пользователей на LDAP в Zabbix без остановки мониторинга, и теперь вы получите инструмент для экстренной диагностики, когда что-то пошло не так.
С чего начать: быстрая проверка учетных данных
Ошибка «Invalid Credentials» (код возврата 49) - самый частый симптом. Сервер каталога получил bind-запрос, но отклонил его из-за несовпадения пароля или некорректного DN пользователя. Первое действие - исключить человеческий фактор: проверьте раскладку клавиатуры, Caps Lock и срок действия пароля в домене. Затем переходите к инструментальной проверке.
Использование ldapwhoami для тестового bind-запроса
Утилита ldapwhoami выполняет простую операцию bind и возвращает идентификатор подключившегося пользователя. Это самый быстрый способ валидации пары «DN-пароль» без выполнения поисковых запросов.
Синтаксис команды:
ldapwhoami -x -D "uid=ivanov,ou=users,dc=example,dc=com" -W -H ldap://dc1.example.com
Разбор ключей:
- -x - простая аутентификация (Simple Bind) без SASL;
- -D - Distinguished Name пользователя, от имени которого выполняется подключение;
- -W - интерактивный запрос пароля (безопаснее, чем указывать пароль в командной строке);
- -H - URI LDAP-сервера.
Интерпретация результата:
- Успех:
dn:uid=ivanov,ou=users,dc=example,dc=com- учетные данные верны, проблема на стороне клиентского приложения или в механизме кэширования. - ldap_bind: Invalid credentials (49) - пароль неверен, DN содержит опечатку, или учетная запись заблокирована. Дополнительно проверьте подстроку
data 52e(неверный пароль) илиdata 775(блокировка) в ответе Active Directory. - ldap_bind: No such object (32) - переданный DN не существует в каталоге. Сверьте путь к пользователю через ldapsearch.
Как найти правильный DN пользователя
Если вы не уверены в точном DN, найдите его поиском по uid или sAMAccountName. Команда выполняет анонимный поиск и возвращает полный путь к объекту:
ldapsearch -x -b "dc=example,dc=com" "(uid=ivanov)" dn
Для Active Directory атрибут uid заменяется на sAMAccountName:
ldapsearch -x -b "dc=example,dc=com" "(sAMAccountName=ivanov)" dn
Типовые ошибки на этом этапе: лишние пробелы в DN, путаница между uid и cn, неверный порядок организационных единиц (ou). Если поиск не дает результатов, проблема в Base DN - она рассмотрена в разделе «Исправление неверной базы поиска».
Диагностика сетевых проблем и таймаутов подключения
Сервер каталога физически недоступен, порт закрыт брандмауэром, или TLS-рукопожатие обрывается на полпути. Симптомы: клиент зависает на десятки секунд, в логах фигурируют «Connection timed out» или «Can't contact LDAP server». Диагностика выполняется послойно - от ICMP до прикладного уровня.
Проверка доступности порта с помощью telnet или nc
Базовый тест, не требующий LDAP-утилит. Выполняется с хоста, на котором настроен клиент аутентификации.
# Для LDAP без шифрования
nc -zv dc1.example.com 389
# Для LDAPS
telnet dc1.example.com 636
Интерпретация:
- Connection to ... succeeded - порт открыт, проблема выше по стеку (TLS, учетные данные, поисковая база).
- Connection refused - сервер отверг соединение. Служба slapd или контроллер домена не слушают этот порт, либо срабатывает локальный файрвол на сервере.
- Connection timed out - пакет не дошел до целевого хоста. Проверьте правила iptables/nftables на клиенте и промежуточных маршрутизаторах.
Если вы недавно выполняли харденинг Linux-сервера и обновляли правила файрвола, убедитесь, что порты 389 и 636 не заблокированы в цепочке OUTPUT на клиенте.
Анализ трафика с tcpdump
Когда порт открыт, но bind-запросы не доходят или возвращают неожиданные ошибки, захват трафика становится единственным достоверным источником информации. Команда перехватывает пакеты на всех интерфейсах и выводит детализацию:
tcpdump -i any port 389 or port 636 -v -A
На что обратить внимание в выводе:
- Client Hello / Server Hello - начало TLS-рукопожатия. Если после Client Hello нет ответа, сервер не поддерживает запрошенную версию TLS или не принимает сертификат клиента.
- Alert: certificate expired - сертификат сервера или клиента просрочен. Проверьте сроки действия командой
openssl s_client -connect dc1.example.com:636. - bindRequest ... invalidDNS - LDAP-сервер получил запрос и отверг его на уровне протокола. Причина указана в теле ответа.
Для систем с высокими требованиями к безопасности мы рекомендуем использовать LDAPS вместо открытого LDAP. Детальная настройка защищенного подключения с проверкой сертификатов разобрана в статье настройка SSL/TLS для TrueNAS и Active Directory - принципы диагностики TLS-ошибок идентичны для любого клиента.
Исправление неверной базы поиска (Base DN)
Base DN определяет ветку каталога, в которой клиент ищет пользователей. Несовпадение этого параметра с реальной структурой LDAP-дерева приводит к ошибке «No such object» даже при корректных учетных данных. Клиент ищет пользователя в ou=people,dc=company,dc=local, а фактически учетные записи хранятся в ou=users,dc=company,dc=local - аутентификация провалена.
Получение Base DN с сервера через RootDSE
RootDSE (Root Directory Server Agent Service Entry) - специальная запись в корне каталога, которая содержит метаданные сервера, включая доступные контексты именования (namingContexts). Запрос не требует аутентификации:
ldapsearch -x -H ldap://dc1.example.com -s base namingContexts
Пример ответа:
dn:
namingContexts: DC=example,DC=com
namingContexts: CN=Configuration,DC=example,DC=com
namingContexts: CN=Schema,CN=Configuration,DC=example,DC=com
Первый namingContext - это искомый Base DN для поиска пользователей. Остальные контексты служебные и не содержат учетных записей.
Корректировка конфигурации клиента
Полученный Base DN необходимо прописать в конфигурации сервиса, отвечающего за интеграцию с LDAP. Расположение параметра зависит от используемого модуля:
- SSSD: в файле
/etc/sssd/sssd.confпараметрldap_search_baseв секции[domain/...]. После изменения выполнитеsystemctl restart sssd. - nslcd: в файле
/etc/nslcd.confпараметрbase. Рестарт:systemctl restart nslcd. - libnss-ldap / libpam-ldap: в файле
/etc/ldap.confпараметрbase. Эти модули не требуют перезапуска службы, изменения применяются немедленно.
Частая ошибка - указание слишком узкого Base DN, например ou=users,dc=example,dc=com, в то время как группы безопасности лежат в ou=groups,dc=example,dc=com. Если клиент проверяет членство в группах через атрибут memberOf, поиск не найдет группу и аутентификация провалится. Всегда указывайте корень домена, если нет жестких требований к изоляции поддерева.
Устранение последствий кэширования неудачных попыток
Вы исправили пароль или разблокировали учетную запись на контроллере домена, но пользователь по-прежнему не может войти. Причина - локальный кэш SSSD или счетчик неудачных попыток PAM, который заблокировал доступ на стороне клиента до истечения таймаута. Очистка кэша и сброс счетчиков решают эту проблему мгновенно.
Очистка кэша SSSD
SSSD кэширует учетные данные и членство в группах для обеспечения офлайн-аутентификации. При несовпадении кэша с реальным состоянием каталога помогает полная инвалидация:
# Очистить весь кэш
sss_cache -E
# Очистить кэш конкретного пользователя
sss_cache -u ivanov
# Проверить статус SSSD после очистки
systemctl status sssd
Логи SSSD хранятся в /var/log/sssd/. Файл sssd_nss.log показывает запросы к NSS-модулю, sssd_pam.log - операции аутентификации. При включенном debug_level эти логи содержат пошаговый трейс каждого bind-запроса.
Сброс счетчика неудачных попыток PAM
Модуль pam_faillock блокирует учетную запись после N последовательных неверных паролей. Блокировка действует на уровне локальной системы, даже если LDAP-сервер готов принять корректные учетные данные.
# Посмотреть текущие блокировки пользователя
faillock --user ivanov
# Сбросить счетчик неудачных попыток
faillock --user ivanov --reset
Настройки блокировки задаются в /etc/security/faillock.conf. Параметры deny (количество попыток) и unlock_time (время блокировки в секундах) определяют порог срабатывания. В средах с централизованной аутентификацией рекомендуется синхронизировать эти значения с политикой блокировок на контроллере домена.
Если вы используете NSCD для кэширования, очистите и его:
nscd -i passwd
nscd -i group
Анализ логов: где искать и что читать
Когда предыдущие шаги не выявили причину, логи становятся основным источником информации. Правило простое: на клиенте смотрим журналы PAM и SSSD, на сервере - журнал slapd или службы каталогов.
Логи на стороне клиента
Первичный источник - системный журнал аутентификации. Местоположение зависит от дистрибутива:
- RHEL / CentOS / Fedora:
/var/log/secureилиjournalctl -u sssd -f - Debian / Ubuntu:
/var/log/auth.log
Типовые записи и их расшифровка:
- pam_sss(...): authentication failure; ... user=ivanov - модуль PAM передал запрос в SSSD, но аутентификация не прошла. Причина указана в логах SSSD.
- sssd[be[example.com]]: Bind result: Invalid credentials - LDAP-сервер отклонил пароль. Проверьте пароль через ldapwhoami, как описано в первом разделе.
- sssd[be[example.com]]: TLS handshake failed - проблема с сертификатами или версией протокола. Проверьте цепочку сертификатов командой
openssl s_client.
Для детальной диагностики включите расширенное логирование в /etc/sssd/sssd.conf, добавив в секцию [domain/...] параметр debug_level = 7. После перезапуска SSSD каждый шаг взаимодействия с LDAP-сервером будет записан в /var/log/sssd/sssd_example.com.log.
Логи на стороне сервера
Если у вас есть доступ к LDAP-серверу, журнал серверной стороны покажет, дошел ли bind-запрос и с каким результатом был обработан.
- OpenLDAP (slapd): по умолчанию пишет в syslog. Для выделенного файла настройте
loglevelв/etc/openldap/slapd.confили через динамическую конфигурациюolcLogLevel. Значение256включает логирование всех bind-запросов. - 389 Directory Server: журнал доступа находится в
/var/log/dirsrv/slapd-INSTANCE/access. Записи с тегомRESULT err=49указывают на неверные учетные данные.
Сопоставление временных меток клиентского и серверного логов - надежный способ подтвердить, что проблема локализована на одном из хостов, а не в сети.
План восстановления за 15 минут: пошаговая шпаргалка
Сжатый алгоритм для экстренной ситуации. Выполняйте шаги последовательно, от простого к сложному. Каждый шаг содержит команду и ожидаемый результат.
- Сетевая доступность.
nc -zv dc1.example.com 389. Ожидаемый результат: «Connection succeeded». Если отказ - проверьте файрвол и маршрутизацию. - Разрешение имен.
dig dc1.example.comилиnslookup dc1.example.com. IP-адрес должен соответствовать ожидаемому контроллеру домена. - Валидация учетных данных.
ldapwhoami -x -D "uid=user,ou=users,dc=example,dc=com" -W -H ldap://dc1.example.com. Ожидаемый результат: строка с DN пользователя. Ошибка 49 - сбросьте пароль на сервере каталогов. - Поиск DN пользователя.
ldapsearch -x -b "dc=example,dc=com" "(uid=user)" dn. Убедитесь, что DN из шага 3 соответствует найденному. - Проверка Base DN.
ldapsearch -x -H ldap://dc1.example.com -s base namingContexts. Сверьте вывод с параметромldap_search_baseв/etc/sssd/sssd.confилиbaseв/etc/ldap.conf. - Очистка кэша SSSD.
sss_cache -E. Повторите попытку входа. - Сброс блокировки PAM.
faillock --user username --reset. Повторите попытку входа. - Анализ клиентских логов.
tail -f /var/log/secure(RHEL) илиtail -f /var/log/auth.log(Debian). Ищите строки с «authentication failure» и «pam_sss». - Захват трафика.
tcpdump -i any port 389 -v -A. В другом терминале выполните ldapwhoami. Проверьте, уходит ли bindRequest и приходит ли bindResponse. - Проверка TLS.
openssl s_client -connect dc1.example.com:636. Убедитесь, что сертификат не просрочен и цепочка доверена.
Если все шаги выполнены, но аутентификация не восстановлена, проблема может быть в схеме LDAP - например, отсутствует объектный класс shadowAccount или атрибут userPassword у записи пользователя. Запросите полный объект пользователя: ldapsearch -x -b "dc=example,dc=com" "(uid=user)" и проверьте наличие обязательных для вашего клиента атрибутов.
Для комплексной настройки аутентификации с ролевым доступом изучите полное руководство по интеграции Zabbix и Active Directory - там разобран сквозной процесс от создания сервисного аккаунта до автоматизации доступа через группы безопасности.