SAML по-прежнему один из главных стандартов корпоративной идентичности — но его легко реализовать неправильно
Хотя OIDC всё чаще используется в современных приложениях, SAML 2.0 по-прежнему является критически важным стандартом в корпоративных и государственных интеграциях идентичности. Многие организации запускают свои существующие каталоги за AD FS, Entra ID, Okta, Ping, Auth0 или шлюзом федерации через SAML. На государственной стороне национальные федерации идентичности и связанные с ними SaaS-сервисы тоже чаще всего построены на SAML 2.0.
Поэтому правильный подход для нового или модернизируемого приложения — не создавать отдельную базу пользователей. Приложение должно подключаться к identity provider, которому организация уже доверяет. Для этого слой доступа должен вести себя как SAML 2.0 service provider: перенаправлять пользователя к правильному IdP, проверять входящий SAML response, безопасно извлекать идентичность и преобразовывать её в сессию, которую приложение может использовать.
Однако SAML-интеграция — это не просто работа «возьми XML, прочитай пользователя, открой сессию». При неправильной реализации она порождает серьёзные уязвимости безопасности. Подпись в SAML response должна правильно проверяться, нужно контролировать, какое именно поле действительно подписано, и предотвращать атаки вроде снятия подписи или добавления поддельного assertion. Срок действия, ограничение audience, информация об issuer, формат NameID и сопоставления атрибутов должны не просто читаться; они должны строго применяться.
Операционная сторона столь же важна. Обновление metadata IdP, ротация сертификатов и ключей подписи, маршрутизация к разным IdP по тенанту, разные правила сопоставления для разных приложений и потоки Single Logout — это не мелкие детали, добавляемые позже. Это базовые части того, что заставляет SAML-федерацию работать безопасно и устойчиво.
Одна из самых распространённых ошибок — встраивать отдельную SAML-библиотеку в каждое приложение. Этот подход распределяет ответственность за идентичность по каждому backend. Одно изменение IdP требует отдельного обновления в множестве приложений. MFA, условный доступ, доверие устройства, поведение при выходе и записи аудита пытаются решать заново для каждого приложения. Результат — не централизованная идентичность, а распределённый хаос идентичности.
Правильное место — край доступа. SAML должен завершаться в одной точке; управляться на том же слое, что и аутентификация, MFA, условный доступ, доверие устройства и Backend SSO. Тогда приложения не несут сложность протокола федерации; они получают только проверенную, чистую и доверенную идентичность.
Правильно управлять SAML — это не просто подключиться к IdP. Это проверять доверие к идентичности организации в одной точке, проводить аудит и безопасно передавать его приложениям.
Наш подход
Один шлюз AAM правильно завершает SAML на краю; остальная часть движка доступа надстраивается над этим.
Соответствующий стандартам SAML 2.0 service provider
Подписанный AuthnRequest на выходе, полная проверка assertion на входе — подпись, audience, окно действия, AudienceRestriction, формат NameID. Поддерживаются оба binding'а: HTTP-Redirect и HTTP-POST. Обработка подписи следует существующим правилам соответствия SAML 2.0 для отражения известных SAML-атак.
Маршрутизация IdP по приложению и тенанту
Один шлюз AAM может одновременно маршрутизировать разные приложения к разным IdP и разные тенанты одного приложения к разным IdP. Выбор IdP делается для каждого запроса из контекста приложения — никакого отдельного шлюза на каждый IdP, никакого ручного селектора страницы входа для пользователя.
Сопоставление NameID и атрибутов — с идентичностью сессии AAM
Правила сопоставления на каждый IdP преобразуют NameID и заявления атрибутов SAML-assertion в канонические поля, используемые остальной частью AAM — имя пользователя, email, группы, отображаемое имя, пользовательские атрибуты. То же сопоставление питает gating MFA, выражения условного доступа, журналы аудита и инъекции Backend SSO.
Согласовано с MFA, условным доступом, доверием устройства и Backend SSO
SAML-аутентификация не работает сама по себе — она компонуется с edge MFA (если IdP не применил step-up), выражениями условного доступа, непрерывной оценкой доверия и инъекцией Backend SSO в backend. SAML-assertion становится входом в сессию AAM; не всей сессией.
Возможности
Соответствующий стандартам SAML 2.0 SP плюс операционные функции, делающие федерацию безопасной и управляемой в масштабе.
SP-initiated SSO с подписанным AuthnRequest
Пользователь приходит в приложение, AAM перенаправляет его к настроенному IdP с подписанным SAML AuthnRequest, пользователь входит в IdP, и IdP возвращает подписанный assertion на эндпоинт Assertion Consumer Service AAM. Поддерживаются оба binding'а: HTTP-Redirect для исходящего запроса и HTTP-POST для входящего assertion.
IdP-initiated SSO с учётом RelayState
Для развёртываний, где отправной точкой пользователя является IdP — портал-стартовая площадка в IdP, каталог приложений, государственный портал идентичности — принимается IdP-initiated SSO. RelayState несёт целевой пункт назначения приложения; так пользователь оказывается на правильной странице после получения assertion.
Полная проверка assertion — подпись, audience, действительность, ограничение
Подпись assertion проверяется по настроенному сертификату подписи IdP; audience совпадает с настроенным идентификатором SP AAM; NotBefore и NotOnOrAfter определяют окно действия; применяется AudienceRestriction. Известные SAML-атаки (signature wrapping, signature stripping, дрейф NotBefore) явно отражаются, а не тихо терпятся.
Опциональное шифрование assertion с обработкой приватного ключа
Когда IdP шифрует assertion (xmlenc), AAM расшифровывает assertion настроенным приватным ключом SP до проверки. Шифрованные assertion'ы распространены для государственной федерации идентичности и для IdP, не желающих, чтобы содержимое assertion было читаемым на слое binding. Ключи шифрования хранятся зашифрованными в хранилище конфигурации и никогда не логируются.
Выбор формата NameID и сопоставление атрибутов на каждый IdP
Каждый IdP может быть настроен с предпочтительным форматом NameID (persistent, transient, email-address, unspecified) и сопоставлением имён атрибутов SAML с полями сессии AAM. Разные IdP могут представлять идентичность по-разному — национальный идентификатор, email, уникальный непрозрачный идентификатор — и всё равно создавать один и тот же канонический формат сессии AAM.
Привязка IdP по тенанту для мультитенантных развёртываний
Один шлюз AAM, держащий впереди множество тенантов, может маршрутизировать каждый тенант к собственному IdP. Выбор делается в момент запроса из контекста приложения или тенанта — никакого отдельного шлюза на каждый IdP, никакого селектора на каждого пользователя. Один и тот же шлюз может одновременно нести государственную федерацию идентичности для одного тенанта и частный корпоративный IdP для другого.
Single Logout (SLO), согласованный с очисткой сессии AAM
Когда IdP инициирует выход, AAM принимает SAML LogoutRequest, завершает сессию AAM и сигнализирует backend'ам, получающим инъекцию Backend SSO. Когда приложение инициирует выход, AAM отправляет подписанный LogoutRequest в сторону IdP и ждёт LogoutResponse, прежде чем объявить сессию завершённой. Front-channel SLO поддерживается.
Операционная глубина
Механика, которая держит SAML-федерацию безопасной, актуальной и наблюдаемой.
Обмен metadata IdP — загрузка, получение по URL или ручная конфигурация
Metadata IdP может быть загружена путём загрузки предоставленного IdP metadata XML, настройкой metadata URL, который AAM получает и кэширует, или ручным вводом эндпоинтов и сертификатов. Ручная конфигурация — реалистичный вариант для IdP, не публикующих metadata, соответствующую стандартам; там, где работают, два других метода предпочтительнее.
Публикация metadata SP для онбординга IdP
AAM публикует собственный документ metadata SP по стабильному URL; так оператор IdP может импортировать его в хранилище доверия IdP, вместо ручной передачи эндпоинтов и сертификатов. Metadata отражает живую конфигурацию SP — текущий ACS URL, текущий сертификат подписи, текущий эндпоинт SLO.
Ротация ключей подписи и сертификатов без простоя
Ключи подписи и сертификаты SP имеют ограниченный срок жизни. AAM поддерживает ротацию ключей с перекрытием — в течение окна rollover и старый, и новый ключ проверяются против кэшированной metadata IdP. Операторы планируют ротацию заранее; runtime принимает оба в течение периода перекрытия, и ротация вступает в силу чисто.
Допуск на расхождение часов с ограниченным окном дрейфа
Assertion'ы несут временные метки NotBefore и NotOnOrAfter. Реальные часы дрейфуют; AAM применяет настраиваемое окно допуска; так небольшой дрейф не отклоняет действительные assertion'ы, а большой дрейф (индикатор неверной конфигурации или повторного воспроизведения) всё равно отклоняется. Допуск задаётся на каждый IdP; хорошо синхронизированный IdP получает узкое окно, проблемный IdP — задокументированное послабление.
Аудит и корреляция с жизненным циклом сессии AAM
Каждое SAML-событие — исходящий AuthnRequest, входящий assertion, результат проверки подписи, SLO LogoutRequest, LogoutResponse — записывается с correlation ID, привязанным к сессии AAM, стоящим за ней backend(ам) и идентичности пользователя. Вопрос «кто, через какой IdP и когда вошёл в систему» отвечается одним запросом.
Какие команды используют
Государственная федерация идентичности
Приложения, которым нужно принимать IdP национальной федерации идентичности — типично для государственных развёртываний, регулируемых отраслей и SaaS-сервисов, контрактуемых для государственных заказчиков. AAM завершает SAML-федерацию на краю и представляет стоящему за ним приложению чистую, проверенную идентичность.
Корпоративные IdP (AD FS, Entra ID, Okta, Ping, Auth0)
Существующие корпоративные IdP, уже авторизующие рабочую силу. AAM подключается как SAML SP, не требуя от команды IdP что-либо менять. Новые приложения присоединяются к федерации, добавляя запись в AAM, а не новую SAML-библиотеку в каждую кодовую базу.
Мультитенантные развёртывания с IdP на каждый тенант
SaaS-приложения, где каждый клиент приносит свой собственный IdP. Один шлюз AAM держит все тенанты впереди; трафик каждого тенанта маршрутизируется к IdP этого тенанта. Добавить тенант — это не развёртывание, а добавление записи IdP в хранилище конфигурации.
Edge MFA и условный доступ поверх IdP, не применяющего MFA и условный доступ
Некоторые IdP аутентифицируют, но не применяют step-up MFA или условный доступ — особенно устаревшие шлюзы федерации. AAM принимает аутентификацию IdP, затем надстраивает над ней собственную MFA, выражения условного доступа и непрерывную оценку доверия перед предоставлением доступа к приложению.
Часто задаваемые вопросы
С какими IdP AAM федерируется?
Как AAM защищается от известных SAML-атак?
Может ли один шлюз AAM маршрутизировать разные тенанты или приложения к разным IdP?
Поддерживает ли AAM Single Logout (SLO)?
Что происходит с идентичностью после того, как AAM получает assertion?
SAML, сделанный правильно, на краю
Подключим AAM к вашему IdP — корпоративному или государственной федерации идентичности — и надстроим остальную часть движка доступа над assertion с MFA, условным доступом, доверием устройства и Backend SSO.