Статья "Revisiting OAuth 2.0 Compliance: A Two-Year Follow-Up Study"
Вторая статья от авторов OAuch, в которой они возвращаются к исследованным в рамках своей первой работы IdP.
Здесь авторы задаются целью выяснить, какие изменения произошли в соответствии IdP стандартам, и для этого сравнивают свои текущие измерения с прошлыми.
В прошлый раз авторы проверяли работу 100 публичных IdP, из них 92 были протестированы повторно в марте 2023 года. Восемь IdP авторы уже не смогли повторно проверить по ряду причин, поэтому для сравнения им пришлось слегка пересчитать результаты. Кстати, из этой статьи мы узнаем, что первичные измерения проводились еще в 2020 году (а не 2021, как можно было предположить из первой работы).
Авторы выделяют отдельно:
🔵 Распространение применения обязательного запроса согласия (consent) у пользователей для public clients (44.1% -> 58.8%)
🔵 Рост использования "access token rotation"(на 9.8 п.п., до 58.9%) - тут, увы, непонятно, что под этим понимается. Найти такого тест-кейса у них я не смог. В статье пишут размыто "frequently replacing tokens with newly minted tokens"
🔵 Повысилась поддержка PKCE на 7.3 п.п. и стала составлять уже 31.8%
Некоторое повышение failure rate для тестов по спецификации OIDC авторы объясняют тем, что один сайт начал поддерживать OIDC, однако имплементировал его с отличиями от спецификации.
В итоге авторы приходят не к самым интересным выводам:
🔵 Да, за два года IdP стали больше соответствовать стандартам и лучшим практикам
🔵 Но, несмотря на это, подчеркивается, что проблемы еще оставались
Статья, надо сказать, очень короткая: если отбросить вводную часть и заключение, "мяса" в этот раз остается совсем мало.
#security #oauth #paper
Вторая статья от авторов OAuch, в которой они возвращаются к исследованным в рамках своей первой работы IdP.
Здесь авторы задаются целью выяснить, какие изменения произошли в соответствии IdP стандартам, и для этого сравнивают свои текущие измерения с прошлыми.
В прошлый раз авторы проверяли работу 100 публичных IdP, из них 92 были протестированы повторно в марте 2023 года. Восемь IdP авторы уже не смогли повторно проверить по ряду причин, поэтому для сравнения им пришлось слегка пересчитать результаты. Кстати, из этой статьи мы узнаем, что первичные измерения проводились еще в 2020 году (а не 2021, как можно было предположить из первой работы).
Авторы выделяют отдельно:
Некоторое повышение failure rate для тестов по спецификации OIDC авторы объясняют тем, что один сайт начал поддерживать OIDC, однако имплементировал его с отличиями от спецификации.
В итоге авторы приходят не к самым интересным выводам:
Статья, надо сказать, очень короткая: если отбросить вводную часть и заключение, "мяса" в этот раз остается совсем мало.
#security #oauth #paper
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔1
Статья "Is Your OAuth Middleware Vulnerable? Evaluating Open-Source Identity Provider's Security"
Третья и последняя из опубликованных статей от авторов OAuch, которая вышла в конце 24 года. Публично она пока недоступна, однако по секретным каналам мне удалось раздобыть текст публикации.
Надо сказать, что название интригующее, поэтому ее хотел прочитать больше предыдущих. Однако само содержание, оказалось менее интересным, чем ожидал.
Итак, авторы решили вместо исследования публичных IdP, как ранее, проверить восемь Open-Source IAM-решений, которые выступают как OAuth authorization server:
🔵 Authentik
🔵 Boruta
🔵 Casdoor
🔵 Glewlwyd
🔵 Keykloak
🔵 Ory Hydra
🔵 Spring AS
🔵 Zitadel
Авторы отмечают, что не просто взяли "голые" решения, а сконфигурировали каждый IdP (в статье используют такую терминологию) в соответствии с актуальными best practices, насколько решения это позволяли. В частности:
- отключили ряд grant flow, таких как Implicit grant
- установили короткое время жизни токенов доступа
- включили и сделали обязательным использование PKCE
Тесты также проводили для двух случаев: для public и для confidential clients.
Найденные слабые места авторы категоризировали в следующем виде:
🔵 Insufficient redirect URI validation
1) Incorrect redirect URI matching (IRM)
2) Open redirectors (OR)
3) Insufficient redirect URI validation (IRV)
🔵 Multiple exchange of single-use tokens
4) Incomplete revocation after authorization code multi-exchange (IRC)
5) Incomplete revocation with refresh token rotation (IRR)
🔵 PKCE adoption challenges
6) PKCE not mandatory for public RPs or not supported for confidential RPs (PPC)
7) No RP authentication when PKCE is used (PCA)
8) PKCE downgrade attack (PD)
🔵 Refresh token mismanagement
9) No RP authentication check when a using refresh tokens (IRA)
10) Refresh token rotation not used for public RPs (RTR)
Логично отмечается, что все обнаруженные слабые места являются известными и контрмеры для них описаны в каких-либо OAuth-документах.
Пишут, что анализ показал, что большинство проблем были связаны с неоднократным использованием одноразовых токенов и PKCE: по 7 и 11 проблем в соответствующих категориях. В частности выделяют Incomplete revocation with refresh token rotation (IRR), PKCE not mandatory for public RPs or not supported for confidential RPs (PPC), и PKCE downgrade attack (PD). Отмечают, что более половины рассмотренных IdP были подвержены атаке PKCE downgrade. При этом интересно подчеркивают:
Сравнительный анализ между коммерческими и некоммерческими решениями при этом не выявил сильной разницы. Также в ходе раскрытия информации разработчикам были опубликованы две CVE: CVE-2024-23647 и CVE-2024-22258. А представители одного из продуктов вообще не ответили авторам, несмотря на попытки с ними связаться 😃
В заключение авторы указывают, что проблемы были обнаружены в семи из восьми рассмотренных имплементаций (отличились только ребята из Ory). Ну и говорят, что, казалось бы, существующие BCP предоставляют достаточные и описанные меры, но разработчики все еще не следуют этим рекомендациям. А также авторы говорят, что ждут OAuth 2.1 как новый комплексный baseline standard (я все еще несколько пессимистичен, правда, насчет таких взглядов).
#oauth #paper #security
Третья и последняя из опубликованных статей от авторов OAuch, которая вышла в конце 24 года. Публично она пока недоступна, однако по секретным каналам мне удалось раздобыть текст публикации.
Надо сказать, что название интригующее, поэтому ее хотел прочитать больше предыдущих. Однако само содержание, оказалось менее интересным, чем ожидал.
Итак, авторы решили вместо исследования публичных IdP, как ранее, проверить восемь Open-Source IAM-решений, которые выступают как OAuth authorization server:
Авторы отмечают, что не просто взяли "голые" решения, а сконфигурировали каждый IdP (в статье используют такую терминологию) в соответствии с актуальными best practices, насколько решения это позволяли. В частности:
- отключили ряд grant flow, таких как Implicit grant
- установили короткое время жизни токенов доступа
- включили и сделали обязательным использование PKCE
Тесты также проводили для двух случаев: для public и для confidential clients.
Найденные слабые места авторы категоризировали в следующем виде:
1) Incorrect redirect URI matching (IRM)
2) Open redirectors (OR)
3) Insufficient redirect URI validation (IRV)
4) Incomplete revocation after authorization code multi-exchange (IRC)
5) Incomplete revocation with refresh token rotation (IRR)
6) PKCE not mandatory for public RPs or not supported for confidential RPs (PPC)
7) No RP authentication when PKCE is used (PCA)
8) PKCE downgrade attack (PD)
9) No RP authentication check when a using refresh tokens (IRA)
10) Refresh token rotation not used for public RPs (RTR)
Логично отмечается, что все обнаруженные слабые места являются известными и контрмеры для них описаны в каких-либо OAuth-документах.
Пишут, что анализ показал, что большинство проблем были связаны с неоднократным использованием одноразовых токенов и PKCE: по 7 и 11 проблем в соответствующих категориях. В частности выделяют Incomplete revocation with refresh token rotation (IRR), PKCE not mandatory for public RPs or not supported for confidential RPs (PPC), и PKCE downgrade attack (PD). Отмечают, что более половины рассмотренных IdP были подвержены атаке PKCE downgrade. При этом интересно подчеркивают:
The BCP states that “Authorization servers MUST mitigate PKCE Downgrade Attacks by ensuring that a token request containing a code verifier parameter is accepted only if a code challenge parameter was present in the authorization request.” During the coordinated disclosure phase, we discovered that at least one party had misinterpreted this directive, understanding it to mean that if the authorization request lacked a code challenge parameter, the code verifier should be disregarded — the exact opposite of what the BCP intended.
Сравнительный анализ между коммерческими и некоммерческими решениями при этом не выявил сильной разницы. Также в ходе раскрытия информации разработчикам были опубликованы две CVE: CVE-2024-23647 и CVE-2024-22258. А представители одного из продуктов вообще не ответили авторам, несмотря на попытки с ними связаться 😃
В заключение авторы указывают, что проблемы были обнаружены в семи из восьми рассмотренных имплементаций (отличились только ребята из Ory). Ну и говорят, что, казалось бы, существующие BCP предоставляют достаточные и описанные меры, но разработчики все еще не следуют этим рекомендациям. А также авторы говорят, что ждут OAuth 2.1 как новый комплексный baseline standard (я все еще несколько пессимистичен, правда, насчет таких взглядов).
#oauth #paper #security
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1🤔1
401 Unauthorized: аутентификация и не только
Статья "Is Your OAuth Middleware Vulnerable? Evaluating Open-Source Identity Provider's Security" Третья и последняя из опубликованных статей от авторов OAuch, которая вышла в конце 24 года. Публично она пока недоступна, однако по секретным каналам мне удалось…
Кстати про уязвимую проверку redirect URI. Казалось бы, где деньги взять как сравнивать redirect URI, давно известно. Однако мы до сих пор то тут, то там видим, что вектор атаки с использованием подконтрольного атакующему redirect URI с радаров никуда не уходит и исследователи продолжают обнаруживать подходы к эксплуатации подобной атаки.
Недавно вышла статья, где автор как раз обнаружил уязвимость в логике проверки redirect URI у Google Cloud.
В Google Cloud для работы из CLI используется утилита gcloud. Для аутентификации и получения токенов, как это бывает в таких случаях, используется Authorization code grant, при этом для обработки callback-запроса с authorization response gcloud поднимает небольшой веб-сервер на локальном порту, на который и приходит редирект с authorization response.
В таком случае в качестве URL для redirect URI используется так называемый loopback-адрес, условно тот же локалхост (127.0.0.1). Ну и для него из-за динамического порта становится уже чуть сложнее выполнять проверку совпадения адреса с зарегистрированным.
Так вот автор обнаружил различия в механизме парсинга URL между внутренним парсером на стороне серверной части Google Cloud и парсером в браузерах, в частности в Chrome. Соответственно, автор смог скрафтить такой URL, который при проверке на стороне Google Cloud считался валидным, но для Chrome парсился уже иным образом, позволив автору получить редирект с authorization response уже на подконтрольный ему домен.
В общем, статья любопытная, посмотрите сами.
#oauth #security #article
Недавно вышла статья, где автор как раз обнаружил уязвимость в логике проверки redirect URI у Google Cloud.
В Google Cloud для работы из CLI используется утилита gcloud. Для аутентификации и получения токенов, как это бывает в таких случаях, используется Authorization code grant, при этом для обработки callback-запроса с authorization response gcloud поднимает небольшой веб-сервер на локальном порту, на который и приходит редирект с authorization response.
В таком случае в качестве URL для redirect URI используется так называемый loopback-адрес, условно тот же локалхост (127.0.0.1). Ну и для него из-за динамического порта становится уже чуть сложнее выполнять проверку совпадения адреса с зарегистрированным.
Так вот автор обнаружил различия в механизме парсинга URL между внутренним парсером на стороне серверной части Google Cloud и парсером в браузерах, в частности в Chrome. Соответственно, автор смог скрафтить такой URL, который при проверке на стороне Google Cloud считался валидным, но для Chrome парсился уже иным образом, позволив автору получить редирект с authorization response уже на подконтрольный ему домен.
В общем, статья любопытная, посмотрите сами.
#oauth #security #article
Medium
Google Cloud Account Takeover via URL Parsing Confusion
TL;DR
👍1🤔1
401 Unauthorized: аутентификация и не только
Опубликовал результаты исследования любопытного вектора атаки в виде статьи: https://habr.com/ru/articles/880544/ В ней узнаем, что такое «прерывание OAuth flow» и как его применять, затронем использование паттерна Backend‑for‑Frontend и способы реализации…
Тем временем моя статья "Атаки через новый OAuth flow, authorization code injection, и помогут ли HttpOnly, PKCE и BFF" стала победителем в ежегодном конкурсе статей на Хабре Технотекст 7 в номинации "Информационная безопасность" 🥳
Все итоги конкурса: https://habr.com/ru/companies/habr/articles/911650/
Все итоги конкурса: https://habr.com/ru/companies/habr/articles/911650/
🔥23👍6🤔1
Видео с KeyConf24
Keycloak является довольно популярным IAM-решением, поэтому вопросы работы с ним остаются актуальными. Не так давно участвовал в проводимом вместе с русскоязычным Keycloak-сообществом митапе, однако у Keycloak есть сообщества не только в России. Например, вы знали, что последние годы проводится выделенная конференция - KeyConf?
Так доступны видео докладов с прошлой конференции - KeyConf24:
https://www.youtube.com/playlist?list=PL7Azddo9KxKl57kWl_PHV3BNkKNULk4yV
Спикеров и тезисы докладов можно также посмотреть на сайте.
Доклады, думаю, будут все же более интересны работающим именно с Keycloak. Я сам посмотрел пока один общий - "New and Noteworthy in the OAuth World" от Dmitry Telegin.
В нем автор рассказывает про новые (на момент осени 24 года) инициативы в области стандартов:
🏷 OAuth 2.0 for First-Party Applications (draft)
🏷 Transaction Tokens (draft)
🏷 OAuth Identity and Authorization Chaining Across Domains (draft)
🏷 OAuth Client ID Metadata Document
Автор кратко и обзорно проходится по каждому из документов, а также рассказывать о возможностях будущей их поддержки с точки зрения Keycloak. На мой взгляд, как небольшой обзорный доклад может быть вполне интересно послушать, однако именно данное выступление мне лично не очень зашло.
Часть информации не была для меня новой, а часть - особо релевантной. При этом у записи довольно плохой звук и баг с отображением презентации - ближе к концу слайды просто перестали меняться, что тоже не добавило удовольствия =(
Однако это только один доклад из 11, так что, возможно, в прочих можно подчерпнуть что-то более ценное.
#video #iam_general
Keycloak является довольно популярным IAM-решением, поэтому вопросы работы с ним остаются актуальными. Не так давно участвовал в проводимом вместе с русскоязычным Keycloak-сообществом митапе, однако у Keycloak есть сообщества не только в России. Например, вы знали, что последние годы проводится выделенная конференция - KeyConf?
Так доступны видео докладов с прошлой конференции - KeyConf24:
https://www.youtube.com/playlist?list=PL7Azddo9KxKl57kWl_PHV3BNkKNULk4yV
Спикеров и тезисы докладов можно также посмотреть на сайте.
Доклады, думаю, будут все же более интересны работающим именно с Keycloak. Я сам посмотрел пока один общий - "New and Noteworthy in the OAuth World" от Dmitry Telegin.
В нем автор рассказывает про новые (на момент осени 24 года) инициативы в области стандартов:
Автор кратко и обзорно проходится по каждому из документов, а также рассказывать о возможностях будущей их поддержки с точки зрения Keycloak. На мой взгляд, как небольшой обзорный доклад может быть вполне интересно послушать, однако именно данное выступление мне лично не очень зашло.
Часть информации не была для меня новой, а часть - особо релевантной. При этом у записи довольно плохой звук и баг с отображением презентации - ближе к концу слайды просто перестали меняться, что тоже не добавило удовольствия =(
Однако это только один доклад из 11, так что, возможно, в прочих можно подчерпнуть что-то более ценное.
#video #iam_general
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔2
Запись моего доклада "Токены доступа и API gateway: как обеспечить безопасность запросов" с PHDays уже доступна. Посмотреть можно на:
📌 YouTube
📌 VK Видео
📌 Rutube
#api #iam_general #oauth #my_talk
#api #iam_general #oauth #my_talk
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Токены доступа и API gateway: как обеспечить безопасность запросов
Распределенные системы (микросервисы) набрали популярность и применяются все шире. Сервисов становится больше, привычные задачи для них решаются сложнее, усложнились и вопросы аутентификации и контроля доступа. В докладе рассмотрим подходы к работе с токенами…
👍17❤1🔥1🤔1
401 Unauthorized: аутентификация и не только
Запись моего доклада "Токены доступа и API gateway: как обеспечить безопасность запросов" с PHDays уже доступна. Посмотреть можно на: 📌 YouTube 📌 VK Видео 📌 Rutube #api #iam_general #oauth #my_talk
Кузнецов_Токены_доступа_и_API_Gateway.pdf
5 MB
Также прикладываю презентацию с выступления.
🔥12👍1🤔1
Книга "Cloud Native Data Security with OAuth: A Scalable Zero Trust Architecture"
Совсем недавно, вот буквально в марте, вышла новая книга на тему Identity & Access Management. Я уже писал, что интересных книг про IAM знаю совсем немного, поэтому, конечно, обрадовался такому событию.
Книга аффилирована с компанией Curity, ее авторы как раз там и работают. Поскольку ранее я уже отмечал свое положительное впечатление о качестве публикуемых компанией материалов, к книге изначально тоже подходил с определенными надеждами =)
Также у Gary Archer, одного из авторов, очень достойные ответы на Stack Overflow, не раз их встречал.
В посте традиционно для книги указал ссылку на Амазон, однако сразу хочу сказать, что в электронном виде книгу авторы сами раздают бесплатно (подсказка: данные в форме можно указать любые).
В книге четыре принципиальных части:
📚 Part I. Introducing Cloud Native OAuth
📚 Part II. Securing APIs with Tokens
📚Part III. Operating Cloud Native OAuth
📚Part IV. Securing API Clients
Собственно, их и намереваюсь рассмотреть, начав с первой.
Часть 1 | Часть 2 | Часть 3 | Часть 4
#book #iam_general #oauth
Совсем недавно, вот буквально в марте, вышла новая книга на тему Identity & Access Management. Я уже писал, что интересных книг про IAM знаю совсем немного, поэтому, конечно, обрадовался такому событию.
Книга аффилирована с компанией Curity, ее авторы как раз там и работают. Поскольку ранее я уже отмечал свое положительное впечатление о качестве публикуемых компанией материалов, к книге изначально тоже подходил с определенными надеждами =)
Также у Gary Archer, одного из авторов, очень достойные ответы на Stack Overflow, не раз их встречал.
В посте традиционно для книги указал ссылку на Амазон, однако сразу хочу сказать, что в электронном виде книгу авторы сами раздают бесплатно (подсказка: данные в форме можно указать любые).
В книге четыре принципиальных части:
📚 Part I. Introducing Cloud Native OAuth
📚 Part II. Securing APIs with Tokens
📚Part III. Operating Cloud Native OAuth
📚Part IV. Securing API Clients
Собственно, их и намереваюсь рассмотреть, начав с первой.
Часть 1 | Часть 2 | Часть 3 | Часть 4
#book #iam_general #oauth
👍9🤔1
Первая часть обзора книги "Cloud Native Data Security with OAuth: A Scalable Zero Trust Architecture"
В первой главе авторы пробуют ответить на вопрос: “А зачем нам вообще OAuth?”.
И уже с первой страницы главы авторы делают мне приятно и используют понятие “аутентификация запросов”, ставим лайк. А вот сама аргументация “за” использование OAuth здесь не сильно впечатлила:
🔵 Как будто больше маркетинга, чем рациональных доводов
🔵 В доводах указываются вещи, которые я бы не связал напрямую с OAuth
🔵 Не хватило секции “почему не что-то другое”
Ну то есть я, будучи сам сторонником использования OAuth, читая, вижу натянутость приведенных аргументов. Но я-то для себя об этом думал, и у меня есть другие! А вот если читать будет скептически настроенный критик… Илиюный неокрепший ум… Не знаю, в общем.
Тут же авторы приводят пояснение, что они понимают под Cloud Native:
Как говорится, а мужики-то не знают! Интересное определение, да? В общем, приведенное описание Cloud Native здесь не понял, как будто “в общих словах” все.
После вводной главы об основах OAuth и OIDC, в третьей, авторы переходят к понятию API security architecture. Тут мне откликнулась мысль о выделении ключевой триады функций и соответствующих им ключевых компонентов:
1️⃣ Identity & Access Management — Authorization Server
2️⃣ API Management — API Gateway
3️⃣ Entitlement Management — Policy Engine
Я очень солидарен с тем, что в современных системах, говоря о вопросах IAM, мало думать только про “аутентификацию и авторизацию”, как говорили раньше. В том числе в более расширенном смысле на это смотрит и концепция Identity Fabrics, про которую писал ранее (пост 1, пост 2).
Модные названия у такой расширенной области могут быть разными, как разными могут быть и ее границы. Вот такой краткий вариант с выделением трех базовых и понятных функций-компонентов тоже хорош, поскольку позволяет для их рассмотрения абстрагироваться от прочих деталей.
Дальше начинаются действительно интересные главы. В главе четыре предлагается взглянуть на некоторые функции и дизайн данных самого компонента authorization server. Во-первых, хочется сказать, что про это вообще мало пишут, а во-вторых, напомню, что у Curity как раз есть свое IAM-решение, поэтому можно надеяться, что ребята в целом должны знать, о чем говорят.
Авторы обращают внимание на существование различных категорий данных у authorization server. Приведенная конкретно здесь классификация показалась чуть странной, но в целом сама мысль верная. Подумав в эту сторону, мы можем увидеть, что данные различаются своими характеристиками, жизненными циклами, характерами нагрузки и пр. И, например, понять, что для разных данных нам (внезапно) могут понадобиться различные хранилища (СУБД). Для примера можно посмотреть, как аналогичный подход применяют RooX в своем UIDM, используя несколько СУБД, в том числе Tarantool для хранения токенов и сессий.
Говорится о подходах к определению пользовательских данных, которые уместно хранить на стороне authorization server. Рассматривают различные подходы к работе с атрибутами пользователя, в том числе и такой, где сам authorization server может сходить в другой сервис за данными пользователя, которые хранятся там. Я уже писал о кейсе, когда это может быть применимо, разбирая Rich Authorization Requests (RAR).
Также авторы упоминают и про довольно важные вещи вроде управления конфигурациями, мультитенантности и мультирегиональности.
Кстати, пользовательская миграция через SCIM показывается на примере любопытной задачки: вот есть такие-то собранные в кучу данные (AS IS), давайте приведем их к желаемому виду, разделив на identity-данные и бизнес-данные (TO BE). Мне подумалось, что такой кейс может быть здорово рассмотреть в процессе собеседования, чтобы посмотреть, как кандидат смотрит на подобные вопросы. Выглядит пока незаезженно 😈
#book #iam_general #oauth
В первой главе авторы пробуют ответить на вопрос: “А зачем нам вообще OAuth?”.
И уже с первой страницы главы авторы делают мне приятно и используют понятие “аутентификация запросов”, ставим лайк. А вот сама аргументация “за” использование OAuth здесь не сильно впечатлила:
Ну то есть я, будучи сам сторонником использования OAuth, читая, вижу натянутость приведенных аргументов. Но я-то для себя об этом думал, и у меня есть другие! А вот если читать будет скептически настроенный критик… Или
Тут же авторы приводят пояснение, что они понимают под Cloud Native:
Cloud native is a technology approach for operating services and infrastructure in a vendor-neutral way.
Как говорится, а мужики-то не знают! Интересное определение, да? В общем, приведенное описание Cloud Native здесь не понял, как будто “в общих словах” все.
После вводной главы об основах OAuth и OIDC, в третьей, авторы переходят к понятию API security architecture. Тут мне откликнулась мысль о выделении ключевой триады функций и соответствующих им ключевых компонентов:
Я очень солидарен с тем, что в современных системах, говоря о вопросах IAM, мало думать только про “аутентификацию и авторизацию”, как говорили раньше. В том числе в более расширенном смысле на это смотрит и концепция Identity Fabrics, про которую писал ранее (пост 1, пост 2).
Модные названия у такой расширенной области могут быть разными, как разными могут быть и ее границы. Вот такой краткий вариант с выделением трех базовых и понятных функций-компонентов тоже хорош, поскольку позволяет для их рассмотрения абстрагироваться от прочих деталей.
Дальше начинаются действительно интересные главы. В главе четыре предлагается взглянуть на некоторые функции и дизайн данных самого компонента authorization server. Во-первых, хочется сказать, что про это вообще мало пишут, а во-вторых, напомню, что у Curity как раз есть свое IAM-решение, поэтому можно надеяться, что ребята в целом должны знать, о чем говорят.
Авторы обращают внимание на существование различных категорий данных у authorization server. Приведенная конкретно здесь классификация показалась чуть странной, но в целом сама мысль верная. Подумав в эту сторону, мы можем увидеть, что данные различаются своими характеристиками, жизненными циклами, характерами нагрузки и пр. И, например, понять, что для разных данных нам (внезапно) могут понадобиться различные хранилища (СУБД). Для примера можно посмотреть, как аналогичный подход применяют RooX в своем UIDM, используя несколько СУБД, в том числе Tarantool для хранения токенов и сессий.
Говорится о подходах к определению пользовательских данных, которые уместно хранить на стороне authorization server. Рассматривают различные подходы к работе с атрибутами пользователя, в том числе и такой, где сам authorization server может сходить в другой сервис за данными пользователя, которые хранятся там. Я уже писал о кейсе, когда это может быть применимо, разбирая Rich Authorization Requests (RAR).
Также авторы упоминают и про довольно важные вещи вроде управления конфигурациями, мультитенантности и мультирегиональности.
Кстати, пользовательская миграция через SCIM показывается на примере любопытной задачки: вот есть такие-то собранные в кучу данные (AS IS), давайте приведем их к желаемому виду, разделив на identity-данные и бизнес-данные (TO BE). Мне подумалось, что такой кейс может быть здорово рассмотреть в процессе собеседования, чтобы посмотреть, как кандидат смотрит на подобные вопросы. Выглядит пока незаезженно 😈
#book #iam_general #oauth
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4🤔1
[1/2] Вторая часть обзора книги “Cloud Native Data Security with OAuth”
Продолжаю писать про данную книгу. Также напомню, что ее можно получить бесплатно.
Вторую часть книги авторы посвящают использованию токенов для обеспечения безопасности API и начинают с главы 5 - «Secure API Development».
Авторам нравится идея, когда конечные сервисы работают только с self-contained, JWT токеном доступа (мне такая идея тоже нравится, кстати), а сами clients могут использовать другие, различные временные учетные данные.
Говорят про валидацию JWT, затрагивают проверку подписи и ротацию ключей. Также отмечают, что лучше не забывать про тесты с невалидными JWT, чтобы иметь уверенность, что валидация работает, как надо.
Авторы отделяют проверку JWT от самой проверки авторизации, и далее как раз пишут и про нее. Например, упоминают о возможности использования scopes для «грубой» (coarse) проверки авторизации. При этом пишут, что scopes могут помочь задать некоторые «границы» применения токена, но не предоставляют, естественно, сами по себе полного решения задач проверки авторизации.
В контексте обработки истечения времени жизни токенов говорят про «короткое» время жизни токенов доступа, отмечая, что такие токены живут меньше, чем «users’ sessions». Это любопытно, потому что я как раз таким же образом выводил определение короткого времени жизни в докладе “Refresh token в веб-приложениях: быть или не быть?” (надеюсь, скоро доберусь опубликовать материал в виде статьи).
Переходят к вопросам тестирования. Предлагают подход разделения самого JWT и уже того, что называют «claims principal object» - как модельку уже. Из этого исходит идея, что можно тогда покрывать логику проверки авторизации юнит-тестами, используя в качестве фикстуры различные вариации этого «claims principal object».
Также рассказывают, как можно имитировать OAuth-обвязку для тестирования работы конечного сервиса: создать свою ключевую пару, замокать JWKS URI и настроить сервис на работу с ним. Тогда с приватным ключом из ключевой пары можно наподписывать себе любых токенов, что как раз удобно для различных тестов. Ну и с таким подходом, соответственно, поощряют разработчиков к более частому и легкому запуску тестов изолированно, локально – без необходимости поднимать какие-то еще сервисы для обвязки.
Дальше авторы переходят к вопросам проектирования и использования самих access tokens. Предлагают рассматривать access token как контракт, причем даже если он является непрозрачным (opaque), потому что, например, увеличив длину токена, можно тоже поломать чью-нибудь работу.
Пишут, что scopes не являются полным решением для [проверки] авторизации, однако они как раз формируют область действия для токена (я бы сюда еще добавил и audiences). Соответственно авторы тоже говорят о том, что используя скоупы client может получить access token для конкретных целей, ну и что их всегда стоит ограничивать.
Пишут авторы и про дизайн скоупов, при этом предлагают проектировать их исходя из понятий бизнесовых, нежели чем из технических. И дают совет: можно как источник вдохновения при дизайне скоупов посмотреть, как это сделано в спецификации OIDC.
Упоминая claims, напоминают, что помещая их в токен, authorization server как бы “ручается” за их содержимое, и конечные сервисы будут им доверять. Поэтому важно не помещать непроверенную информацию в содержимое клˈеймов.
Говорят про различные источники данных для клеймов, отмечают и факт, что часто меняющиеся значения не являются хорошими кандидатами на помещение в claims, потому что могут быстро стать неактуальными.
Также в этой главе авторы приводят определенный подход к дизайну scopes и claims, в том числе с учетом дальнейшей эксплуатации и масштабирования.
Затрагивают такую тему, как передача, распространение токенов (token sharing). Кратко разбирают такие подходы, как token exchange и embedding tokens in tokens. Упоминают и про использование токенов доступа при асинхронных операциях: что делать, когда проверка токена может произойти значительно позже отправки сообщения с ним.
(продолжение см. ниже)
#book #iam_general #oauth.
Продолжаю писать про данную книгу. Также напомню, что ее можно получить бесплатно.
Вторую часть книги авторы посвящают использованию токенов для обеспечения безопасности API и начинают с главы 5 - «Secure API Development».
Авторам нравится идея, когда конечные сервисы работают только с self-contained, JWT токеном доступа (мне такая идея тоже нравится, кстати), а сами clients могут использовать другие, различные временные учетные данные.
Говорят про валидацию JWT, затрагивают проверку подписи и ротацию ключей. Также отмечают, что лучше не забывать про тесты с невалидными JWT, чтобы иметь уверенность, что валидация работает, как надо.
Авторы отделяют проверку JWT от самой проверки авторизации, и далее как раз пишут и про нее. Например, упоминают о возможности использования scopes для «грубой» (coarse) проверки авторизации. При этом пишут, что scopes могут помочь задать некоторые «границы» применения токена, но не предоставляют, естественно, сами по себе полного решения задач проверки авторизации.
В контексте обработки истечения времени жизни токенов говорят про «короткое» время жизни токенов доступа, отмечая, что такие токены живут меньше, чем «users’ sessions». Это любопытно, потому что я как раз таким же образом выводил определение короткого времени жизни в докладе “Refresh token в веб-приложениях: быть или не быть?” (надеюсь, скоро доберусь опубликовать материал в виде статьи).
Переходят к вопросам тестирования. Предлагают подход разделения самого JWT и уже того, что называют «claims principal object» - как модельку уже. Из этого исходит идея, что можно тогда покрывать логику проверки авторизации юнит-тестами, используя в качестве фикстуры различные вариации этого «claims principal object».
Также рассказывают, как можно имитировать OAuth-обвязку для тестирования работы конечного сервиса: создать свою ключевую пару, замокать JWKS URI и настроить сервис на работу с ним. Тогда с приватным ключом из ключевой пары можно наподписывать себе любых токенов, что как раз удобно для различных тестов. Ну и с таким подходом, соответственно, поощряют разработчиков к более частому и легкому запуску тестов изолированно, локально – без необходимости поднимать какие-то еще сервисы для обвязки.
Дальше авторы переходят к вопросам проектирования и использования самих access tokens. Предлагают рассматривать access token как контракт, причем даже если он является непрозрачным (opaque), потому что, например, увеличив длину токена, можно тоже поломать чью-нибудь работу.
Пишут, что scopes не являются полным решением для [проверки] авторизации, однако они как раз формируют область действия для токена (я бы сюда еще добавил и audiences). Соответственно авторы тоже говорят о том, что используя скоупы client может получить access token для конкретных целей, ну и что их всегда стоит ограничивать.
Пишут авторы и про дизайн скоупов, при этом предлагают проектировать их исходя из понятий бизнесовых, нежели чем из технических. И дают совет: можно как источник вдохновения при дизайне скоупов посмотреть, как это сделано в спецификации OIDC.
Упоминая claims, напоминают, что помещая их в токен, authorization server как бы “ручается” за их содержимое, и конечные сервисы будут им доверять. Поэтому важно не помещать непроверенную информацию в содержимое клˈеймов.
Говорят про различные источники данных для клеймов, отмечают и факт, что часто меняющиеся значения не являются хорошими кандидатами на помещение в claims, потому что могут быстро стать неактуальными.
Также в этой главе авторы приводят определенный подход к дизайну scopes и claims, в том числе с учетом дальнейшей эксплуатации и масштабирования.
Затрагивают такую тему, как передача, распространение токенов (token sharing). Кратко разбирают такие подходы, как token exchange и embedding tokens in tokens. Упоминают и про использование токенов доступа при асинхронных операциях: что делать, когда проверка токена может произойти значительно позже отправки сообщения с ним.
(продолжение см. ниже)
#book #iam_general #oauth.
🔥4❤1👍1🤔1
[2/2] Вторая часть обзора книги “Cloud Native Data Security with OAuth”
Далее переходят к вопросам безопасного использования токенов доступа. Один из авторов, Michal Trojanowski, кстати, ранее так и писал в одной из своих статей:
Авторы пишут про различные форматы токенов доступа и про работу с ними: интроспекция, token exchange, the split token pattern.
Говоря про разные подходы, которыми можно обезопасить токены доступа, упоминают и подход ограничения их области действия до минимально необходимой - то, о чем нам говорит принцип least privilege.
Затем авторы решают рассказать про использование API Gateway и service mesh. Приводят краткую справку, как и что устроено в контексте Kubernetes, упоминая про Ingress и Gateway API.
Авторы пишут, что на их взгляд, ключевым фактором при выборе API Gateway является расширяемость, подводя к дальнейшему рассмотрению работы с токенами доступа, того что называют “token termination”.
Такая token termination в видении авторов состоит из двух задач:
🔵 валидация входящих временных учетных данных
🔵 трансляция их в JWT access token для конечных сервисов.
А дальше авторы как раз разбираю эти задачи для непрозрачных токенов доступа, cookies и sender-constrained токенов.
Говорится:
В конце главы читателя ждет небольшой пример использования API Gateway (авторы используют Kong) в Kubernetes. Также здесь авторы демонстрируют пример использования ранее упомянутой расширяемости: пишут плагин на Lua, чтобы реализовать схему с двумя видами токенов доступа (как они это называют - the Phantom Token Approach).
На протяжении данной главы авторы на это несколько раз намекали, а здесь уже прямо показывают, что реализовывать такую схему они предлагают через RFC 9701 JSON Web Token (JWT) Response for OAuth Token Introspection. Однако мне не очень нравится использование данного RFC для решения обозначенной задачи:
🔵 Здесь получаете не отдельный токен доступа в виде JWT, а обернутый в JWT тот же ответ от introspection endpoint
🔵 Таким образом два представления токена доступа полноценно не “развязать”: полученный JWT не ограничить отдельно по времени жизни или области действия
🔵 Сами авторы RFC пишут, что возвращаемый здесь JWT “is not an alternative representation of the introspected access token and is not intended to be used as an access token”
В девятой главе авторы переходят к рассмотрению вопросов контроля доступа. Рассматривают кратко такие модели контроля доступа, как RBAC, ReBAC, ABAC (а еще упоминают понятие RAdAC).
Понравилось высказывание о том, что недостаточно только лишь хорошо продумать правила доступа, важно не упускать из фокуса и процесс наделения субъектов полномочиями (например, назначение ролей пользователям). Таким образом подчеркивают, что нужно стараться не допускать “overprivileged accounts”.
Интересна и часть, где авторы описывают преимущества использования выделенной entitlement management system (EMS):
🔵 Flexibility (API работают только с предоставленным результатом, саму логику контроля доступа можно изменять, не ломая их)
🔵 Auditability (имеем события аудита как для применения политик, так и их для изменения)
🔵 Security agility (отделение ЖЦ политик доступа от ЖЦ конечных сервисов)
🔵 Quality assurance via policy as code (если политики прописываются отдельно, сами сервисы могут не тестировать их внутреннюю логику, а покрывать только возможные исходы)
В завершение кратко упоминают про P*P-концепцию и рассказывают про использования Open Policy Agent (OPA), заодно показывая небольшой пример использования языка Rego.
#book #iam_general #oauth.
Далее переходят к вопросам безопасного использования токенов доступа. Один из авторов, Michal Trojanowski, кстати, ранее так и писал в одной из своих статей:
While secure flows are essential, they should be complemented by a keen focus on access tokens.
Авторы пишут про различные форматы токенов доступа и про работу с ними: интроспекция, token exchange, the split token pattern.
Говоря про разные подходы, которыми можно обезопасить токены доступа, упоминают и подход ограничения их области действия до минимально необходимой - то, о чем нам говорит принцип least privilege.
Затем авторы решают рассказать про использование API Gateway и service mesh. Приводят краткую справку, как и что устроено в контексте Kubernetes, упоминая про Ingress и Gateway API.
Авторы пишут, что на их взгляд, ключевым фактором при выборе API Gateway является расширяемость, подводя к дальнейшему рассмотрению работы с токенами доступа, того что называют “token termination”.
Такая token termination в видении авторов состоит из двух задач:
А дальше авторы как раз разбираю эти задачи для непрозрачных токенов доступа, cookies и sender-constrained токенов.
Говорится:
We have seen that your overall API security is distributed between the API gateway APIs, and possibly additional components such as service meshes.
В конце главы читателя ждет небольшой пример использования API Gateway (авторы используют Kong) в Kubernetes. Также здесь авторы демонстрируют пример использования ранее упомянутой расширяемости: пишут плагин на Lua, чтобы реализовать схему с двумя видами токенов доступа (как они это называют - the Phantom Token Approach).
На протяжении данной главы авторы на это несколько раз намекали, а здесь уже прямо показывают, что реализовывать такую схему они предлагают через RFC 9701 JSON Web Token (JWT) Response for OAuth Token Introspection. Однако мне не очень нравится использование данного RFC для решения обозначенной задачи:
В девятой главе авторы переходят к рассмотрению вопросов контроля доступа. Рассматривают кратко такие модели контроля доступа, как RBAC, ReBAC, ABAC (а еще упоминают понятие RAdAC).
Понравилось высказывание о том, что недостаточно только лишь хорошо продумать правила доступа, важно не упускать из фокуса и процесс наделения субъектов полномочиями (например, назначение ролей пользователям). Таким образом подчеркивают, что нужно стараться не допускать “overprivileged accounts”.
Интересна и часть, где авторы описывают преимущества использования выделенной entitlement management system (EMS):
В завершение кратко упоминают про P*P-концепцию и рассказывают про использования Open Policy Agent (OPA), заодно показывая небольшой пример использования языка Rego.
#book #iam_general #oauth.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6🤔4❤3👍3
Третья часть обзора книги “Cloud Native Data Security with OAuth”
Говорим про часть III - “Operating Cloud Native OAuth”. Начинается она с главы 10 Workload Identities.
Здесь нам говорят: “OAuth alone does not solve all API security problems”. И предлагают рассмотреть, как могут быть удовлетворены требования вида обеспечения конфиденциальности трафика и ограничения возможности выполнять действия от лица сервисов даже при утечке их секретов (hardening, PoP).
Поэтому предлагают поговорить про workload identities. Авторы понимают под workload “a piece of software such as a microservice running in Kubernetes”.
Это можно сравнить с другими определениями. Так draft Workload Identity in a Multi System Environment (WIMSE) Architecture определяет workload как “a running instance of software executing for a specific purpose”. А концепция SPIFFE при этом дает более широкое определение.
Соответственно workload identity называют набор атрибутов, которые однозначно описывают workload. А под workload credential понимают некоторое криптографически проверяемое утверждение (assertion) для этой workload identity. При этом авторы отмечают, что здесь часто используют эти два понятия (wl identity и wl credential) взаимозаменяемо.
Говоря о том, а как workloads могут получить свою identity, отмечают, что облачные провайдеры могут назначать каждому workload свой идентификатор и позволять получать credentials, чтобы подтвердить свою identity в запросах. Также отмечают возможность использования service accounts в Kubernetes и SPIFFE.
В рамках данной главы авторы говорят о решении двух задач:
1️⃣ Надежное представление identity для workload в запросах с использованием некоего credential (JWT или X.509 сертификата)
2️⃣ Шифрование трафика для обеспечения его конфиденциальности
Авторы отмечают слабые стороны “статических” секретов, например, для аутентификации client у authorization server или для соединения с БД.
Из этого и исходят два основных кейса применения workload credentials в видении авторов:
1️⃣ Как альтернатива некоему секрету для аутентификации (например, вместо client secret в OAuth)
2️⃣ Для “апгрейда” bearer-токенов до sender-constrained
Так авторы описывают идею подхода, где сочетают OAuth token exchange и workload identities, чтобы как раз получать уже sender-constrained access-токены. И, кстати, рекомендуют использовать как раз RFC 7523 JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants вместо стандартных client secrets, если ваш authorization server такое поддерживает.
При этом авторы не рассматривают кейс использования workload identities для аутентификации запросов между самими workloads. Судя по предложенной концепции, для service-to-service (wl-2-wl) взаимодействия авторы безальтернативно предлагают использовать OAuth access tokens, что, на мой взгляд, спорно.
Workload credentials не являются заменой access-токенов (и вообще имеют другое значение), сами концепции устроены по-разному. Однако для задачи аутентификации запросов они как раз могут быть использованы.
В этой части есть еще 11 глава - Managing a Cloud Native Authorization Server, но в ней что-то прям нечего выделить.
Здесь авторы хотели рассказать про подход к деплою, удовлетворение НФТ, сопровождение для компонента authorization server. Темы сами по себе безусловно важные, но требующие достаточно много времени и деталей, чтобы их раскрыть. А здесь получилось как будто по верхам все и местами сумбурно.
Так у книги остается последняя часть - Securing API Clients, про которую напишу уже следующий пост.
#book #iam_general #oauth
Говорим про часть III - “Operating Cloud Native OAuth”. Начинается она с главы 10 Workload Identities.
Здесь нам говорят: “OAuth alone does not solve all API security problems”. И предлагают рассмотреть, как могут быть удовлетворены требования вида обеспечения конфиденциальности трафика и ограничения возможности выполнять действия от лица сервисов даже при утечке их секретов (hardening, PoP).
Поэтому предлагают поговорить про workload identities. Авторы понимают под workload “a piece of software such as a microservice running in Kubernetes”.
Это можно сравнить с другими определениями. Так draft Workload Identity in a Multi System Environment (WIMSE) Architecture определяет workload как “a running instance of software executing for a specific purpose”. А концепция SPIFFE при этом дает более широкое определение.
Соответственно workload identity называют набор атрибутов, которые однозначно описывают workload. А под workload credential понимают некоторое криптографически проверяемое утверждение (assertion) для этой workload identity. При этом авторы отмечают, что здесь часто используют эти два понятия (wl identity и wl credential) взаимозаменяемо.
Говоря о том, а как workloads могут получить свою identity, отмечают, что облачные провайдеры могут назначать каждому workload свой идентификатор и позволять получать credentials, чтобы подтвердить свою identity в запросах. Также отмечают возможность использования service accounts в Kubernetes и SPIFFE.
В рамках данной главы авторы говорят о решении двух задач:
1️⃣ Надежное представление identity для workload в запросах с использованием некоего credential (JWT или X.509 сертификата)
2️⃣ Шифрование трафика для обеспечения его конфиденциальности
Авторы отмечают слабые стороны “статических” секретов, например, для аутентификации client у authorization server или для соединения с БД.
Из этого и исходят два основных кейса применения workload credentials в видении авторов:
1️⃣ Как альтернатива некоему секрету для аутентификации (например, вместо client secret в OAuth)
2️⃣ Для “апгрейда” bearer-токенов до sender-constrained
Так авторы описывают идею подхода, где сочетают OAuth token exchange и workload identities, чтобы как раз получать уже sender-constrained access-токены. И, кстати, рекомендуют использовать как раз RFC 7523 JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants вместо стандартных client secrets, если ваш authorization server такое поддерживает.
При этом авторы не рассматривают кейс использования workload identities для аутентификации запросов между самими workloads. Судя по предложенной концепции, для service-to-service (wl-2-wl) взаимодействия авторы безальтернативно предлагают использовать OAuth access tokens, что, на мой взгляд, спорно.
Workload credentials не являются заменой access-токенов (и вообще имеют другое значение), сами концепции устроены по-разному. Однако для задачи аутентификации запросов они как раз могут быть использованы.
В этой части есть еще 11 глава - Managing a Cloud Native Authorization Server, но в ней что-то прям нечего выделить.
Здесь авторы хотели рассказать про подход к деплою, удовлетворение НФТ, сопровождение для компонента authorization server. Темы сами по себе безусловно важные, но требующие достаточно много времени и деталей, чтобы их раскрыть. А здесь получилось как будто по верхам все и местами сумбурно.
Так у книги остается последняя часть - Securing API Clients, про которую напишу уже следующий пост.
#book #iam_general #oauth
🤔4👍2
Как “превратить” OIDC в SAML
Как SAML, так и OIDC решают одну задачу: реализацию SSO, при котором пользователь выполняет аутентификацию только в одном месте (IdP/OP), а затем может использовать SSO-сессию для передачи приложениям (SP/RP), доверяющим IdP/OP, некоторого утверждения о своей identity.
При этом довольно часто мы думаем, что реализуемые ими протоколы принципиально отличаются, и иногда их особенности даже могут определять выбор того или иного подхода.
Так, например, одним из принципиальных отличий могут быть каналы взаимодействия в процессе SSO. SAML использует front-channel способ передачи информации об identity (чисто технически существует и back-channel binding, но используется он крайне редко и не везде поддерживается), в то время как OIDC в “классическом” Authorization code flow для confidential client использует back-channel взаимодействие.
В этом они действительно могут различаться: когда SAML опирается всецело на передачу assertion через браузер пользователя - который здесь является своеобразным связующим звеном - OIDC использует back-channel запрос от приложения, в ответ на который и возвращается id_token.
Но что если мы захотим сделать наш OIDC flow максимально похожим на распространенный SAML POST Binding? Давайте попробуем провести мысленный эксперимент.
В таком случае мы можем использовать OIDC Implicit flow вместе с form post response mode.
Важно подчеркнуть, что Implicit flow в контексте OIDC отличается от Implicit grant, определяемого в OAuth 2.0. В OIDC, используя именно
Итак, теперь попробуем сравнить SAML POST Binding с получающимся подходом:
1. В SAML у нас front-channel взаимодействие с автоотправкой assertion из формы. С использованием
2. В SAML мы можем подписать AuthnRequest. В OIDC мы можем использовать JAR для подписи authorization request
3. В SAML мы можем подписать возвращаемый assertion. В OIDC мы можем использовать JARM для подписи authorization response
4. В SAML мы можем использовать шифрование для assertion. В OIDC мы можем снова использовать для этого JARM или же обернуть ID token в JWE (про JWS и JWE писал тут)
5. В SAML мы можем использовать InResponseTo для связи SAMLRequest (AuthnRequest) с SAMLResponse (assertion). В OIDC мы можем использовать state/nonce
Итого: рассматриваемая схема фактически повторяет SAML POST Binding, причем с поддержкой всех дополнений к нему, вроде подписи и шифрования. Вот так с помощью нехитрых приспособлений, можно “превратить” OIDC в SAML. Но зачем?..
Ладно, на самом деле, в каждой шутке есть доля правды. Задумался в очередной раз о таком сходстве я в контексте размышлений о применимости OIDC Implicit flow в сочетании с form_post response mode для одного довольно специфичного случая.
Подход может быть полезен, когда у приложения client есть и серверная, и клиентская части, но при этом сетевой связности между бэкендом приложения и authorization server нет. Например, они находятся в разных сетевых зонах, но оба могут взаимодействовать с сегментом сети, в котором находится устройство пользователя.
И вот здесь, как сейчас видится, наличие у приложения серверной части дает выигрыш в использовании OIDC Implicit flow + form post response mode (даже без наворотов вида JAR/JARM) по сравнению с тем же Authorization code flow для public client.
Кстати, упоминания использования OIDC Implicit flow с form_post response mode можно встретить в документации у Auth0 и MS Entra ID, а также в 6 главе книги "Solving Identity Management in Modern Applications", обзор на которую публиковал ранее.
#iam_general #oauth
Как SAML, так и OIDC решают одну задачу: реализацию SSO, при котором пользователь выполняет аутентификацию только в одном месте (IdP/OP), а затем может использовать SSO-сессию для передачи приложениям (SP/RP), доверяющим IdP/OP, некоторого утверждения о своей identity.
При этом довольно часто мы думаем, что реализуемые ими протоколы принципиально отличаются, и иногда их особенности даже могут определять выбор того или иного подхода.
Так, например, одним из принципиальных отличий могут быть каналы взаимодействия в процессе SSO. SAML использует front-channel способ передачи информации об identity (чисто технически существует и back-channel binding, но используется он крайне редко и не везде поддерживается), в то время как OIDC в “классическом” Authorization code flow для confidential client использует back-channel взаимодействие.
В этом они действительно могут различаться: когда SAML опирается всецело на передачу assertion через браузер пользователя - который здесь является своеобразным связующим звеном - OIDC использует back-channel запрос от приложения, в ответ на который и возвращается id_token.
Но что если мы захотим сделать наш OIDC flow максимально похожим на распространенный SAML POST Binding? Давайте попробуем провести мысленный эксперимент.
В таком случае мы можем использовать OIDC Implicit flow вместе с form post response mode.
Важно подчеркнуть, что Implicit flow в контексте OIDC отличается от Implicit grant, определяемого в OAuth 2.0. В OIDC, используя именно
response_type=id_token, клиент получает в authorization response только ID token, что устраняет риски, связанные с передачей access token через браузер. При этом сам ID token по умолчанию возвращается в URI fragment, однако с использованием response_mode=form_post мы можем передать его в теле POST-запроса со страницы самого authorization server, тем самым устраняя и этот недостаток.Итак, теперь попробуем сравнить SAML POST Binding с получающимся подходом:
1. В SAML у нас front-channel взаимодействие с автоотправкой assertion из формы. С использованием
response_type=id_token&response_mode=form_post мы получаем идентичный механизм отправки ID token2. В SAML мы можем подписать AuthnRequest. В OIDC мы можем использовать JAR для подписи authorization request
3. В SAML мы можем подписать возвращаемый assertion. В OIDC мы можем использовать JARM для подписи authorization response
4. В SAML мы можем использовать шифрование для assertion. В OIDC мы можем снова использовать для этого JARM или же обернуть ID token в JWE (про JWS и JWE писал тут)
5. В SAML мы можем использовать InResponseTo для связи SAMLRequest (AuthnRequest) с SAMLResponse (assertion). В OIDC мы можем использовать state/nonce
Итого: рассматриваемая схема фактически повторяет SAML POST Binding, причем с поддержкой всех дополнений к нему, вроде подписи и шифрования. Вот так с помощью нехитрых приспособлений, можно “превратить” OIDC в SAML. Но зачем?..
Ладно, на самом деле, в каждой шутке есть доля правды. Задумался в очередной раз о таком сходстве я в контексте размышлений о применимости OIDC Implicit flow в сочетании с form_post response mode для одного довольно специфичного случая.
Подход может быть полезен, когда у приложения client есть и серверная, и клиентская части, но при этом сетевой связности между бэкендом приложения и authorization server нет. Например, они находятся в разных сетевых зонах, но оба могут взаимодействовать с сегментом сети, в котором находится устройство пользователя.
И вот здесь, как сейчас видится, наличие у приложения серверной части дает выигрыш в использовании OIDC Implicit flow + form post response mode (даже без наворотов вида JAR/JARM) по сравнению с тем же Authorization code flow для public client.
Кстати, упоминания использования OIDC Implicit flow с form_post response mode можно встретить в документации у Auth0 и MS Entra ID, а также в 6 главе книги "Solving Identity Management in Modern Applications", обзор на которую публиковал ранее.
#iam_general #oauth
👍8🔥3🤔1
Доклад "Строим единую платформу аутентификации на основе Keycloak" с Saint HighLoad++ 2025 от Виктора Попова
Пост, который хотел написать еще летом, но ведь лучше поздно, чем никогда...
В одном из предыдущих постов про книгу “Cloud Native Data Security with OAuth" я написал, что глава 11 Managing a Cloud Native Authorization Server в ней получилась не самой полезной. Так вот, для улучшения эффекта можно посмотреть доклад с летнего Highload от @ivanovivanivanovich1.
В докладе это явно не проговаривается, но речь будет идти об аутентификации именно внутренних пользователей.
Говорит автор о том, что понимает под платформой и какие ключевые особенности ей характерны:
1️⃣ One size fits most - платформа подходит под большинство ваших задач
2️⃣ Golden path - платформа дает "дорогу из золотого кирпича", по которой должно быть легко и удобно идти
3️⃣ Compliance - пользуясь платформой, вы удовлетворяете требованиям: техническим, информационной безопасности и др.
Рассматриваются следующие варианты реализации платформы аутентификации:
🔵 Пишем свое решение
🔵 SaaS (Auth0, Okta, etc)
🔵 "Экзотический" on-prem: Ory Hydra, ZITADEL, Casdoor
🔵 Keycloak
К какому выбору дальше приходит автор, думаю, пояснять не надо :)
Кстати, Виктор отмечает, что уже полтора года ищет, кто может на митапе рассказать про свой опыт использования Ory Hydra, отмечая малую популярность решения. Я тут частично соглашусь: хоть и есть несколько компаний в РФ, кто использует у себя стек от Ory, ни выступить, ни написать про это почему-то никто не хочет. А жаль.
Далее автор делится своими принципами в использовании Keycloak:
1️⃣ Keycloak использовать только для аутентификации
Кстати, ругает здесь подходы, когда возможность "входа" в то или иное приложение задается на стороне IdP, говоря, что это плохой UX. Интересно, что я сам долгое время был сторонником схожей школы мысли. Однако не так давно переубедил себя: отдельные приложения могут не поддерживать или не хотеть поддерживать гибкие политики аутентификации, и настраивать возможность и правила для входа в приложения можно и в одном месте - на стороне IdP. Так что здесь все не так однозначно.
2️⃣ Пользователи хранятся в AD-каталоге, а не в Keycloak. AD - источник правды
3️⃣ Не используют регистрацию пользователей в Keycloak
4️⃣ Не используют SAML
Здесь также говорится о том, что SAML - "небезопасный протокол", с чем не могу согласиться, это не так.
5️⃣ Конфигурация управляется 100% as a code
Рассказывает о том, как для себя подошли к решению задачи high availability (HA): размещают поды с KK в 3 AZ, при этом для базы используют растянутый кластер Patroni + PostgreSQL, где мастер находится только в одной из AZ. Но отмечает применимость такого подхода только при близкорасположенных ДЦ, чтобы не было больших задержек при репликации. Ну и логично, что воспринимается такая инсталляция как локальная, а не гео-распределенная. То есть фокус, полагаю, на отказоустойчивости внутри одного региона.
Деплоят в K8s, для реализации IaC используют Pulumi, чего докладчик и всем советует.
Еще понравилась мысль про стандартизацию использования: описание стандартных архитектур для потребителей, включая ограничения платформы, чтобы было понятно, как надежно и безопасно вас использовать.
#video #iam_general
Пост, который хотел написать еще летом, но ведь лучше поздно, чем никогда...
В одном из предыдущих постов про книгу “Cloud Native Data Security with OAuth" я написал, что глава 11 Managing a Cloud Native Authorization Server в ней получилась не самой полезной. Так вот, для улучшения эффекта можно посмотреть доклад с летнего Highload от @ivanovivanivanovich1.
В докладе это явно не проговаривается, но речь будет идти об аутентификации именно внутренних пользователей.
Говорит автор о том, что понимает под платформой и какие ключевые особенности ей характерны:
Рассматриваются следующие варианты реализации платформы аутентификации:
К какому выбору дальше приходит автор, думаю, пояснять не надо :)
Кстати, Виктор отмечает, что уже полтора года ищет, кто может на митапе рассказать про свой опыт использования Ory Hydra, отмечая малую популярность решения. Я тут частично соглашусь: хоть и есть несколько компаний в РФ, кто использует у себя стек от Ory, ни выступить, ни написать про это почему-то никто не хочет. А жаль.
Далее автор делится своими принципами в использовании Keycloak:
Кстати, ругает здесь подходы, когда возможность "входа" в то или иное приложение задается на стороне IdP, говоря, что это плохой UX. Интересно, что я сам долгое время был сторонником схожей школы мысли. Однако не так давно переубедил себя: отдельные приложения могут не поддерживать или не хотеть поддерживать гибкие политики аутентификации, и настраивать возможность и правила для входа в приложения можно и в одном месте - на стороне IdP. Так что здесь все не так однозначно.
Здесь также говорится о том, что SAML - "небезопасный протокол", с чем не могу согласиться, это не так.
Рассказывает о том, как для себя подошли к решению задачи high availability (HA): размещают поды с KK в 3 AZ, при этом для базы используют растянутый кластер Patroni + PostgreSQL, где мастер находится только в одной из AZ. Но отмечает применимость такого подхода только при близкорасположенных ДЦ, чтобы не было больших задержек при репликации. Ну и логично, что воспринимается такая инсталляция как локальная, а не гео-распределенная. То есть фокус, полагаю, на отказоустойчивости внутри одного региона.
Деплоят в K8s, для реализации IaC используют Pulumi, чего докладчик и всем советует.
Еще понравилась мысль про стандартизацию использования: описание стандартных архитектур для потребителей, включая ограничения платформы, чтобы было понятно, как надежно и безопасно вас использовать.
#video #iam_general
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Строим единую платформу аутентификации на основе Keycloak / Виктор Попов
Приглашаем на крупнейшую профессиональную конференцию для разработчиков высоконагруженных систем Saint HighLoad++ 2026
Подробнее: https://clck.ru/3QZHTb
Июнь, 2026
Санкт-Петербург, DESIGN DISTRICT DAA in SPb
---------
Профессиональная конференция разработчиков…
Подробнее: https://clck.ru/3QZHTb
Июнь, 2026
Санкт-Петербург, DESIGN DISTRICT DAA in SPb
---------
Профессиональная конференция разработчиков…
👍6❤1🤔1
Про термины authorization request/response и token request/response
Вы, вероятно, уже встречали упоминание подобных терминов в контексте OAuth/OIDC, по крайней мере автор данного канала активно их использует. Здесь как раз разберемся, зачем они нужны и что подразумевают.
Начнем с того, что RFC 6749 вводит понятия Authorization Endpoint и Token Endpoint.
Обычно выглядит как что-то вроде
Соответственно, запросы к этим эндпоинтам и называют Authorization Request и Token Request.
Authorization Request - это HTTP-запрос к Authorization Endpoint, являющийся первым шагом в основных grant flows. То есть это запрос, с помощью которого resource owner предоставляет авторизацию (разрешение) OAuth client для доступа к ресурсам от его лица.
Token Request - это HTTP-запрос к Token Endpoint, который служит для получения токенов, таких как access token, refresh token, ID token.
А ответы на данные запросы в соответствие так и называются: Authorization Response и Token Response.
И все было хорошо, поканарод огня не развязал войну ребята из OpenID Foundation не написали спецификацию OIDC. Где ввели ещё и понятие Authentication Request... Вот формальное определение оттуда:
Стало понятнее, да ведь? То есть предлагается выделить Authorization Request обладающий рядом параметров, в отдельный термин. Увы, это только внесло большую путаницу. Вы можете сами поискать по тексту спецификации эти два понятия и попробовать понять, почему в каждом месте использовано именно такое.
Поэтому я лично вообще стараюсь отдельно этот термин не использовать и ограничиваюсь везде понятием Authorization request.
С понятийной частью, вроде, разобрались, осталось выяснить, зачем вообще уделять такое внимание этим определениям. Может, это буквоедство и лишнее усложнение?
На самом деле, смысл в их использовании есть. Когда мы описываем какое-либо поведение, нам часто так или иначе нужно упоминать эти запросы и ответы на них. Внутри команд, работающих с аутентификацией, часто можно встретить подход, где оперируют названиями конкретных эндпоинтов. Правда это не всегда может быть удобно в устной речи.
Куда более интересно становится, когда мы хотим описать некоторую общую логику, не привязываясь при этом к использованию конкретного IAM-решения. И желательно, чтобы нас поняли люди, работающие хоть с Keycloak, хоть с ZITADEL, хоть с самописными реализациями. И у всех этих конкретных решений названия данных эндпоинтов могут отличаться.
Таким образом, используя подобные универсальные термины, мы можем говорить без привязки к конкретной технологии, но при этом оставляя возможность быть понятыми верно и однозначно.
Так что пост написан с целью пропаганды использования таких терминов, что, надеюсь, поможет всем нам лучше понимать друг друга и проще вести дискуссии на профессиональные темы⛔️
#oauth
Вы, вероятно, уже встречали упоминание подобных терминов в контексте OAuth/OIDC, по крайней мере автор данного канала активно их использует. Здесь как раз разберемся, зачем они нужны и что подразумевают.
Начнем с того, что RFC 6749 вводит понятия Authorization Endpoint и Token Endpoint.
Authorization endpoint - used by the client to obtain authorization from the resource owner via user-agent redirection.
Обычно выглядит как что-то вроде
.../auth или .../authorize.Token endpoint - used by the client to exchange an authorization grant for an access token, typically with client authentication.На самом деле, возвращаться может не только access token, но об этом далее. Представляет собой нечто вроде
.../token.Соответственно, запросы к этим эндпоинтам и называют Authorization Request и Token Request.
Authorization Request - это HTTP-запрос к Authorization Endpoint, являющийся первым шагом в основных grant flows. То есть это запрос, с помощью которого resource owner предоставляет авторизацию (разрешение) OAuth client для доступа к ресурсам от его лица.
Token Request - это HTTP-запрос к Token Endpoint, который служит для получения токенов, таких как access token, refresh token, ID token.
А ответы на данные запросы в соответствие так и называются: Authorization Response и Token Response.
И все было хорошо, пока
Authentication Request - OAuth 2.0 Authorization Request using extension parameters and scopes defined by OpenID Connect to request that the End-User be authenticated by the Authorization Server, which is an OpenID Connect Provider, to the Client, which is an OpenID Connect Relying Party.
Стало понятнее, да ведь? То есть предлагается выделить Authorization Request обладающий рядом параметров, в отдельный термин. Увы, это только внесло большую путаницу. Вы можете сами поискать по тексту спецификации эти два понятия и попробовать понять, почему в каждом месте использовано именно такое.
Поэтому я лично вообще стараюсь отдельно этот термин не использовать и ограничиваюсь везде понятием Authorization request.
С понятийной частью, вроде, разобрались, осталось выяснить, зачем вообще уделять такое внимание этим определениям. Может, это буквоедство и лишнее усложнение?
На самом деле, смысл в их использовании есть. Когда мы описываем какое-либо поведение, нам часто так или иначе нужно упоминать эти запросы и ответы на них. Внутри команд, работающих с аутентификацией, часто можно встретить подход, где оперируют названиями конкретных эндпоинтов. Правда это не всегда может быть удобно в устной речи.
Куда более интересно становится, когда мы хотим описать некоторую общую логику, не привязываясь при этом к использованию конкретного IAM-решения. И желательно, чтобы нас поняли люди, работающие хоть с Keycloak, хоть с ZITADEL, хоть с самописными реализациями. И у всех этих конкретных решений названия данных эндпоинтов могут отличаться.
Таким образом, используя подобные универсальные термины, мы можем говорить без привязки к конкретной технологии, но при этом оставляя возможность быть понятыми верно и однозначно.
Так что пост написан с целью пропаганды использования таких терминов, что, надеюсь, поможет всем нам лучше понимать друг друга и проще вести дискуссии на профессиональные темы
#oauth
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2🤔2❤1👏1😁1
Гора родила мышь, а я наконец родил статью на основе материала, про который рассказывал весной на PHDays 2025 и CodeFest 15.
https://habr.com/ru/articles/872918/
#api #oauth #my_publication
https://habr.com/ru/articles/872918/
#api #oauth #my_publication
Хабр
Токены доступа и API Gateway: как обеспечить безопасность запросов
Распределенные системы (aka микросервисы) набрали популярность и применяются все шире в современных реалиях. Сервисов становится больше, привычные задачи для них решаются сложнее, усложнились и...
👍19 10🔥3🤔1
SSO из мобильного приложения в web
Я однажды уже писал про подходы к реализации SSO в мобильных приложениях. Кстати, там была упомянута спецификация OpenID Connect Native SSO for Mobile Apps , и с тех пор Authlete опубликовали классное описание, как ее у себя реализовали, можно почитать.
В том посте я фокусировался на возможности аутентификации в самих мобильных приложения, в том числе с использованием сессии в браузере. Однако бывают и обратные примеры: когда пользователь уже аутентифицирован в мобильном приложении, и его нужно отправить на некоторый ресурс в браузере, причем "волшебным образом" обеспечив и там аутентифицированное состояние. И задача логично усложняется в ситуации, когда в этот момент у пользователя может не быть cookie с активной SSO-сессией. Касается это и случаев, когда в качестве экземпляров браузера используют WebView и его аналоги для iOS.
Вот про подходы к решению такой задачи сегодня и поговорим.
Недавно я заметил в документации Roox UIDM описание любопытной функциональности: бесшовный переход из мобильных приложений в Web, и стало интересно разобраться подробнее.
Подход основан на кастомном grant type
Однако подход пока смущает, мне не до конца понятно, почему он такой и как работает.
1. Почему выполняется обмен именно access token и именно на authorization code? Как можно превратить "делегированный доступ в рамках X для client A" в "авторизацию доступа в рамках Y для client B"?
2. Как быть с самим механизмом делегирования доступа? В рамках какой области действия (те же scopes) он делегируется при создании authorization code? Как быть, если пользователь не давал согласия (consent) веб-приложению? Здесь authorization server выдает authorization code как подтверждение того, что "пользователь разрешил веб-приложению доступ к своим данным в рамках Y", хотя пользователя вообще не спрашивали, ну и подозреваю, что совсем не обязательно scopes веб-приложения могут входить в scopes МП
3. Как и чем обеспечивается возможность конкретно для client A получить от authorization server authorization code конкретно для client B, что мешает ему получить authorization code для любого другого клиента? Здесь уверен, у ребят какая-то настройка предусмотрена, но вот не написали, какая(
Концепция для таких задач обычно одна: поменять A на B. Ключевой вопрос тогда стоит в том, чтобы понять, что есть A, что есть B и как правильно и безопасно должно работать "поменять". И хотя стандартизированный подход отсутствует, можно рассмотреть, какие еще имплементации существуют и как раз увидеть между ними схожести, вытекающие из общего принципа.
Так, например, в Curity некогда придумали подход Nonce Authenticator Pattern. Здесь предлагают получать специальное одноразовое значение - nonce - на основе ID token. Затем это значение передаётся веб-приложению, которое использует его как один из параметров authorization request.
Свой подход есть и у Auth0 (Okta), назвали его Native to Web SSO. Выглядит интереснее: используется обмен refresh token на специальный session transfer token. Он передаётся веб-приложению и служит для создания SSO-сессии в браузере, причем он является одноразовым, короткоживущим, и его можно привязать, например, к IP (в рекламе обещают device binding, но врут: только к IP и ASN). После создания SSO-сессии веб-приложение уже может выполнить стандартный authorization request и продолжить OAuth flow в обычном режиме.
У меня здесь пока нет готового ответа, как бы сделал я. Но считаю, что переносить нужно "identity для ограниченного SSO", поэтому создание SSO-сессии в браузере кажется логичным, и направление мысли скорее в сторону подхода Auth0/Okta.
#oauth #iam_general
Я однажды уже писал про подходы к реализации SSO в мобильных приложениях. Кстати, там была упомянута спецификация OpenID Connect Native SSO for Mobile Apps , и с тех пор Authlete опубликовали классное описание, как ее у себя реализовали, можно почитать.
В том посте я фокусировался на возможности аутентификации в самих мобильных приложения, в том числе с использованием сессии в браузере. Однако бывают и обратные примеры: когда пользователь уже аутентифицирован в мобильном приложении, и его нужно отправить на некоторый ресурс в браузере, причем "волшебным образом" обеспечив и там аутентифицированное состояние. И задача логично усложняется в ситуации, когда в этот момент у пользователя может не быть cookie с активной SSO-сессией. Касается это и случаев, когда в качестве экземпляров браузера используют WebView и его аналоги для iOS.
Вот про подходы к решению такой задачи сегодня и поговорим.
Недавно я заметил в документации Roox UIDM описание любопытной функциональности: бесшовный переход из мобильных приложений в Web, и стало интересно разобраться подробнее.
Подход основан на кастомном grant type
urn:roox:params:oauth:grant-type:m2m-authorization-code. В нем получаемый в мобильном приложении (МП) access token обменивается сразу на authorization code для веб-приложения. Далее МП передает полученный authorization code на адрес redirect URI веб-приложения, после чего веб-приложение штатным способом уже выполняет получение токенов.Однако подход пока смущает, мне не до конца понятно, почему он такой и как работает.
1. Почему выполняется обмен именно access token и именно на authorization code? Как можно превратить "делегированный доступ в рамках X для client A" в "авторизацию доступа в рамках Y для client B"?
2. Как быть с самим механизмом делегирования доступа? В рамках какой области действия (те же scopes) он делегируется при создании authorization code? Как быть, если пользователь не давал согласия (consent) веб-приложению? Здесь authorization server выдает authorization code как подтверждение того, что "пользователь разрешил веб-приложению доступ к своим данным в рамках Y", хотя пользователя вообще не спрашивали, ну и подозреваю, что совсем не обязательно scopes веб-приложения могут входить в scopes МП
3. Как и чем обеспечивается возможность конкретно для client A получить от authorization server authorization code конкретно для client B, что мешает ему получить authorization code для любого другого клиента? Здесь уверен, у ребят какая-то настройка предусмотрена, но вот не написали, какая(
Концепция для таких задач обычно одна: поменять A на B. Ключевой вопрос тогда стоит в том, чтобы понять, что есть A, что есть B и как правильно и безопасно должно работать "поменять". И хотя стандартизированный подход отсутствует, можно рассмотреть, какие еще имплементации существуют и как раз увидеть между ними схожести, вытекающие из общего принципа.
Так, например, в Curity некогда придумали подход Nonce Authenticator Pattern. Здесь предлагают получать специальное одноразовое значение - nonce - на основе ID token. Затем это значение передаётся веб-приложению, которое использует его как один из параметров authorization request.
Свой подход есть и у Auth0 (Okta), назвали его Native to Web SSO. Выглядит интереснее: используется обмен refresh token на специальный session transfer token. Он передаётся веб-приложению и служит для создания SSO-сессии в браузере, причем он является одноразовым, короткоживущим, и его можно привязать, например, к IP (в рекламе обещают device binding, но врут: только к IP и ASN). После создания SSO-сессии веб-приложение уже может выполнить стандартный authorization request и продолжить OAuth flow в обычном режиме.
У меня здесь пока нет готового ответа, как бы сделал я. Но считаю, что переносить нужно "identity для ограниченного SSO", поэтому создание SSO-сессии в браузере кажется логичным, и направление мысли скорее в сторону подхода Auth0/Okta.
#oauth #iam_general
👍8🤔3
Про form post response mode
В начале 2025 года я провел, а весной опубликовал результаты исследования в виде статьи “Атаки через новый OAuth flow, authorization code injection, и помогут ли HttpOnly, PKCE и BFF”, где также описывал и меры для защиты от рассматриваемых сценариев атак.
Самым интересным для меня оказался вывод, показывающий фундаментальную проблему: authorization code grant в OAuth закладывает разбиение процесса авторизации на отрезки, при этом позволяя выполнить отдельный участок процесса вообще вне сеанса пользователя, чем нивелируется наличие любых защитных механизмов браузера. Отсюда и идет сложность с выбором защитных мер.
В статье я пришел к выводу, что единственной полноценной мерой защиты является использование form post response mode, поскольку он не делает authorization response доступным с origin самого приложения, а передает его сразу серверной части в POST-запросе. Про него, а также другие response modes писал здесь.
Шло время, а я продолжал думать: почему form post response mode не является особо популярным. Не только он не получил широкого распространения, но и рекомендаций к его использованию вместо того же де-факто “стандартного ” query response mode мы нигде не находим. Стал размышлять в сторону сравнения query и form post response modes: а не стоит ли для большинства случаев по умолчанию считать form post более безопасным и подходящим и сразу использовать его, оставляя query для тех сценариев, где он действительно оправдан? Ну или хотя бы отмечать его применимость, чтобы он перестал быть “маргинальным”.
И вот в октябре решил посоветоваться по этому вопросу в переписке рабочей группы OAuth. Коли form post хорош, чего же нигде не пишем про такие возможности? Упустили или есть какие-то еще причины, которых не увидел? Собственно, в течение пары недель была дискуссия, в том числе затрагивающая и потенциальные недостатки.
При этом в начале ноября на очередном митинге рабочей группы товарищ Jonas Primbs поднял вопрос актуальности Browser Swapping attacks и мер защиты от них (в общем-то тех же самых). Как я отмечал в статье, это название такого же сценария атаки, просто зачем-то суженное именно до браузера атакующего (который вообще можно не использовать). Также завели PR в OAuth 2.1
После этого параллельно стартовала соседняя дискуссия - про Browser Swapping. По контексту они часто перекликались. Интересным там оказалось недавнее письмо от товарища из MS Entra, написанное уже под конец года, после основных обсуждений.
Он подсветил интересную свежую фишинговую атаку как раз на MS Entra: ConsentFix. Авторы отмечают, что данную атаку можно рассмотреть как продолжение известной ClickFix, про которую многие писали в этом году, однако здесь она происходит полностью в браузере.
В двух словах суть следующая: как и в ClickFix-атаке, пользователь видит фейковое окошко вида “подтвердите, что вы не робот”, которое может появиться и на легитимных сайтах ввиду наличия уязвимостей на них самих. Далее после нехитрых манипуляций выполняется переадресация браузера пользователя на URL authorization request в MS Entra, где в качестве значения client_id используется идентификатор Azure CLI. При наличии SSO-сессии пользователя успешно редиректит с authorization code в URL на localhost, однако на нем у него, естественно, ничего не поднято. И поэтому его просят “скопировать значение из адресной строки, чтобы подтвердить доступ”.
А суть его письма в том, что, кроме обсуждаемых сценариев для веб-приложений, есть еще и релевантные кейсы для нативных клиентов, в которых form post тоже мог бы повысить безопасность.
Еще одним итогом можно считать идею от Dick Hardt по добавлению в браузеры нового механизма для поддержки особых заголовков, которые можно использовать для передачи authorization response без раскрытия его клиентской части, которая родилась после дискуссий выше. Идея пока сырая, но все же.
Что имеем в остатке? Внимание к проблеме начало появляться, она начинает осознаваться, а это уже хорошо.
#oauth
В начале 2025 года я провел, а весной опубликовал результаты исследования в виде статьи “Атаки через новый OAuth flow, authorization code injection, и помогут ли HttpOnly, PKCE и BFF”, где также описывал и меры для защиты от рассматриваемых сценариев атак.
Самым интересным для меня оказался вывод, показывающий фундаментальную проблему: authorization code grant в OAuth закладывает разбиение процесса авторизации на отрезки, при этом позволяя выполнить отдельный участок процесса вообще вне сеанса пользователя, чем нивелируется наличие любых защитных механизмов браузера. Отсюда и идет сложность с выбором защитных мер.
В статье я пришел к выводу, что единственной полноценной мерой защиты является использование form post response mode, поскольку он не делает authorization response доступным с origin самого приложения, а передает его сразу серверной части в POST-запросе. Про него, а также другие response modes писал здесь.
Шло время, а я продолжал думать: почему form post response mode не является особо популярным. Не только он не получил широкого распространения, но и рекомендаций к его использованию вместо того же де-факто “стандартного ” query response mode мы нигде не находим. Стал размышлять в сторону сравнения query и form post response modes: а не стоит ли для большинства случаев по умолчанию считать form post более безопасным и подходящим и сразу использовать его, оставляя query для тех сценариев, где он действительно оправдан? Ну или хотя бы отмечать его применимость, чтобы он перестал быть “маргинальным”.
И вот в октябре решил посоветоваться по этому вопросу в переписке рабочей группы OAuth. Коли form post хорош, чего же нигде не пишем про такие возможности? Упустили или есть какие-то еще причины, которых не увидел? Собственно, в течение пары недель была дискуссия, в том числе затрагивающая и потенциальные недостатки.
При этом в начале ноября на очередном митинге рабочей группы товарищ Jonas Primbs поднял вопрос актуальности Browser Swapping attacks и мер защиты от них (в общем-то тех же самых). Как я отмечал в статье, это название такого же сценария атаки, просто зачем-то суженное именно до браузера атакующего (который вообще можно не использовать). Также завели PR в OAuth 2.1
После этого параллельно стартовала соседняя дискуссия - про Browser Swapping. По контексту они часто перекликались. Интересным там оказалось недавнее письмо от товарища из MS Entra, написанное уже под конец года, после основных обсуждений.
Он подсветил интересную свежую фишинговую атаку как раз на MS Entra: ConsentFix. Авторы отмечают, что данную атаку можно рассмотреть как продолжение известной ClickFix, про которую многие писали в этом году, однако здесь она происходит полностью в браузере.
В двух словах суть следующая: как и в ClickFix-атаке, пользователь видит фейковое окошко вида “подтвердите, что вы не робот”, которое может появиться и на легитимных сайтах ввиду наличия уязвимостей на них самих. Далее после нехитрых манипуляций выполняется переадресация браузера пользователя на URL authorization request в MS Entra, где в качестве значения client_id используется идентификатор Azure CLI. При наличии SSO-сессии пользователя успешно редиректит с authorization code в URL на localhost, однако на нем у него, естественно, ничего не поднято. И поэтому его просят “скопировать значение из адресной строки, чтобы подтвердить доступ”.
А суть его письма в том, что, кроме обсуждаемых сценариев для веб-приложений, есть еще и релевантные кейсы для нативных клиентов, в которых form post тоже мог бы повысить безопасность.
Еще одним итогом можно считать идею от Dick Hardt по добавлению в браузеры нового механизма для поддержки особых заголовков, которые можно использовать для передачи authorization response без раскрытия его клиентской части, которая родилась после дискуссий выше. Идея пока сырая, но все же.
Что имеем в остатке? Внимание к проблеме начало появляться, она начинает осознаваться, а это уже хорошо.
#oauth
🔥9🤔3