Ошибка аутентификации может возникать на любом участке цепочки: клиент, reverse proxy, приложение, системная аутентификация или внешний провайдер входа. Чтобы не просматривать журналы хаотично, начните с фиксации контекста: точное время события, имя пользователя, URL входа, IP-адрес клиента, HTTP-метод, статус ответа, request ID или trace ID, user agent и текст сообщения об ошибке. Затем последовательно проверяйте источники логов от внешнего симптома к первоисточнику сбоя.
Один код ошибки без контекста недостаточен. Сравнивайте статус, сообщение, временную метку и идентификатор запроса на каждом уровне. Работайте с копией или обезличенным фрагментом логов, чтобы не раскрыть секреты.
Что проверить в первые 10 минут при ошибке аутентификации
Зафиксируйте минимальный набор данных для одной попытки входа. Это снизит риск поиска по слишком широкому диапазону логов и сформирует точку отсчета для корреляции событий.
Минимальный набор данных для одной попытки входа
Соберите следующие поля:
- Время события с часовым поясом (например, 2026-08-30T14:23:05+03:00).
- URL или endpoint входа (например, /login, /oauth/callback).
- Имя учетной записи без секретов (только логин, без пароля).
- IP-адрес клиента.
- HTTP-метод (GET, POST).
- Статус ответа (401, 403, 500 и т.д.).
- Request ID или trace ID, если они передаются.
- User agent браузера или клиента.
- Текст сообщения об ошибке (например, "Invalid credentials", "Token expired").
Эти данные позволяют искать событие в разных журналах и связывать записи.
Порядок просмотра источников логов
Проверяйте источники в следующей последовательности:
- Браузер или API-клиент: сообщение об ошибке, код ответа, возможно, сетевые заголовки.
- Reverse proxy (Nginx, HAProxy): access log и error log для входящего запроса.
- Приложение: application log, audit log, структурированные JSON-логи.
- Системная аутентификация: journald, auth.log, secure, логи SSH, PAM.
- Внешний сервис входа (IdP): журнал провайдера, если доступен.
Отсутствие записи на следующем уровне помогает локализовать участок цепочки. Например, если запрос есть в access log proxy, но отсутствует в логе приложения, проблема между proxy и приложением.
Как восстановить цепочку событий по времени и идентификаторам
Связывайте записи из разных компонентов и отличайте первичную причину от последствий. Учитывайте расхождения между часами и форматом журналов.
Временные метки, часовые пояса и синхронизация времени
Проверьте формат времени и часовой пояс на клиенте, proxy, приложении и сервере идентификации. Неверная синхронизация времени приводит к ошибочной корреляции событий. Для токенов, подписей и протоколов SSO критично, чтобы часы были синхронизированы, иначе токен может быть отклонен из-за расхождения времени.
Приведите все временные метки к одному часовому поясу, лучше к UTC. Используйте команды типа date -u для проверки времени на сервере.
Request ID, trace ID и признаки одной попытки входа
Используйте идентификаторы запроса для поиска вместо ненадежного поиска только по имени пользователя или IP-адресу. Если request ID отсутствует, сочетайте временной интервал, endpoint, IP, user agent и upstream-ответ.
Убедитесь, что proxy передает в приложение заголовки X-Request-ID или аналогичные, чтобы можно было связать записи. В Nginx можно настроить:
proxy_set_header X-Request-ID $request_id;
Сообщение о неуспешной сессии в приложении может появиться после исходной ошибки proxy или IdP, поэтому важно строить временную линию.
Системные журналы при ошибке авторизации: что искать на сервере
Системные журналы содержат записи о локальных учетных записях, PAM, SSH и ограничениях ОС. Разделите их по типу сервиса и способу инициализации: systemd journal, файлы auth.log или secure, журналы SSH, PAM и системных сервисов.
Локальная учетная запись, PAM и SSH
Ищите сообщения о неверном пароле, неизвестном пользователе, заблокированной учетной записи, запрете входа, отказе PAM-модуля и превышении лимита попыток. Примеры записей:
- Неверный пароль:
Failed password for user from IP port 22 ssh2 - Неизвестный пользователь:
Invalid user admin from IP - Заблокированная учетная запись:
Account locked due to 5 failed logins - Отказ PAM:
pam_unix(sshd:auth): authentication failure
Чтобы проверить, дошел ли запрос до системной аутентификации, просмотрите журнал соответствующего сервиса (например, sshd) и PAM.
Как фильтровать системные журналы по времени и сервису
Для systemd journal используйте фильтры по unit, процессу, PID, диапазону времени, имени пользователя и уровню сообщения. Примеры:
journalctl -u sshd --since "2026-08-30 14:20:00" --until "2026-08-30 14:25:00"
journalctl _UID=1000 --since today
journalctl -p err --since "1 hour ago"
Для файлов auth.log или secure используйте grep с временным окном:
grep "Aug 30 14:2" /var/log/auth.log
Поиск по слову failed без контекста часто смешивает разные попытки и сервисы, поэтому добавляйте фильтры.
Логи приложения: где находится причина отказа
После того как запрос прошел proxy, проверьте внутреннюю обработку учетных данных, сессии и токенов. Различайте ошибку проверки пароля, отсутствующую сессию, некорректный токен, истекший срок действия, неподдерживаемый алгоритм и внутреннее исключение.
Проверка учетных данных и сессии
Ищите записи для этапов credential check, создания сессии, установки cookie, проверки CSRF и обновления токена. Сопоставьте успешную и неуспешную попытки в одинаковых условиях. Например, для веб-приложения на Python с Flask логи могут содержать:
INFO: User 'alice' authenticated successfully
WARNING: Failed login attempt for user 'bob' from 192.168.1.10
Если после успешной проверки пароля не создается сессия, проблема может быть в хранилище сессий или cookie.
Конфигурация и уровень детализации логирования
Для расследования временно повышайте уровень логирования до DEBUG, но после проверки возвращайте прежний уровень. Избыточная детализация может записать учетные данные и токены, что недопустимо. Убедитесь, что секреты, пароли и полные токены не попадают в диагностический фрагмент.
Reverse proxy: как отличить отказ proxy от ошибки приложения
Пользователь видит ошибку входа, но запрос мог не дойти до приложения или был изменен промежуточным сервером. Сравнивайте access log и error log proxy с логом приложения.
Коды 401, 403 и 5xx в контексте аутентификации
Код 401 обычно указывает на отсутствие или непринятие аутентификационных данных. Код 403 - на запрет доступа при распознанном запросе или субъекте. Код 5xx - на сбой обработки на proxy, upstream или сервисном уровне.
Для каждого случая проверяйте соответствующий лог:
- 401: проверьте, передается ли заголовок Authorization, корректны ли учетные данные, смотрите лог приложения.
- 403: проверьте правила доступа, ACL, роли, смотрите лог приложения и proxy.
- 5xx: проверьте error log proxy, доступность upstream, смотрите лог приложения.
Заголовки, cookie, redirect URI и upstream
Ошибки передачи контекста входа между клиентом, proxy и приложением часто связаны с заголовками. Проверьте:
- Host: должен совпадать с ожидаемым приложением.
- X-Forwarded-Proto: должен быть https, если используется TLS на proxy.
- X-Forwarded-For: для определения реального IP клиента.
- Authorization: не должен быть потерян или искажен.
- Cookie: должны передаваться без изменений.
- Callback или redirect URI: должен точно совпадать с зарегистрированным в IdP.
Неправильная схема HTTP/HTTPS, потерянная cookie или неверный upstream приводят к циклу редиректов или отказу в сессии. В Nginx проверьте конфигурацию:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
TLS и сертификаты на границе proxy
Сбой проверки сертификата отделите от ошибки учетных данных. Признаки: истекший, неподходящий или недоверенный сертификат, ошибки цепочки доверия, несовпадение имени, проблемы с TLS между proxy и upstream.
Ищите подтверждение в error log proxy, журнале TLS-клиента и логе сервиса. Пример ошибки в Nginx:
SSL_do_handshake() failed (SSL: error:14094412:SSL routines:ssl3_read_bytes:sslv3 alert bad certificate)
Внешний провайдер входа: диагностика OIDC, OAuth 2.0 и SAML
Если локальная инфраструктура доступна, но вход через IdP завершается ошибкой или возвращает пользователя обратно на страницу входа, проверьте этапы: перенаправление, callback, обмен кода, проверка токена или assertion, сопоставление пользователя и групп.
Ошибки redirect URI, client ID и callback
Проверьте точное совпадение схемы, домена, порта и пути callback между зарегистрированной конфигурацией IdP и фактическим URL, который формирует приложение за proxy. Убедитесь, что внешний URL определен корректно и нет подмены Host или X-Forwarded-Proto.
Срок действия токена и рассинхронизация времени
Если учетные данные верны, но токен отклоняется, проверьте issued-at, expiration, not-before, часовой пояс и синхронизацию часов на приложении, proxy и IdP. Не включайте в публикацию полные токены и секреты клиента.
Недоступность IdP и ошибки обмена токена
Ищите timeout, DNS-ошибки, ошибки TLS, отказ соединения, HTTP 4xx или 5xx от endpoint токена и сообщения о недоступности discovery или metadata. Сопоставьте время сбоя с журналом провайдера.
Как классифицировать причину по коду и сопутствующему сообщению
Соберите результаты диагностики в рабочую матрицу решений. Ниже таблица для классификации.
| Наблюдаемый код | Характерное сообщение | Уровень возникновения | Что уже исключено | Следующая проверка | Вероятное исправление |
|---|---|---|---|---|---|
| 401 | Invalid credentials | Приложение или IdP | Сеть, proxy | Лог приложения, проверка пароля | Сброс пароля, проверка политики |
| 403 | Access denied | Proxy или приложение | Учетные данные | ACL, роли, правила | Настройка прав |
| 500 | Internal Server Error | Приложение | Proxy | Лог приложения, исключения | Исправление кода |
| 502 | Bad Gateway | Proxy | Клиент | Доступность upstream | Перезапуск сервиса |
| TLS error | Certificate expired | Proxy или upstream | Учетные данные | Срок действия сертификата | Обновление сертификата |
Неверные учетные данные и заблокированная учетная запись
Сопоставьте сообщения проверки пароля, lockout, expired password, unknown user и превышение лимита попыток с системным или IdP-журналом. Проверьте проблему на одной учетной записи без массового сброса настроек.
Отказ в доступе после успешной аутентификации
Разграничьте authentication и authorization. Проверьте группы, роли, claims, ACL, allow/deny-правила proxy и политики приложения. Признаки: 403 и сообщения о недостаточных правах.
Сбой сервиса или промежуточного уровня
Сопоставьте timeout, connection refused, upstream unavailable, gateway error, TLS handshake failure и ошибки зависимости с состоянием сервиса, DNS, сети, сертификатов и лимитов ресурсов.
Практический сценарий: от сообщения об ошибке к подтвержденной причине
Рассмотрим сквозной сценарий: пользователь получает отказ при SSO, proxy возвращает ответ, приложение фиксирует callback, а IdP сообщает причину.
Какие гипотезы проверять в первую очередь
Начните с доступности endpoint и точного времени, затем проверьте HTTP-код, наличие записи в proxy и приложении, параметры callback, TLS и только после этого углубляйтесь в бизнес-правила и редкие ошибки.
Как подтвердить исправление повторной попыткой
Проверьте новую попытку с тестовой учетной записью, наличие успешных записей на каждом уровне, создание сессии или выдачу токена, корректный доступ к защищенному ресурсу и отсутствие повторных ошибок в смежных журналах.
Итоговый чек-лист диагностики и безопасной эскалации
Используйте чек-лист для повторного применения и определите, какие данные передавать разработчику или провайдеру без нарушения безопасности.
Когда локальная диагностика завершена
Эскалируйте после проверки локального времени, сети, TLS, proxy, приложения и корректности конфигурации, если IdP или upstream возвращает подтвержденную ошибку либо остается недоступным.
Шаблон записи результата расследования
Сохраните воспроизводимость и сократите время повторного разбора похожих инцидентов. Заполните поля:
- Дата и часовой пояс
- Затронутый сервис
- Сценарий входа
- Пользователь или тестовая учетная запись
- Request ID
- Коды на каждом уровне
- Найденная первичная причина
- Исправление
- Результат контрольной попытки
- Необходимые профилактические действия
При обращении к разработчику или провайдеру приложите обезличенные строки логов, версии компонентов, временной диапазон, request ID, код ответа и схему взаимодействия. Исключите пароли, токены, cookie, client secret и персональные данные.
Для углубленного анализа логов Nginx и Apache используйте готовые команды grep и awk. При ошибках 401 и 403 в стеке Nginx + Docker + Kubernetes поможет пошаговый алгоритм диагностики. Для настройки мониторинга ключевых метрик Nginx обратитесь к шпаргалке по метрикам.