IBCOURSES / СПРАВОЧНИК ИБ

Keycloak / SAML: отказ при ответе внешнего IdP

К ответу ↓

Для Keycloak как брокера внешнего SAML IdP различайте ошибки разбора ответа, проверки назначения (Destination), подписи и условий утверждения (assertion). Общее сообщение об ошибке не определяет единственную причину.

Например
Материалов с пояснениями: 94 · Записей реестров: 11 678

Уточнить поиск

События и журналы

Найдено: 84
Инструкция по проверке

Keycloak / SAML: отказ при ответе внешнего IdP

Для Keycloak как брокера внешнего SAML IdP различайте ошибки разбора ответа, проверки назначения (Destination), подписи и условий утверждения (assertion). Общее сообщение об ошибке не определяет единственную причину.

1. Установите направление и область

Сначала нарисуйте конкретную связь словами: внешний IdP отправляет ответ в Keycloak, действующий как SP/broker, либо Keycloak выдаёт ответ приложению-SP. Этот материал разбирает первую связь по исходникам 26.8.1. Укажите realm, alias провайдера, клиента при наличии, binding и точный узел наблюдения. Другой SAML-клиент или направление нельзя объявлять проверенным этим примером. Зафиксируйте установленный релиз; тег исходников и изменяемая документация latest не являются доказательством версии работающего сервера. Согласуйте UTC-интервал и доступные копии данных.

2. Найдите тип события и точную ветвь

В рассматриваемом SAMLEndpoint сервер отдельно проверяет форму документа, destination, подпись и условия assertion. Несколько отказов возвращают invalid_saml_response; при неподходящем destination эта ветка добавляет details.reason=invalid_destination. Нельзя заключать «истёк сертификат» или «неверные часы» только по generic error. Сохраняйте соседнее server message и причину, если они доступны. EventBuilder преобразует тип в *_ERROR; для этой ветви получается IDENTITY_PROVIDER_RESPONSE_ERROR. Возможное отсутствие установленного clientId/userId не заполняется данными другой попытки.

3. Проверьте сохранение до вывода об отсутствии

В EventType 26.8.1 у IDENTITY_PROVIDER_RESPONSE_ERROR saveByDefault=false. Поэтому включённый event store с настройками по умолчанию не гарантирует наличие этого типа: нужны сведения о выбранных типах именно в исследуемый период. Listener/server log и сохранённый event store обрабатываются раздельно. Уточните экспорт, страницы и период хранения. Эта инструкция читает уже полученные копии; включение событий сейчас не восстановит прошлые отказы. Пустую API-выдачу отделяйте от запрета доступа и ошибки разбора формата.

4. Разберите пример без лишнего вывода

В синтетическом событии error=invalid_saml_response уточнён reason=invalid_destination. Это подтверждает зарегистрированное расхождение назначения в выбранной ветви, но ничего не сообщает о результате всех следующих проверок. Отдельный авторский лист оставляет подпись, audience, временные условия и replay неизвестными. Первое jq-выражение сохраняет общий контекст отказа, второе отбирает только имеющуюся причину destination. Оба читают JSON-массив EventRepresentation. Текстовый server log и HTTP POST с SAMLResponse не являются таким массивом и требуют собственного безопасного разбора у владельца данных. Приведённые jq-фильтры сами не ограничивают время: используйте массив, заранее выгруженный за нужное UTC-окно, либо добавьте явное условие по time, учитывая миллисекунды Unix-времени. Не смешивайте записи разных периодов только из-за одинаковых realm и клиента.

5. Сверьте независимые ограничения SAML

Сравните фактическое назначение с ожидаемым endpoint и доверенными metadata; Destination и Recipient не заменяют Audience. По результатам штатного валидатора отдельно проверьте подписи и используемые ключи, audience, correlation InResponseTo и временные границы. Для Web Browser SSO bearer profile учитывает Recipient/NotOnOrAfter, привязку к запросу и replay-защиту POST. Само время Keycloak event не заменяет условий assertion или часов участников. Допуск времени фиксируется по действующей конфигурации, а не увеличивается как способ «починить» отказ. Сертификат подписи SAML не тождественен сертификату HTTPS.

6. Найдите причину изменения и последствия

Если расходятся endpoint или ключ, запросите историю согласованной настройки metadata, hostname/proxy и ротации у владельцев обеих сторон. Административный аудит Keycloak поможет проверить изменение ресурса, когда оно действительно сохранялось; текущий снимок не доказывает историческое значение. Успех аутентификации у внешнего IdP ещё не доказывает принятия ответа Keycloak и входа в приложение. Сопоставьте доступные идентификаторы, временные границы и результат приложения, сохраняя разрывы. Не воспроизводите сохранённую SAMLResponse и не отправляйте assertion в онлайн-декодер.

7. Если остался только общий отказ

Перечислите конкретно отсутствующие свидетельства: ветвь обработчика, reason, результат подписи, metadata на момент попытки, время участников или журнал приложения. Не выдавайте invalid_signature за самостоятельное доказательство атаки; не выдавайте отсутствие сообщения replay за доказательство отсутствия повторной доставки. Для дальнейшей проверки передайте владельцу обезличенный контекст, не cookies, assertion или приватные ключи. Не отключайте TLS, проверку подписей, destination/audience или защиту от повторного использования. Итог может достоверно фиксировать только этап отказа и необходимые следующие данные.

Поля и область применения

Исходное полеСмысл и ограничения
Роль / binding / наблюдающий узелКонтекст интеграции, заполняемый исследователем; не поля обязательной схемы события.
type / errorВ рассматриваемой входящей ветке возможен IDENTITY_PROVIDER_RESPONSE_ERROR; значение error обозначает зарегистрированную ветвь, не весь результат входа.
details.reasonДополнительная причина при наличии. В показанной ветви invalid_destination уточняет invalid_saml_response, но причина не обязательна для каждого отказа.
realmId / clientId / userId / sessionIdOptional-контекст EventRepresentation. На ранней проверке clientId/userId/sessionId могут отсутствовать.
time / id / ipAddressВремя события epoch milliseconds, идентификатор и наблюдавшийся адрес; адрес не устанавливает конечного пользователя.
Destination / Recipient / Audience / InResponseToРазные элементы SAML и их проверки. Сравниваются по разрешённому результату проверки и metadata, не извлекаются из generic error.
NotBefore / NotOnOrAfter / часыУсловия времени и часы участника; отсутствующие значения нельзя восстановить по времени server event.
Подпись / сертификат / результат проверкиСведения проверки сообщения и доверенных ключей; проверка подписи SAML и TLS-соединения — разные уровни.

Примеры записей

Данные в примерах условные. Состав полей зависит от версии и настроек источника.

Broker SAML: уточнённая причина destination

Фрагмент журнала. Сокращённый EventRepresentation по ветви SAMLEndpoint 26.8.1: проверка destination ставит reason и error, EventBuilder формирует тип *_ERROR. Значения вымышлены; clientId/userId/sessionId не добавлены. Это событие Keycloak, а не SAMLResponse.

{
  "id": "00000000-0000-4000-8000-000000000202",
  "time": 1793773202000,
  "type": "IDENTITY_PROVIDER_RESPONSE_ERROR",
  "realmId": "00000000-0000-4000-8000-000000000001",
  "ipAddress": "192.0.2.25",
  "error": "invalid_saml_response",
  "details": {
    "reason": "invalid_destination"
  }
}

Авторский лист сопоставления проверок

Поясняющая схема. Авторский формат фиксации известного и неизвестного, не экспорт Keycloak/SAML и не нативная схема. reason=invalid_destination не позволяет заполнить остальные результаты как success или failed. Никаких assertion, токенов и персональных атрибутов не включено.

{
  "example_kind": "author_worksheet",
  "keycloak_role": "SP/broker",
  "binding": "HTTP-POST",
  "document_parse": "not_established",
  "destination": "mismatch_reported_by_server",
  "signature": "not_established",
  "audience": "not_established",
  "subject_confirmation_time": "not_established",
  "request_correlation": "not_established",
  "replay": "not_established"
}

Команды и способы проверки

Укажите свой узел, путь к журналу и временной интервал. Требуемая среда указана рядом с командой.

jq 1.8 · локальный JSON-массив уже полученных EventRepresentation; без сети и повторной отправки SAMLResponse; замените учебный realmId согласно экспорту; clientId сохраняется в выводе при наличии

jq -c '.[] | select(.realmId == "00000000-0000-4000-8000-000000000001" and .type == "IDENTITY_PROVIDER_RESPONSE_ERROR" and (.error == "invalid_saml_response" or .error == "invalid_signature")) | {id,time,type,realmId,clientId,userId,sessionId,ipAddress,error,details}' keycloak-events.json

jq 1.8 · тот же массив, точное уточнение только имеющегося details.reason; замените учебный realmId согласно экспорту; clientId сохраняется в выводе при наличии

jq -c '.[] | select(.realmId == "00000000-0000-4000-8000-000000000001" and .type == "IDENTITY_PROVIDER_RESPONSE_ERROR" and .error == "invalid_saml_response" and .details.reason == "invalid_destination") | {id,time,realmId,error,reason:.details.reason}' keycloak-events.json

Первоисточники

Здесь разобрана входящая ветка внешнего IdP → Keycloak SP/broker. При роли Keycloak IdP для приложения источник и обработчик иные. invalid_saml_response не доказывает истечение, неверную подпись или replay.

Связанные материалы

Как пользоваться техническим справочником

Найдите порт, код ошибки, событие или источник журнала. Уточните протокол и систему, затем сверяйте значение, поля, примеры и первоисточники. Назначение порта не определяет фактическую службу, а одна запись не доказывает инцидент.

Материалы по разделам

События и журналы

Два ответа рядом

Сравнение источников

Сравнение показывает различия. События и поля разных систем не считаются эквивалентными.

Выберите службу

В списке — службы, доступные с текущими условиями. Число рядом — количество записей портов, а не программ на вашем узле.

Как искать в справочнике

Введите число, код, фрагмент сообщения или вопрос. Известный идентификатор поможет найти карточку; это не анализ самого инцидента.

  1. Введите номер, код, имя или фрагмент записи. Для портов можно использовать список: 80, 443, 8000–8010.
  2. Уточните поиск фильтрами. Все условия действуют одновременно. Числа в списках показывают, сколько материалов останется при выборе варианта.
  3. Службу выбирайте из каталога: поиск внутри списка помогает найти название, а кнопка «Выбрать» применяет его.
  4. Убирайте отдельные условия кнопкой × рядом с фильтром. «Сбросить фильтры» сохраняет текст поиска и текущий раздел.
  5. В карточке сверьте источник, версию и условия регистрации, затем откройте поля, примеры и первоисточник.

/ — перейти к поиску. Прямые ссылки открывают выбранную карточку в этом же справочнике.

Назначения портов и коды приведены по официальным реестрам. Версии, условия регистрации и ссылки на документацию указаны в карточках.

Избранное и недавние материалы хранятся в этом браузере. Запрос и фильтры сохраняются при возврате к выдаче и обновлении вкладки. Поиск работает локально.

Что есть в справочнике

От вопроса к свидетельствам: кто вошёл, что запустил, к каким данным обратился, что изменил и где искать следы.

Выберите область, чтобы посмотреть доступные источники и перейти к материалам.

Уточнить или исправить ответ

Скопируйте сообщение и отправьте его на mail@ibcourses.ru.