Ошибка LDAP error code 49: причины и решение проблемы аутентификации

Ошибка LDAP error code 49: причины и решение проблемы аутентификации

Проблема

При попытке аутентификации пользователя в домене Active Directory или в любой LDAP-совместимой службе каталогов (OpenLDAP, FreeIPA, ALD) клиент получает ошибку LDAP error code 49 Invalid Credentials. Внешне это проявляется по-разному: отклонённый вход в систему под правильным паролем, невозможность подключиться к корпоративному Wi‑Fi через RADIUS, сбой синхронизации учётных записей между серверами или сообщение «Неверное имя пользователя или пароль» в веб-приложениях, использующих LDAP-бэкенд. Администратор проверяет учётные данные и убеждается, что пароль введён верно, учётная запись не заблокирована и не истекла. Тем не менее, сервер каталогов упорно возвращает resultCode: 49. Причина кроется не в самом пароле, а в дополнительных данных, которые LDAP-сервер прикрепляет к ответу. ldap error code 49 это универсальный контейнер, внутри которого скрывается одна из нескольких конкретных проблем, и без расшифровки вложенного кода диагностика превращается в гадание.

Решение

Мы будем анализировать полный ответ LDAP-сервера, включая поле data (шестнадцатеричный код ошибки), и сопоставлять его с известными причинами. Такой подход документирован в Microsoft Active Directory LDAP Error Codes и RFC 4511 — LDAP Protocol Specification, который определяет структуру LDAP-ответов. Далее для каждого подкода применим конкретное исправление: сброс пароля, разблокировку учётной записи, коррекцию имени пользователя или настройку привязки. Дополнительно разберём сценарий, когда код 49 возникает из-за некорректной конфигурации SSL/TLS или требования подписания LDAP-трафика (LDAP signing).

Пошаговая инструкция

Шаг 1. Получение полного текста ошибки с вложенным кодом

Первое, что необходимо сделать эт перехватить детальный ответ сервера. Если ошибка возникает в веб-приложении, изучите его логи аутентификации. В Windows события входа с ошибкой 49 записываются в журнал безопасности контроллера домена:

  1. Откройте Просмотр событий → Журналы Windows → Безопасность.
  2. Найдите событие с кодом 4771 (Kerberos pre-authentication failed) или 4625 (учётная запись не смогла войти в систему) и статусом 0x18  это эквивалент LDAP error 49 для Kerberos.
  3. Внутри события ищите строку Failure Code или Result Code. Для чистого LDAP-запроса выполните тест с помощью утилиты ldp.exe (входит в Windows) или ldapsearch на Linux:

Windows (ldp.exe):

ldp.exe → Connection → Connect → введите адрес контроллера домена.
Connection → Bind → введите учётные данные.

В правой панели отобразится результат, например:

resultCode: 49
data: 80090308

Linux (ldapsearch):

bash

ldapsearch -x -H ldap://dc.company.local -D "cn=user,dc=company,dc=local" -W -b "dc=company,dc=local"

В выводе будет строка ldap_bind: Invalid credentials (49), но детальный код (data: 80090308) покажет только расширенная трассировка (-d 1).

Ключевое поле  data, содержащее шестнадцатеричный код, уточняющий причину отказа. В Windows это восьмизначное число (например, 80090308), в OpenLDAP текстовая строка, например data 52e.

Шаг 2. Расшифровка вложенного кода ошибки

Соответствие кодов и причин для Active Directory:

Код в поле dataСимволическое имяОписание
52eERROR_INVALID_CREDENTIALSНеверное имя пользователя или пароль. Самая частая причина.
532ERROR_ACCOUNT_EXPIREDСрок действия учётной записи истёк.
533ERROR_ACCOUNT_DISABLEDУчётная запись отключена.
701ERROR_ACCOUNT_EXPIRED (расширенный)Срок действия учётной записи истёк (альтернативный код).
773ERROR_PASSWORD_MUST_CHANGEПользователь должен сменить пароль при следующем входе, но операция не позволяет этого сделать.
775ERROR_ACCOUNT_LOCKED_OUTУчётная запись заблокирована (после превышения порога неудачных попыток).
80090308SEC_E_INVALID_TOKENСервер не смог обработать предоставленный токен. Часто возникает, когда указан неполный DN, или когда клиент пытается аутентифицироваться по NTLM, а сервер требует Kerberos.
80090322SEC_E_WRONG_PRINCIPALНеправильное имя участника безопасности (SPN). Обычно при обращении к серверу по псевдониму, отличному от имени, на которое выдана служба.

Для OpenLDAP детализация идёт через текстовые сообщения: Invalid credentials (чистый 49), user password has expired и т. п. Если в ответе нет вложенного кода, посмотрите в журналы службы journalctl -u slapd.

Шаг 3. Исправление типовых ситуаций

3.1. Неверное имя пользователя или пароль (код 52e):

  • Убедитесь, что пользователь вводит правильный пароль, Caps Lock не включён, раскладка клавиатуры верна.
  • В Active Directory сбросьте пароль и попросите пользователя сменить его при следующем входе (снимите флаг «Срок действия пароля не ограничен», если он установлен).
  • Проверьте, не истёк ли пароль: в оснастке Active Directory Users and Computers (ADUC) на вкладке Учётная запись проверьте дату окончания пароля и задайте новый.

3.2. Учётная запись отключена (код 533):

  • Откройте ADUC, найдите пользователя, в свойствах на вкладке Учётная запись снимите флаг Учётная запись отключена.
  • Если учётная запись была отключена из-за политики неактивности (например, пользователь не входил более 30 дней), скорректируйте политику или вручную включите запись.

3.3. Учётная запись заблокирована (код 775):

  • В ADUC на вкладке Учётная запись нажмите Разблокировать учётную запись.
  • Проверьте, что порог блокировки в политике домена не слишком низкий (рекомендуется не менее 10 попыток), и выясните источник неудачных попыток (просроченный пароль на сервере, сохранённые сеансы RDP, мобильные устройства).

3.4. Пользователь должен сменить пароль (код 773):

  • При чисто LDAP-аутентификации смена пароля невозможна через Bind. Сбросьте флаг «Требовать смену пароля при следующем входе» для учётной записи или попросите пользователя войти в систему Windows для смены пароля.

3.5. Ошибка токена неполный DN (код 80090308):

  • В LDAP-запросе используйте полный Distinguished Name: cn=Administrator,cn=Users,dc=company,dc=local, а не просто Administrator.
  • Если используется UPN (user@company.local), убедитесь, что он зарегистрирован в каталоге и что вы не перепутали формат.
  • Включите на сервере протоколирование LDAP для детального анализа: How to enable LDAP logging in Windows Server.

3.6. Ошибка из-за требования подписания LDAP (LDAP signing):

Начиная с определённых обновлений Windows, контроллеры домена могут требовать подписанные LDAP-запросы (LDAP signing required). Если клиент пытается выполнить простую привязку (simple bind) без TLS, сервер возвращает resultCode: 49 с дополнительным кодом 80090346 или SEC_E_ILLEGAL_MESSAGE. Решение: либо включить LDAP over SSL/TLS (LDAPS) на контроллере домена, либо временно ослабить политику (не рекомендовано). Документация: LDAP signing requirements.

Шаг 4. Настройка проверки подлинности в приложениях, использующих LDAP

Часто ошибка 49 возникает не из-за неверных учётных данных, а из-за неправильно сконфигурированного DN-шаблона для Bind.

  1. В веб-приложении (GLPI, Confluence, GitLab, самописная админка) найдите настройки LDAP/Active Directory.
  2. Проверьте поле Bind DN. Например, для Active Directory обычно используется строка вида CN=ldap_bind,OU=ServiceAccounts,DC=company,DC=local. Это должна быть специально созданная учётная запись с минимальными правами, а не личная учётка администратора.
  3. Убедитесь, что пароль для Bind DN не истёк и что учётная запись не заблокирована.
  4. В поле Search Base укажите корень каталога: dc=company,dc=local.
  5. Если поле User DN template используется для аутентификации пользователей, типовой шаблон для Active Directory — {user}@company.local или cn={user},ou=Users,dc=company,dc=local. Неверный шаблон приводит к ошибке 49.
  6. Включите отладку LDAP на стороне приложения. Например, в Apache Directory Studio подключитесь к серверу и повторите Bind, чтобы увидеть сырой ответ.

Устранение распространённых проблем

СимптомВероятная причинаРешение
Ошибка 49 только у одного пользователя, остальные работаютЗаблокирована учётная запись, истёк пароль или пароль изменён на старом клиентеСбросьте пароль, разблокируйте запись.
Ошибка 49 для всех пользователей приложенияНеправильный Bind DN или пароль сервисной учётной записиПроверьте срок действия пароля сервисной учётной записи, обновите пароль в настройках приложения.
Ошибка 49 при использовании ldapsearch с правильными даннымиСервер требует STARTTLS или LDAPS, а клиент пытается выполнить простой BindИспользуйте -Z для STARTTLS или ldaps:// с опцией -H.
Ошибка 49 с кодом 80090308 при привязке к OpenLDAPНеправильно задан DN пользователя (пропущена OU или DC)Проверьте дерево каталогов через ldapsearch -x -b "dc=company,dc=local" и уточните DN.
В журналах Windows события 4771 с кодом 0x18Неверный пароль или проблемы с KerberosСбросьте пароль пользователя, убедитесь, что время на клиенте и контроллере домена синхронизировано (разница не более 5 минут).

Итог

Ldap error code 49  это диагностический указатель, который через вложенный код data точно сообщает, почему сервер каталогов отверг попытку аутентификации. Научившись читать эти коды, вы сможете за минуты различать истёкший пароль, заблокированную учётную запись и элементарную опечатку в DN, не тратя время на слепую смену паролей и перезагрузку служб. В сложных случаях, когда ошибка возникает из-за требований подписания LDAP или проблем Kerberos, диагностика потребует включение дополнительного логирования, но отправная точка всегда одна детальный код в ответе сервера. Сохраните таблицу кодов в закладки она ещё не раз сэкономит вам часы при разборе инцидентов аутентификации.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu