Microsoft тут недавно выпустили курс по основам кибербезопасности Security-101. Пробежался, сами материалы действительно базовые, выделить нечего.
Но вот что мне понравилось, так это акцент в самом начале на понятиях уязвимость, атака, угроза, риск.
Очень плюсую к тому, что понимать суть этих слов и уметь их отличать (и не путать угрозы с рисками) - это важно и полезно всем, независимо от роли.
Приводят определения угрозы (threat), уязвимости (vulnerability) и риска (risk), но почему-то забыли написать про атаку (attack), хоть на картинке и нарисовали.
Атака есть преднамеренная реализация какой-либо угрозы. То есть угроза была у нас теоретически, а с помощью атаки она воплощается в жизнь, например, с использованием каких-либо уязвимостей.
А почитать про остальные понятия можно по ссылке:
https://github.com/microsoft/Security-101/blob/main/1.3%20Understanding%20risk%20management.md
#security
Но вот что мне понравилось, так это акцент в самом начале на понятиях уязвимость, атака, угроза, риск.
Очень плюсую к тому, что понимать суть этих слов и уметь их отличать (и не путать угрозы с рисками) - это важно и полезно всем, независимо от роли.
Приводят определения угрозы (threat), уязвимости (vulnerability) и риска (risk), но почему-то забыли написать про атаку (attack), хоть на картинке и нарисовали.
Атака есть преднамеренная реализация какой-либо угрозы. То есть угроза была у нас теоретически, а с помощью атаки она воплощается в жизнь, например, с использованием каких-либо уязвимостей.
А почитать про остальные понятия можно по ссылке:
https://github.com/microsoft/Security-101/blob/main/1.3%20Understanding%20risk%20management.md
#security
🔥3🤔1
Для кого предназначен токен?
Это интересный вопрос, который хотелось бы хотелось видеть почаще в контексте обсуждения реализаций схем OAuth 2.0/OIDC. Понимание того, какой компонент системы должен работать с тем или иным токеном, позволяет реализовывать более предсказуемые схемы и не порождать ошибочные риски или же ошибочные решения в принципе, где мы начинаем использовать токены не для того, для чего они были предназначены, тем самым, уходя от механизмов, предоставляемых стандартами, и добавляя себе поле для ошибок и уязвимостей (если мы, конечно, явно это не осознаем)
Какие вообще роли у нас есть в OAuth 2.0/OIDC:
- Resource owner (user)
- Client (Relying Party, Service Provider, application)
- Authorization server (OpenID Provider)
- Resource server (service, API)
Какие виды токенов бывают:
🟢 Access token
Access token получает приложение (Client) для совершения действий от лица пользователя в рамках тех scopes, к которым пользователь этот доступ делегировал. Не пользователю токен выдаётся, нет. А именно приложению. Токен доступа в конечном счёте предназначается для Resource server, имея его, приложение может выполнить то или иное действие от лица пользователя (delegation). Это значит, что хоть само приложение и владеет токеном, но воспринимать оно его должно как некую абстрактную строку. В ванильных имплементациях приложение не должно опираться структуру токена или пытаться что-то из него извлечь. В этом и кроется одна из проблем использования JWT в качестве access token: мы не можем гарантировать, что приложение само не будет как-либо полагаться на его payload или не будет пытаться получить Identity пользователя из него (что не является хорошей практикой, для этого предназначен другой тип токена). А оно не должно, access token ему выдаётся, но предназначается для обращения к Resource Server. В том числе и в части OIDC-эндпоинта userinfo, где роль Resource server выполняет Authorization server.
🟢 ID token
Ключевое отличие в том, что идентификационный токен в формате JWT выдаётся самому приложению и предназначается для использования им же. Приложение может получить этот токен в ответ на Token request и использовать его, чтобы доверенным образом узнать, а кто пользователь такой. Поэтому задачу получения Identity на стороне приложения в общем случае следует решать не парсингом JWT-access token и не походом в Introspection endpoint (куда по-хорошему его вообще пускать-то не надо часто), а получением, проверкой и обработкой ID token, либо же походом в userinfo-эндпоинт с access token.
🟢 Refresh token
Данный тип токена выдаётся приложению, а его конечным получателем (recipient) является сам Authorization server. Refresh token позволяет приложению получить новый access token даже в тех случаях, когда пользователь уже не присутствует. Соответственно он предназначен только для этого и для других целей его использовать не стоит.
#oauth
Это интересный вопрос, который хотелось бы хотелось видеть почаще в контексте обсуждения реализаций схем OAuth 2.0/OIDC. Понимание того, какой компонент системы должен работать с тем или иным токеном, позволяет реализовывать более предсказуемые схемы и не порождать ошибочные риски или же ошибочные решения в принципе, где мы начинаем использовать токены не для того, для чего они были предназначены, тем самым, уходя от механизмов, предоставляемых стандартами, и добавляя себе поле для ошибок и уязвимостей (если мы, конечно, явно это не осознаем)
Какие вообще роли у нас есть в OAuth 2.0/OIDC:
- Resource owner (user)
- Client (Relying Party, Service Provider, application)
- Authorization server (OpenID Provider)
- Resource server (service, API)
Какие виды токенов бывают:
🟢 Access token
Access token получает приложение (Client) для совершения действий от лица пользователя в рамках тех scopes, к которым пользователь этот доступ делегировал. Не пользователю токен выдаётся, нет. А именно приложению. Токен доступа в конечном счёте предназначается для Resource server, имея его, приложение может выполнить то или иное действие от лица пользователя (delegation). Это значит, что хоть само приложение и владеет токеном, но воспринимать оно его должно как некую абстрактную строку. В ванильных имплементациях приложение не должно опираться структуру токена или пытаться что-то из него извлечь. В этом и кроется одна из проблем использования JWT в качестве access token: мы не можем гарантировать, что приложение само не будет как-либо полагаться на его payload или не будет пытаться получить Identity пользователя из него (что не является хорошей практикой, для этого предназначен другой тип токена). А оно не должно, access token ему выдаётся, но предназначается для обращения к Resource Server. В том числе и в части OIDC-эндпоинта userinfo, где роль Resource server выполняет Authorization server.
🟢 ID token
Ключевое отличие в том, что идентификационный токен в формате JWT выдаётся самому приложению и предназначается для использования им же. Приложение может получить этот токен в ответ на Token request и использовать его, чтобы доверенным образом узнать, а кто пользователь такой. Поэтому задачу получения Identity на стороне приложения в общем случае следует решать не парсингом JWT-access token и не походом в Introspection endpoint (куда по-хорошему его вообще пускать-то не надо часто), а получением, проверкой и обработкой ID token, либо же походом в userinfo-эндпоинт с access token.
🟢 Refresh token
Данный тип токена выдаётся приложению, а его конечным получателем (recipient) является сам Authorization server. Refresh token позволяет приложению получить новый access token даже в тех случаях, когда пользователь уже не присутствует. Соответственно он предназначен только для этого и для других целей его использовать не стоит.
#oauth
🔥5👏1
Парой постов ранее упоминал про компанию Curity. У них есть большая база статей, где они разбирают различные аспекты Identity & Access Management: https://curity.io/resources/articles/. Статьи сгруппированы по ключевым разделам. Лучше их базы, я, пожалуй, и не встречал даже, чтобы было так собрано в одном месте.
Я читал большую часть из этих материалов и не помню там откровенного буллщита. И даже часто, когда хочу дать ссылку на краткое теоретическое описание какого-то подхода, взять одну из статей из их базы знаний оказывается проще, чем выискивать адекватную в гугле.
Понятно, что не все статьи очень глубокие, но зато они дают понимание, что по этой теме можно еще изучить при необходимости.
Продуктом их я, честно, не пользовался, поэтому ни плохого, ни хорошего сказать не могу. Но вот тем, кто эту базу знаний написал, респект. Поэтому, кому интересно ознакомиться с разными нюансами, как один из источников рекомендую.
#iam_general #article
Я читал большую часть из этих материалов и не помню там откровенного буллщита. И даже часто, когда хочу дать ссылку на краткое теоретическое описание какого-то подхода, взять одну из статей из их базы знаний оказывается проще, чем выискивать адекватную в гугле.
Понятно, что не все статьи очень глубокие, но зато они дают понимание, что по этой теме можно еще изучить при необходимости.
Продуктом их я, честно, не пользовался, поэтому ни плохого, ни хорошего сказать не могу. Но вот тем, кто эту базу знаний написал, респект. Поэтому, кому интересно ознакомиться с разными нюансами, как один из источников рекомендую.
#iam_general #article
🔥3🤔1🐳1
401 Unauthorized: аутентификация и не только
Парой постов ранее упоминал про компанию Curity. У них есть большая база статей, где они разбирают различные аспекты Identity & Access Management: https://curity.io/resources/articles/. Статьи сгруппированы по ключевым разделам. Лучше их базы, я, пожалуй,…
А еще у них также есть демо-песочница: https://oauth.tools/
В ней можно поиграться с разными OAuth/OIDC flow, чтобы наглядно понять их суть снаружи, а в качестве эндпоинтов Authorization server можно оставить их демо-эндпоинты или же прописать свои, тогда песочница просто будет выполнять роль клиента.
К сожалению, в opensource ее нет, поэтому использовать можно только онлайн, либо в виде десктоп-приложения, но уже после покупки лицензии у них.
#iam_general
В ней можно поиграться с разными OAuth/OIDC flow, чтобы наглядно понять их суть снаружи, а в качестве эндпоинтов Authorization server можно оставить их демо-эндпоинты или же прописать свои, тогда песочница просто будет выполнять роль клиента.
К сожалению, в opensource ее нет, поэтому использовать можно только онлайн, либо в виде десктоп-приложения, но уже после покупки лицензии у них.
#iam_general
OAuth Tools by Curity
OAuth Tools
Tools for exploring and testing OAuth and OpenID Connect flows. With this free tool you can learn and explore the inner workings of OpenID Connect and OAuth.
👍2🤯1
401 Unauthorized: аутентификация и не только
Microsoft тут недавно выпустили курс по основам кибербезопасности Security-101. Пробежался, сами материалы действительно базовые, выделить нечего. Но вот что мне понравилось, так это акцент в самом начале на понятиях уязвимость, атака, угроза, риск. Очень…
😱1
Про OAuth 2.0 Rich Authorization Requests (RAR) и Lodging Intent pattern
Весь OAuth 2.0 - он про делегирование доступа, ограничивать который можно, используя понятие "scope". Но что если гранулярности, которую предоставляют scopes, недостаточно для того, чтобы запросить "fine-grained", более детально ограниченный доступ?
Не так давно узнал про достаточно молодой стандарт для решения подобных проблем, RFC 9396 - OAuth 2.0 Rich Authorization Requests, также известный как RAR.
Вообще для решения таких задач ранее был придуман паттерн Lodging Intent. Вкратце: сначала Client для проведения операции создает специальный ресурс (в RESTовой модели) - намерение (intent), получает ответ с идентификатором созданного ресурса, а затем уже передает его как ссылку (reference) в Authorization request. Затем Authorization server (AS) может получить данные того самого intent по его ID и запросить согласие (consent) у пользователя. После авторизации пользователем AS выпускает access token, связанный с данными intent.
RAR по сути представляет собой стандартизированную альтернативу, причем без создания отдельного ресурса и передачи идентификатора "by reference".
Стандарт предлагает использование дополнительного параметра "authorization_details" в Authorization request, который позволяет Client запросить подтверждение специфичного узкого доступа.
Это применимо для сценариев, когда доступ запрашивается не для заранее определенных "типовых" случаев, которые можно покрыть с помощью scopes (а-ля
Если же query-параметры сильно будут бухнуть из-за передачи объемного объекта, или вообще не хочется его светить на клиентской части, любезно предлагается дополнить решение еще одним стандартом - Pushed Authorization Requests (PAR). Тогда сначала создается "заготовка" Authorization request со всеми необходимыми параметрами, а в самом запросе передается только специальный URI как ее идентификатор.
То есть вся суть данного подхода в том, чтобы доступ, делегируемый стороне Client в виде access token, мог быть определен с требуемой степенью гранулярности. Таким образом поощряя создание не "универсальных" токенов для всего на свете, а ограниченных так узко, как того требуется. Чего подход с использованием scopes изначально не предполагал.
При проверке полученного access token - через introspect-запрос или непосредственно, если токен представлен в виде JWT, - стороне Resource server также должны быть доступны те самые authorization_details, для которых доступ был выдан, что позволит учитывать их для принятия авторизационных решений.
Применим такой подход в том же Open Banking и других сферах, где ценность доступа высока и его имеет смысл ограничивать как можно детальнее. Например, в медТех`е.
Можно посмотреть еще пару статей от одного из авторов данного RFC, Torsten Lodderstedt. В первой можно прочесть изначальные размышления, нашедшие свое оформление далее в виде стандарта:
- Transaction Authorization or why we need to re-think OAuth scopes
- Rich OAuth 2.0 Authorization Requests
А еще есть статья с похожими идеями, но с использованием Macaroons как решения:
Macaroon access tokens for OAuth: Part 2 – transactional auth
#oauth
Весь OAuth 2.0 - он про делегирование доступа, ограничивать который можно, используя понятие "scope". Но что если гранулярности, которую предоставляют scopes, недостаточно для того, чтобы запросить "fine-grained", более детально ограниченный доступ?
Не так давно узнал про достаточно молодой стандарт для решения подобных проблем, RFC 9396 - OAuth 2.0 Rich Authorization Requests, также известный как RAR.
Вообще для решения таких задач ранее был придуман паттерн Lodging Intent. Вкратце: сначала Client для проведения операции создает специальный ресурс (в RESTовой модели) - намерение (intent), получает ответ с идентификатором созданного ресурса, а затем уже передает его как ссылку (reference) в Authorization request. Затем Authorization server (AS) может получить данные того самого intent по его ID и запросить согласие (consent) у пользователя. После авторизации пользователем AS выпускает access token, связанный с данными intent.
RAR по сути представляет собой стандартизированную альтернативу, причем без создания отдельного ресурса и передачи идентификатора "by reference".
Стандарт предлагает использование дополнительного параметра "authorization_details" в Authorization request, который позволяет Client запросить подтверждение специфичного узкого доступа.
Это применимо для сценариев, когда доступ запрашивается не для заранее определенных "типовых" случаев, которые можно покрыть с помощью scopes (а-ля
accounts:read), а для конкретных действий, которые могут быть определены динамически. Например, запрос на предоставление доступа не к любым счетам пользователя, а к конкретному, или доступ к выполнению конкретного платежа.Если же query-параметры сильно будут бухнуть из-за передачи объемного объекта, или вообще не хочется его светить на клиентской части, любезно предлагается дополнить решение еще одним стандартом - Pushed Authorization Requests (PAR). Тогда сначала создается "заготовка" Authorization request со всеми необходимыми параметрами, а в самом запросе передается только специальный URI как ее идентификатор.
То есть вся суть данного подхода в том, чтобы доступ, делегируемый стороне Client в виде access token, мог быть определен с требуемой степенью гранулярности. Таким образом поощряя создание не "универсальных" токенов для всего на свете, а ограниченных так узко, как того требуется. Чего подход с использованием scopes изначально не предполагал.
При проверке полученного access token - через introspect-запрос или непосредственно, если токен представлен в виде JWT, - стороне Resource server также должны быть доступны те самые authorization_details, для которых доступ был выдан, что позволит учитывать их для принятия авторизационных решений.
Применим такой подход в том же Open Banking и других сферах, где ценность доступа высока и его имеет смысл ограничивать как можно детальнее. Например, в медТех`е.
Можно посмотреть еще пару статей от одного из авторов данного RFC, Torsten Lodderstedt. В первой можно прочесть изначальные размышления, нашедшие свое оформление далее в виде стандарта:
- Transaction Authorization or why we need to re-think OAuth scopes
- Rich OAuth 2.0 Authorization Requests
А еще есть статья с похожими идеями, но с использованием Macaroons как решения:
Macaroon access tokens for OAuth: Part 2 – transactional auth
#oauth
🔥1🤔1
401 Unauthorized: аутентификация и не только
Про OAuth 2.0 Rich Authorization Requests (RAR) и Lodging Intent pattern Весь OAuth 2.0 - он про делегирование доступа, ограничивать который можно, используя понятие "scope". Но что если гранулярности, которую предоставляют scopes, недостаточно для того,…
Есть еще интересный нюанс. В п. 7.1 RFC 9636 мы видим предполагаемую возможность пользователю в процессе согласия указать или уточнить какую-то информацию, изначально не входившую в authorization_details. Например, выбрать конкретный счет, к которому хотим предоставить доступ, из списка. Учитывая, что экран согласия обычно находится в ведении AS, появляется вопрос: откуда у AS возьмется информация о тех счетах, которые имеет пользователь? Неужто AS должен сам это знать?
Не найдя однозначного ответа, решил обсудить вопрос с авторами самого RFC.
🟡 Сам ответ, "как" AS получит какие-либо данные для отображения пользователю лежит за рамками данного RFC, и какого-либо референтного подхода тут, увы, не предполагается
🟡 Задумка меня пока смущает. Не вижу до конца, как "красиво" реализовать пусть тот же самый пример с выбором счета, к которому надо предоставить доступ. То есть придется либо запрашивать данные по ним от лица самого AS, либо, допустим, асинхронно обогащать данные по пользователям, хранящиеся на стороне AS, краткими данными по списку их счетов (пусть маскированными представлениями). Но вот перспектива примешивать в AS какие-то бизнес-данные пока что-то не радует
🟡 Зато мне любезно предоставили один из примеров, как это реализовано. Надеюсь, будет вполне этично поделиться здесь:
Еще говорят, на грядущем OAuth Security Workshop 2024 как раз расскажут подробнее про проект из описанного примера. Но, увы, мероприятие нацелено на оффлайн и проходит в Риме =(
Возможно, далее появятся и в онлайне какие-либо материалы с интересными примерами.
#oauth
Не найдя однозначного ответа, решил обсудить вопрос с авторами самого RFC.
In Authlete we’ve got three components working together — an IdP (the AS), an Authlete Server (the RS), and the console (the client).
When the client goes and talks to the AS, the client doesn’t know which set of services the user has access to, so it can’t ask for a detailed list of rights from the AS since it has no idea who the user is let alone what that user can access. The client at this point doesn’t even know where the RS’s are — since in our environment, each installation of the RS is managed separately for access rights.
So the client just asks for a basic scope, "authlete", that just tells the RS "anything on the authlete APIs that this user can do", which is appropriate for a client to be able to ask for.
The AS knows which paid and free accounts the user is attached to, and therefore which services on which Authlete Server installations the user has access to. So when the AS makes the token, it puts that information into the token’s metadata (we use introspection in our case). The client in our case doesn’t read the RAR data back itself, it learns of which RS’s that it can call through an API call back to the AS. The RAR object captures which services on which RS’s the client can do which actions to.
When the token gets used by the client to call the RS, the RS doesn’t know anything about the user or accounts that went into making the token, but it doesn’t have to. The RAR object on the token simply lists out which services the client can access and for what purposes, so it’s a really easy and simple check. And that same token can be targeted to multiple RS’s, like if the user’s got access to a Dev and Prod environment on different servers.
This lets us keep our user data in one place instead of spreading it out across multiple RS’s. And the RS’s don’t have to do any secondary checks against a backend system to map a user ID to a service ID.
Еще говорят, на грядущем OAuth Security Workshop 2024 как раз расскажут подробнее про проект из описанного примера. Но, увы, мероприятие нацелено на оффлайн и проходит в Риме =(
Возможно, далее появятся и в онлайне какие-либо материалы с интересными примерами.
#oauth
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Как не путать один JWT с другим
JWT бывают разные, и используются они для разных целей. Чтобы токен не мог быть использован не по его прямому назначению, важно уметь отличать JWT разных типов. Особенно это касается проверки токенов доступа - access tokens.
Самый простой пример можно встретить в том же OIDC. Допустим, используется как ID token (всегда JWT), так и access token тоже в виде JWT. Логично, что важно сделать так, чтобы ID token даже при весомом желании не мог быть принят и обработан в качестве access token.
Задача известная, и есть разные варианты ее решения.
1. Использовать значение клˈейма (claim) "aud".
Поскольку разные типы токенов предназначены для разных получателей, то можно воспользоваться одним из стандартных клеймов JWT. Если использовать его по назначению, то в нем должен быть идентификатор стороны-получателя. У разных типов токенов получатели разные, что позволяет понять, когда токен предназначен не для нас
2. Взаимоисключающие проверки клеймов, входящих в состав токена.
Вполне логично предположить, что разные типы JWT будут обладать различным набором клеймов и/или иметь различные их значения, поскольку служат разным целям. Тогда правила проверки каждого типа токенов могут быть взаимоисключающими, чтобы токен типа 1 не проходил проверку валидности при попытке его использования как токена типа 2 и vice versa.
Это может быть выражено в составе клеймов: например, в системе JWT типа access token должен всегда иметь клейм "scope". А другие виды токенов - не должны. Так условный Resource server, если ему попробовать скормить JWT другого типа, при проверке обнаружит, что обязательный клейм scope отсутствует, и токен проверку не пройдет.
Также это применимо не только к составу клеймов, но и к их значениям. Сюда же можно отнести подход, когда используются специальные клеймы, в которых явно указывают тип или назначение токена.
Например:
3. В продолжение п.2 есть еще смежный подход Explicit typing, тобишь явное указание типа.
Подход утилизирует для этого стандартный параметр "typ" заголовка (header) JWT. Тогда значение для access token может выглядеть, например, так:
В том же JWT Profile for OAuth 2.0 Access Tokens тоже упоминают про такой подход и как раз предлагают ввести тип "at+jwt"
4. Также можно использовать различные ключи для подписи токенов разных типов.
Однако тут есть нюанс.
Типовая проверка подписи выполняется так: сторона-получатель достает идентификатор ключа, использованного для подписи, из параметра заголовка "kid" и далее смотрит, а есть ли публичный ключ с таким key ID в ответе от нужного JWKS URI. Из этого следует, что если мы будем публиковать публичные ключи для проверки разных типов токенов JWT на одном JWKS-ресурсе, то при проверке все ключи будут успешно получены из этого JWKS, что сделает проверку подписи любого токена успешной.
Поэтому здесь я не знаю подхода умнее, чем использовать для таких случае разные JWSK URI, если необходимо повысить гарантии, что один токен не будет принят за другой. Вести белый список разрешенных kid может быть затруднительно, поскольку ключи ведь нужно иногда ротировать.
Полезно отметить, что лучше подумать о такой задаче еще на стадии проектирования структуры ваших токенов и при определении перечня рекомендуемых/обязательных проверок для Resource servers. Явно указание типа (любым способом) и взаимоисключающие проверки хорошо для этого подходят.
А если структура и подход с проверками были спроектированы так, что токены надежно не отличить, то останется использовать только разные ключи. Также, конечно, может использоваться и комбинация подходов: например, проверять значение клейма aud (и осмысленно заполнять его) имеет смысл вне зависимости от того, используются ли другие подходы.
#oauth #jwt
JWT бывают разные, и используются они для разных целей. Чтобы токен не мог быть использован не по его прямому назначению, важно уметь отличать JWT разных типов. Особенно это касается проверки токенов доступа - access tokens.
Самый простой пример можно встретить в том же OIDC. Допустим, используется как ID token (всегда JWT), так и access token тоже в виде JWT. Логично, что важно сделать так, чтобы ID token даже при весомом желании не мог быть принят и обработан в качестве access token.
Задача известная, и есть разные варианты ее решения.
1. Использовать значение клˈейма (claim) "aud".
Поскольку разные типы токенов предназначены для разных получателей, то можно воспользоваться одним из стандартных клеймов JWT. Если использовать его по назначению, то в нем должен быть идентификатор стороны-получателя. У разных типов токенов получатели разные, что позволяет понять, когда токен предназначен не для нас
2. Взаимоисключающие проверки клеймов, входящих в состав токена.
Вполне логично предположить, что разные типы JWT будут обладать различным набором клеймов и/или иметь различные их значения, поскольку служат разным целям. Тогда правила проверки каждого типа токенов могут быть взаимоисключающими, чтобы токен типа 1 не проходил проверку валидности при попытке его использования как токена типа 2 и vice versa.
Это может быть выражено в составе клеймов: например, в системе JWT типа access token должен всегда иметь клейм "scope". А другие виды токенов - не должны. Так условный Resource server, если ему попробовать скормить JWT другого типа, при проверке обнаружит, что обязательный клейм scope отсутствует, и токен проверку не пройдет.
Также это применимо не только к составу клеймов, но и к их значениям. Сюда же можно отнести подход, когда используются специальные клеймы, в которых явно указывают тип или назначение токена.
Например:
"purpose" : "access_token" // для access token
"purpose" : "id_token" // для ID token
3. В продолжение п.2 есть еще смежный подход Explicit typing, тобишь явное указание типа.
Подход утилизирует для этого стандартный параметр "typ" заголовка (header) JWT. Тогда значение для access token может выглядеть, например, так:
"typ" : "at+JWT", а для ID token уже как-то вроде "typ" : "id+jwt".В том же JWT Profile for OAuth 2.0 Access Tokens тоже упоминают про такой подход и как раз предлагают ввести тип "at+jwt"
4. Также можно использовать различные ключи для подписи токенов разных типов.
Однако тут есть нюанс.
Типовая проверка подписи выполняется так: сторона-получатель достает идентификатор ключа, использованного для подписи, из параметра заголовка "kid" и далее смотрит, а есть ли публичный ключ с таким key ID в ответе от нужного JWKS URI. Из этого следует, что если мы будем публиковать публичные ключи для проверки разных типов токенов JWT на одном JWKS-ресурсе, то при проверке все ключи будут успешно получены из этого JWKS, что сделает проверку подписи любого токена успешной.
Поэтому здесь я не знаю подхода умнее, чем использовать для таких случае разные JWSK URI, если необходимо повысить гарантии, что один токен не будет принят за другой. Вести белый список разрешенных kid может быть затруднительно, поскольку ключи ведь нужно иногда ротировать.
Полезно отметить, что лучше подумать о такой задаче еще на стадии проектирования структуры ваших токенов и при определении перечня рекомендуемых/обязательных проверок для Resource servers. Явно указание типа (любым способом) и взаимоисключающие проверки хорошо для этого подходят.
А если структура и подход с проверками были спроектированы так, что токены надежно не отличить, то останется использовать только разные ключи. Также, конечно, может использоваться и комбинация подходов: например, проверять значение клейма aud (и осмысленно заполнять его) имеет смысл вне зависимости от того, используются ли другие подходы.
#oauth #jwt
Код 401 Unauthorized не про авторизацию
Код и название данной ошибки отражены в названии канала.
Unauthorized вообще можно перевести как "неавторизованый". Однако интересный парадокс в том, что в современном вебе 401 ошибка говорит не об ошибке авторизации, а об ошибке аутентификации.
Такую ошибку чаще всего вернем, если аутентификация запроса была неуспешна. Например, если в запросе отсутствовали необходимые учётные данные (некий токен, sessionID) или проверка их валидности была неуспешной.
При этом для ошибок уже авторизации встречаем как раз код 403 Forbidden. Данный код обычно возвращаем, если с переданными учётными данными к запрашиваемому ресурсу/операции нет доступа. То есть аутентификацию запроса выполнили, но вот доступа уже нет.
Было интересно узнать, если какая-то история под данным "исторически сложилось". Дошел до первого RFC для HTTP/1.0 - RFC 1945 - однако ничего интересного, увы, не нашел. Вероятно, идея была связана с тем же заголовком Authorization, используемым для целей аутентификации.
Конечно, семантика использования "правильных" и "неправильных" кодов ответа при проектировании API - это большой многолетний холивар.
Сюда же можно вспомнить подход, когда порой мы не хотим даже показывать факт существования какого-то ресурса без необходимых прав доступа, и в ответ на запрос будем и вовсе возвращать 404.
#api
Код и название данной ошибки отражены в названии канала.
Unauthorized вообще можно перевести как "неавторизованый". Однако интересный парадокс в том, что в современном вебе 401 ошибка говорит не об ошибке авторизации, а об ошибке аутентификации.
Такую ошибку чаще всего вернем, если аутентификация запроса была неуспешна. Например, если в запросе отсутствовали необходимые учётные данные (некий токен, sessionID) или проверка их валидности была неуспешной.
При этом для ошибок уже авторизации встречаем как раз код 403 Forbidden. Данный код обычно возвращаем, если с переданными учётными данными к запрашиваемому ресурсу/операции нет доступа. То есть аутентификацию запроса выполнили, но вот доступа уже нет.
Было интересно узнать, если какая-то история под данным "исторически сложилось". Дошел до первого RFC для HTTP/1.0 - RFC 1945 - однако ничего интересного, увы, не нашел. Вероятно, идея была связана с тем же заголовком Authorization, используемым для целей аутентификации.
Конечно, семантика использования "правильных" и "неправильных" кодов ответа при проектировании API - это большой многолетний холивар.
Сюда же можно вспомнить подход, когда порой мы не хотим даже показывать факт существования какого-то ресурса без необходимых прав доступа, и в ответ на запрос будем и вовсе возвращать 404.
#api
👍4🔥3😁3
SSO в мобильных приложениях
Я не большой мастак в вопросах разработки мобильных приложений, с вебом доводилось работать куда больше. Однако стало интересно, а какие подходы сейчас используются, например, когда у компании несколько приложений и нужно организовать SSO для них.
1. Стандартный SSO с использованием инстанса браузера
Самый простой и известный способ заключается в использовании какого-либо инстанса браузера: открыть полноценный браузер или "встроенное" в приложение окно, пользователь первично аутентифицируется, в браузере сохраняется SSO-cookie. При последующих входах в приложения повторный ввод учётных данных не потребуется, пока SSO-cookie жива и валидна.
Однако здесь есть подвох в том, что у разных инстансов браузера могут быть разные cookie jars, которые не шерятся между ними.
Пример
2. Подход с диплинками
Здесь суть в наличии некоего "мастер-приложения". После входа пользователя в него, прочие приложения могут направлять Authorization request не через браузер, а диплинком в это приложение. Мастер-приложение открывается, пользователь сначала подтверждает вход в него, чаще всего через API ОС биометрией или пин-кодом, а затем уже в нем подтверждает вход в другое приложение. То есть consent screen отображается средствами мастер-приложения. Далее переход по redirect_uri может быть выполнен также диплинком обратно в приложение.
Это можно увидеть в некоторых приложениях экосистемы Сбера или приложениях, использующих вход через Госуслуги.
Пример
3. OpenID Connect Native SSO for Mobile Apps
Однако есть ещё способ, при котором приложение "само" может узнать вашу Identity без перехода в браузер или
другое приложение.
В данном случае в Authorization request запрашивается специальный scope "device_sso", что позволяет в Token response получить в том числе и device secret. Это новое понятие:
Приложение далее сохраняет ID token и device secret в хранилище через API операционной системы, например, Keychain в iOS.
Задумка здесь в том, что приложения, подписанные одним издателем, могут пошарить между собой определённые данные через защищённые хранилища ОС.
Так последующие приложения (того же издателя) смогут извлечь сохраненные ID token и device secret, а далее предлагается утилизировать Token Exchange.
Приложение 2 отправляет Token Exchange Request, где передаёт ID token и device secret, и в ответ может получить токены для себя.
Кроме этого, технически возможно также пошарить состояние аутентификации и между устройствами. Вот здесь предлагают подход с cross-device SSO на базе того же iCloud Keychain.
Спецификация достаточно новая и имеет свои особенности: например, использование ID token с истекшим сроком жизни, а также некоторую путаницу с audience у того же самого токена.
На эту тему есть ещё выступление Frictionless Authentication with Mobile Single Sign-On (SSO)
Докладчик рассказывает как раз про проблемы SSO через cookie в браузере на iOS-устройствах, говорит, что там разные инстансы браузера, между которыми cookie не шарятся. Также кратко показывает пример cross-device SSO.
И можно посмотреть, как это реализовали те же Okta:
https://developer.okta.com/docs/guides/configure-native-sso/main/
#iam_general #oauth
Я не большой мастак в вопросах разработки мобильных приложений, с вебом доводилось работать куда больше. Однако стало интересно, а какие подходы сейчас используются, например, когда у компании несколько приложений и нужно организовать SSO для них.
1. Стандартный SSO с использованием инстанса браузера
Самый простой и известный способ заключается в использовании какого-либо инстанса браузера: открыть полноценный браузер или "встроенное" в приложение окно, пользователь первично аутентифицируется, в браузере сохраняется SSO-cookie. При последующих входах в приложения повторный ввод учётных данных не потребуется, пока SSO-cookie жива и валидна.
Однако здесь есть подвох в том, что у разных инстансов браузера могут быть разные cookie jars, которые не шерятся между ними.
Пример
2. Подход с диплинками
Здесь суть в наличии некоего "мастер-приложения". После входа пользователя в него, прочие приложения могут направлять Authorization request не через браузер, а диплинком в это приложение. Мастер-приложение открывается, пользователь сначала подтверждает вход в него, чаще всего через API ОС биометрией или пин-кодом, а затем уже в нем подтверждает вход в другое приложение. То есть consent screen отображается средствами мастер-приложения. Далее переход по redirect_uri может быть выполнен также диплинком обратно в приложение.
Это можно увидеть в некоторых приложениях экосистемы Сбера или приложениях, использующих вход через Госуслуги.
Пример
3. OpenID Connect Native SSO for Mobile Apps
Однако есть ещё способ, при котором приложение "само" может узнать вашу Identity без перехода в браузер или
другое приложение.
В данном случае в Authorization request запрашивается специальный scope "device_sso", что позволяет в Token response получить в том числе и device secret. Это новое понятие:
Device Secret - Opaque value to the client, issued by the Authorization Server, that uniquely identifies the device instance and provides credentials for the device.
The device secret contains relevant data to the device and the current users authenticated with the device.
Приложение далее сохраняет ID token и device secret в хранилище через API операционной системы, например, Keychain в iOS.
Задумка здесь в том, что приложения, подписанные одним издателем, могут пошарить между собой определённые данные через защищённые хранилища ОС.
Так последующие приложения (того же издателя) смогут извлечь сохраненные ID token и device secret, а далее предлагается утилизировать Token Exchange.
Приложение 2 отправляет Token Exchange Request, где передаёт ID token и device secret, и в ответ может получить токены для себя.
Кроме этого, технически возможно также пошарить состояние аутентификации и между устройствами. Вот здесь предлагают подход с cross-device SSO на базе того же iCloud Keychain.
Спецификация достаточно новая и имеет свои особенности: например, использование ID token с истекшим сроком жизни, а также некоторую путаницу с audience у того же самого токена.
На эту тему есть ещё выступление Frictionless Authentication with Mobile Single Sign-On (SSO)
Докладчик рассказывает как раз про проблемы SSO через cookie в браузере на iOS-устройствах, говорит, что там разные инстансы браузера, между которыми cookie не шарятся. Также кратко показывает пример cross-device SSO.
И можно посмотреть, как это реализовали те же Okta:
https://developer.okta.com/docs/guides/configure-native-sso/main/
#iam_general #oauth
👍5❤1🔥1🤔1
Видео "JWT vs. mTLS for service-to-service authentication" от solo.io
Интересное видео про различные способы межсервисной аутентификации. Обозначают основную проблематику: "Как сервису B достоверно определить, что к нему действительно обращается сервис A?" и дальше идут от этого.
Ребята рассматривают 3 подхода:
🔵 OAuth 2.0 access token в виде JWT
🔵 самоподписанный JWT на уровне сервиса
🔵 mTLS с использованием SPIFFE
При этом говорят, что стараются не рекламировать и продавать какой-либо из них, а скорее рассказать "а как бывает" и подчеркнуть, что простора, где можно ошибиться, хватает.
Поднимается важность безопасности при разработке, несмотря на частое желание "to stay away from it". При этом все равно отмечают, что атака может быть проведена не только с использованием какой-то супер-крутой 0-day уязвимости, но и как результат эксплуатации цепочки, состоящей из того, что по отдельности может казаться мелочами ("Death by a Thousand Cuts").
Упоминается и использование API GW как централизованного места, на которое можно "сгрузить" часть security-фичей, чем обеспечив более гарантированное и консистентное их применение для всех сервисов. Но логично подмечают, что такой подход идет преимущественно для north-south взаимодействий, и особо не применяется для east-west, особенно если API GW находится где-то снаружи или далеко от окружения, где развернуты сервисы.
Вообще выделяется важность токенов, говорят о том, что это те же секреты, дающие возможность доступа, и нужно думать об ограничении и их времени жизни, и области применения.
Для кейса с access token очень правильно поднимают вопрос важности audience для токенов, который тоже порой хотелось бы слышать почаще. Что, мол, не все вообще используют audience, а если использовать "по уму", тобишь иметь различные токены для различных audience, то получаем необходимость сервису иметь кучу токенов, которые еще и надо все время обновлять.
Для случая с самоподписанными JWT справедливо говорят, что это будете работать на паре сервисов, но на большем количестве вы получите геморрой с поддержкой такого решения, обеспечением взаимного доверия и ротацией ключей.
Отмечают, что mTLS при корректной реализации позволяет закрыть не только задачи шифрования трафика, но и как раз аутентификации между сервисами. При этом акцент делают на реализации с применением service mesh, поскольку в таком случае на mesh, опять же, возможно "сгрузить" ряд универсальных для всех сервисов фичей, в том числе по работе с сертификатами. По словам авторов такой подход дает больше уверенности платформенной команде, что функциональность, касающаяся безопасности, реализована у всех и одинаково.
Отдельно обращу внимание, что кратко упоминается любопытный поинт о том, что в концепции SPIFFE вообще-то SPIFFE Verifiable Identity Document (SVID), который является сущностью, подтверждающей Identity вызывающей стороны, может быть не только в виде X.509 сертификата, но и в виде JWT. И теоретически это может работать, но реализаций таких авторы пока не встречали.
Отличие, согласно видео, здесь в том, что в случае с сертификатом сам "секрет" никуда не отправляется и не покидает пределов самого сервиса, который его получил. Используется только публичный ключ. А вот JWT, который сам по себе уже чувствительный, нам бы уже пришлось отправлять, как говорится, "по сети".
В общем видео показалось интересным и полезным, ребята говорят толковые вещи.
#video #iam_general
Интересное видео про различные способы межсервисной аутентификации. Обозначают основную проблематику: "Как сервису B достоверно определить, что к нему действительно обращается сервис A?" и дальше идут от этого.
Ребята рассматривают 3 подхода:
При этом говорят, что стараются не рекламировать и продавать какой-либо из них, а скорее рассказать "а как бывает" и подчеркнуть, что простора, где можно ошибиться, хватает.
Поднимается важность безопасности при разработке, несмотря на частое желание "to stay away from it". При этом все равно отмечают, что атака может быть проведена не только с использованием какой-то супер-крутой 0-day уязвимости, но и как результат эксплуатации цепочки, состоящей из того, что по отдельности может казаться мелочами ("Death by a Thousand Cuts").
Упоминается и использование API GW как централизованного места, на которое можно "сгрузить" часть security-фичей, чем обеспечив более гарантированное и консистентное их применение для всех сервисов. Но логично подмечают, что такой подход идет преимущественно для north-south взаимодействий, и особо не применяется для east-west, особенно если API GW находится где-то снаружи или далеко от окружения, где развернуты сервисы.
Вообще выделяется важность токенов, говорят о том, что это те же секреты, дающие возможность доступа, и нужно думать об ограничении и их времени жизни, и области применения.
Для кейса с access token очень правильно поднимают вопрос важности audience для токенов, который тоже порой хотелось бы слышать почаще. Что, мол, не все вообще используют audience, а если использовать "по уму", тобишь иметь различные токены для различных audience, то получаем необходимость сервису иметь кучу токенов, которые еще и надо все время обновлять.
Для случая с самоподписанными JWT справедливо говорят, что это будете работать на паре сервисов, но на большем количестве вы получите геморрой с поддержкой такого решения, обеспечением взаимного доверия и ротацией ключей.
Отмечают, что mTLS при корректной реализации позволяет закрыть не только задачи шифрования трафика, но и как раз аутентификации между сервисами. При этом акцент делают на реализации с применением service mesh, поскольку в таком случае на mesh, опять же, возможно "сгрузить" ряд универсальных для всех сервисов фичей, в том числе по работе с сертификатами. По словам авторов такой подход дает больше уверенности платформенной команде, что функциональность, касающаяся безопасности, реализована у всех и одинаково.
Отдельно обращу внимание, что кратко упоминается любопытный поинт о том, что в концепции SPIFFE вообще-то SPIFFE Verifiable Identity Document (SVID), который является сущностью, подтверждающей Identity вызывающей стороны, может быть не только в виде X.509 сертификата, но и в виде JWT. И теоретически это может работать, но реализаций таких авторы пока не встречали.
Отличие, согласно видео, здесь в том, что в случае с сертификатом сам "секрет" никуда не отправляется и не покидает пределов самого сервиса, который его получил. Используется только публичный ключ. А вот JWT, который сам по себе уже чувствительный, нам бы уже пришлось отправлять, как говорится, "по сети".
В общем видео показалось интересным и полезным, ребята говорят толковые вещи.
#video #iam_general
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
JWT vs. mTLS for service-to-service authentication
In this Hoot, we'll look at JWT and mTLS for service-to-service authentication. The two approaches look similar, but implementing them is not straightforward. If we want to implement mTLS for service-to-service authentication, we have to solve the problems…
👍9🔥4❤2🤔2
Статья "Ory Kratos — конструктор для сборки цифрового продукта любой сложности"
Интересная статья про возможности Open Source продукта Ory Kratos. Жаль, конечно, что описана работа в вакууме, а не на реальном кейсе. Вообще материалов по опыту использования стека от Ory мало, хотя знаю, что и в РФ есть компании, кто у себя использует или планирует к использованию, но делиться кейсам пока не хотят. Поэтому довольствуемся чем есть, буду надеяться, что авторы в будущем поделятся и опытом с реального проекта, по крайней мере в статье пишут, что прям реально "используют" где-то.
#iam_general
Интересная статья про возможности Open Source продукта Ory Kratos. Жаль, конечно, что описана работа в вакууме, а не на реальном кейсе. Вообще материалов по опыту использования стека от Ory мало, хотя знаю, что и в РФ есть компании, кто у себя использует или планирует к использованию, но делиться кейсам пока не хотят. Поэтому довольствуемся чем есть, буду надеяться, что авторы в будущем поделятся и опытом с реального проекта, по крайней мере в статье пишут, что прям реально "используют" где-то.
#iam_general
🔥1🤔1
Обзор книги "Solving Identity Management in Modern Applications: Demystifying OAuth 2.0, OpenID Connect, and SAML 2.0 (2 издание)"
Я долго с грустью полагал, что для области IAM мало действительно хороших книжек, которые в том числе можно было бы порекомендовать. Безусловно, качественные материалы встречаются, но чаще я находил их в разрозненных представлениях, нежели собранными в одном произведении. Книгу «Solving Identity Management in Modern Applications» я видел еще давно, но почему-то сложил о ней начальное впечатление, что она, как и некоторые другие, подает переписанную с неточностями информацию из стандартов и спецификаций, поскольку на обложке как раз стандарты и указаны. И вот всегда я обходил ее стороной. Однако в прошедшем году наткнулся в одном из чатов на положительный отзыв, просмотрел оглавление и решил прочесть.
Что могу сказать... Это книга, которую можно посоветовать как некий комплексный материал. Причем как «новичкам», так итем, кто уже смешарик продвинутым. Я сам удивлен, что мне настолько она откликнулась. Самое удивительное, что именно в книге, которую долго откладывал в сторону, я нашел очень большое количество мыслей, которые даже выражены буквально так же, как их формулирую для себя сам, и которые в таком виде почти нигде не встречал. Большое количество моментов пересекаются с темами планируемых постов для канала, которые я себе выписывал, так что о чем-то уже можно и не писать, а просто отсылать к её разделам. Еще мне очень понравились многие формулировки в книге, поскольку они в своем большинстве достаточно точные и не создают путаницы. Увы, во многих современных статьях с формулировками прям большая беда, из-за чего часто смысл искажается, и читателям становится сложнее понять оригинальную идею.
Так что теперь смело рекомендую эту книгу к прочтению. Это гарантированно будет во много раз полезнее, чем читать многочисленные статьи с хабра «Об OAuth и OIDC простыми словами», где, увы, в основном ошибка на ошибке. Я даже решил написать для книги отдельный развернутый обзор. Но это не будет кратким содержанием или пересказом, а скорее выделением важных и полезных моментов, которые нашли во мне отклик. Как пример, в обзоре включаю цитаты, которые выделял при прочтении. Формат получился экспериментальный, но для меня лично это был скорее "диалог с книгой", как продолжение красивой русской традиции. Я честно старался искать и места для критики, но найти таковых получилось довольно немного.
Но, имхо, чтобы стать таким же довольным, читать стоит прям максимально внимательно и вдумчиво, потому что порой невероятно полезная мысль может быть выражена одной строчкой или даже присутствовать между строк.
Кстати, авторы даже предлагают подходы к порядку прочтения для тех, кто не любит читать главы по порядку:
Обзор разбит на 3 части, которые полностью покрывают содержание и будут опубликованы в течение некоторого времени. Здесь же представляю первую часть обзора, которая доступна по ссылке ниже. Остальными ссылками пост будет дополнен позже.
Часть 1 (главы 1-7) | Часть 2 (главы 8-12) | Часть 3 (главы 13-22)
#book #iam_general #oauth
Я долго с грустью полагал, что для области IAM мало действительно хороших книжек, которые в том числе можно было бы порекомендовать. Безусловно, качественные материалы встречаются, но чаще я находил их в разрозненных представлениях, нежели собранными в одном произведении. Книгу «Solving Identity Management in Modern Applications» я видел еще давно, но почему-то сложил о ней начальное впечатление, что она, как и некоторые другие, подает переписанную с неточностями информацию из стандартов и спецификаций, поскольку на обложке как раз стандарты и указаны. И вот всегда я обходил ее стороной. Однако в прошедшем году наткнулся в одном из чатов на положительный отзыв, просмотрел оглавление и решил прочесть.
Что могу сказать... Это книга, которую можно посоветовать как некий комплексный материал. Причем как «новичкам», так и
Так что теперь смело рекомендую эту книгу к прочтению. Это гарантированно будет во много раз полезнее, чем читать многочисленные статьи с хабра «Об OAuth и OIDC простыми словами», где, увы, в основном ошибка на ошибке. Я даже решил написать для книги отдельный развернутый обзор. Но это не будет кратким содержанием или пересказом, а скорее выделением важных и полезных моментов, которые нашли во мне отклик. Как пример, в обзоре включаю цитаты, которые выделял при прочтении. Формат получился экспериментальный, но для меня лично это был скорее "диалог с книгой", как продолжение красивой русской традиции. Я честно старался искать и места для критики, но найти таковых получилось довольно немного.
Но, имхо, чтобы стать таким же довольным, читать стоит прям максимально внимательно и вдумчиво, потому что порой невероятно полезная мысль может быть выражена одной строчкой или даже присутствовать между строк.
Кстати, авторы даже предлагают подходы к порядку прочтения для тех, кто не любит читать главы по порядку:
We recommend reading the chapters in order, at least through Chapter 15, as many of these chapters build on previous chapters. For the rebels in the crowd, we especially recommend at least reading Chapters 4 through 10 in order as they have the most dependencies on earlier content. The chapters after Chapter 15 can mostly be read in any order. Chapter 16 on troubleshooting will be most relevant when you need to debug an issue. Chapter 18 on less common requirements might be valuable to read early on in a project as it may help you identify items to include in your project plan. Chapters 17 and 19 cover different types of issues and will help you plan for, or avoid, many mistakes.
Обзор разбит на 3 части, которые полностью покрывают содержание и будут опубликованы в течение некоторого времени. Здесь же представляю первую часть обзора, которая доступна по ссылке ниже. Остальными ссылками пост будет дополнен позже.
Часть 1 (главы 1-7) | Часть 2 (главы 8-12) | Часть 3 (главы 13-22)
#book #iam_general #oauth
👍9🔥4❤2🤔1
401 Unauthorized: аутентификация и не только
Обзор книги "Solving Identity Management in Modern Applications: Demystifying OAuth 2.0, OpenID Connect, and SAML 2.0 (2 издание)" Я долго с грустью полагал, что для области IAM мало действительно хороших книжек, которые в том числе можно было бы порекомендовать.…
Вторая часть обзора книги "Solving Identity Management in Modern Applications: Demystifying OAuth 2.0, OpenID Connect, and SAML 2.0 (2 издание)"
Главы с 8 по 12
https://telegra.ph/Obzor-knigi-Solving-Identity-Management-in-Modern-Applications-Demystifying-OAuth-20-OpenID-Connect-and-SAML-20-CHast-1-Glavy-7-01-05
#book #iam_general #oauth
Главы с 8 по 12
https://telegra.ph/Obzor-knigi-Solving-Identity-Management-in-Modern-Applications-Demystifying-OAuth-20-OpenID-Connect-and-SAML-20-CHast-1-Glavy-7-01-05
#book #iam_general #oauth
Telegraph
Обзор книги "Solving Identity Management in Modern Applications: Demystifying OAuth 2.0, OpenID Connect, and SAML 2.0". Часть 2.…
Глава 8 «Authorization and Policy Enforcement» После ознакомления с основными стандартами идут более интересные главы. Здесь материал начинается с различий Authorization и Policy Enforcement, о чем уже упоминалось ранее.
👍5👏1🤔1
Видео доклада "Supercharging OAuth 2.0 Security" от Philippe De Ryck с DevFest 2024 в Копенгагене.
Не так давно на канале NDC Conferences (очень классный канал, советую) была опубликована запись данного выступления. Вообще Philippe De Ryck, насколько я встречал его работы, специализируется больше на безопасности клиентских частей веб-приложений в контексте вопросов аутентификации. Это можно увидеть из его блога или соавторства в драфте OAuth 2.0 for Browser-Based Applications.
В этом же материале речь идет о некоторых общих концепциях в целом. Автор предлагает посмотреть на "относительно недавно появившиеся возможности OAuth", рассмотрению которых доклад и будет посвящен.
➡️ Так упоминается RFC 8707 Resource Indicators for OAuth 2.0 для ограничения области действия access token, отмечаются особенности работы подхода с точки зрения получения новых токенов на стороне Cilent.
➡️ Поднимается вопрос обеспечения безопасности для Authorization request, а особенно обеспечения его целостности (integrity) и защиты от манипуляций (tampering). В этом контексте вспоминаем про JWT-Secured Authorization Request (JAR) и Pushed Authorization Requests (PAR).
Для JAR параметры Authorization request оборачиваются в специальный JWT, подписанный на стороне Client. Соответственно в issuer фигурирует client_id, а audience является уже сам Authorization server. При выполнении самого Authorization request вместо использования query-параметров в plain-text передается как раз созданный JWT.
В случае PAR в Authorization request параметры не передаются вовсе, а передается только специальный идентификатор, соответствующий предварительно созданному набору параметров Authorization request.
➡️ Говорит автор также и про извечные проблемы bearer-токенов и не менее извечное движение к sender-constrained токенам доступа.
Кратко рассматривается использование основных proof-of-possession механизмов: mTLS и DPoP, справедливо отмечая, что реализация данных подходов может быть не так проста и не всегда оправдана.
В общем и целом легкий обзорный доклад без глубокого погружения в нюансы. Если интересно начально узнать об упомянутых возможностях и механизмах и посмотреть демо их работы, ознакомиться может быть полезно.
#video #oauth
Не так давно на канале NDC Conferences (очень классный канал, советую) была опубликована запись данного выступления. Вообще Philippe De Ryck, насколько я встречал его работы, специализируется больше на безопасности клиентских частей веб-приложений в контексте вопросов аутентификации. Это можно увидеть из его блога или соавторства в драфте OAuth 2.0 for Browser-Based Applications.
В этом же материале речь идет о некоторых общих концепциях в целом. Автор предлагает посмотреть на "относительно недавно появившиеся возможности OAuth", рассмотрению которых доклад и будет посвящен.
Для JAR параметры Authorization request оборачиваются в специальный JWT, подписанный на стороне Client. Соответственно в issuer фигурирует client_id, а audience является уже сам Authorization server. При выполнении самого Authorization request вместо использования query-параметров в plain-text передается как раз созданный JWT.
В случае PAR в Authorization request параметры не передаются вовсе, а передается только специальный идентификатор, соответствующий предварительно созданному набору параметров Authorization request.
Кратко рассматривается использование основных proof-of-possession механизмов: mTLS и DPoP, справедливо отмечая, что реализация данных подходов может быть не так проста и не всегда оправдана.
В общем и целом легкий обзорный доклад без глубокого погружения в нюансы. Если интересно начально узнать об упомянутых возможностях и механизмах и посмотреть демо их работы, ознакомиться может быть полезно.
#video #oauth
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔1
401 Unauthorized: аутентификация и не только
Обзор книги "Solving Identity Management in Modern Applications: Demystifying OAuth 2.0, OpenID Connect, and SAML 2.0 (2 издание)" Я долго с грустью полагал, что для области IAM мало действительно хороших книжек, которые в том числе можно было бы порекомендовать.…
Третья часть обзора книги "Solving Identity Management in Modern Applications: Demystifying OAuth 2.0, OpenID Connect, and SAML 2.0 (2 издание)"
Здесь включены оставшиеся главы с 13 по 22:
- Logout
- Account Management
- Deprovisioning
- Troubleshooting
- Exceptions
- Less Common Requirements
- Failures
- Compliance
- Looking into the Crystal Ball
- Conclusion
https://telegra.ph/Obzor-knigi-Solving-Identity-Management-in-Modern-Applications-Demystifying-OAuth-20-OpenID-Connect-and-SAML-20-CHast-3-Glavy-9--01-05
#book #iam_general #oauth
Здесь включены оставшиеся главы с 13 по 22:
- Logout
- Account Management
- Deprovisioning
- Troubleshooting
- Exceptions
- Less Common Requirements
- Failures
- Compliance
- Looking into the Crystal Ball
- Conclusion
https://telegra.ph/Obzor-knigi-Solving-Identity-Management-in-Modern-Applications-Demystifying-OAuth-20-OpenID-Connect-and-SAML-20-CHast-3-Glavy-9--01-05
#book #iam_general #oauth
🤔1
Многие читатели канала наверняка хоть раз использовали сервис jwt.io для декодирования JWT. Я и сам им частенько им пользуюсь, удобно.
Так вот, разработчики решили провести его модернизацию и в качестве беты уже выкатили новую версию. Для доступа к ней нужно:
- зайти на https://jwt.io/beta
- ввести пароль
Из интересного отмечу, что здесь разделили функции decoding и encoding на два разных интерфейса. Почитать про изменения подробнее или оставить фидбек можно в данном issue на гитхабе.
#jwt
Так вот, разработчики решили провести его модернизацию и в качестве беты уже выкатили новую версию. Для доступа к ней нужно:
- зайти на https://jwt.io/beta
- ввести пароль
jwtv2Из интересного отмечу, что здесь разделили функции decoding и encoding на два разных интерфейса. Почитать про изменения подробнее или оставить фидбек можно в данном issue на гитхабе.
#jwt
🔥3🤔2👍1
Top 10 web hacking techniques of 2024 от PortSwigger (часть 1)
Сбылась моя мечта, хоть раз опубликую здесь что-то актуальное и свежее. Буквально вот только что был опубликован уже ставший ежегодным топ лучших публикаций и ресчерчей в области ИБ за 2024 год по версии PortSwigger.
Дата оглашения была известна заранее, поэтому я успел подготовиться и прочитать заранее интересующие статьи 😈. А здесь хочу выделить интересные с точки зрения тематики канала материалы.
1️⃣ Hijacking OAUTH flows via Cookie Tossing - 10 место
Большая часть статьи - это, к сожалению, вода. Однако здесь меня сильно повеселила фраза "Revisiting GitPod". Когда я занимался исследованием вопроса аутентификации для WebSocket, находил материал от тех же snyk.io про интересный кейс с раскруткой Cross-Site WebSocket Hijacking (CSWH) до RCE на примере GitPod. Там как раз был нюанс в использовании поддоменов .gitpod.io для обхода SameSite. Показалось забавным, что авторы снова вернулись к бедному GitPod и снова что-то у них нашли, причем опять за счет поддоменов.
2️⃣ ChatGPT Account Takeover - Wildcard Web Cache Deception - 9 место
Читающие канал более года обратят внимание, что этот материал уже освещался здесь ранее - как раз во время своей изначальной публикации.
3️⃣ OAuth Non-Happy Path to ATO - 8 место
Предлагается довольно любопытный подход к краже authorization response для случая, когда страница с redirect URI в случае "неуспеха" отражает значение из переданного заголовка запроса Referer в заголовке ответа Location, что способствует редиректу. Автор использует прокидывание заголовка Referer через цепочку редиректов, а также особенность работы браузеров, заключающуюся в распространении части URI fragment при выполнении редиректа (в отличие от тех же query-параметров).
На этом в самом топе все, но в следующем посте посмотрим и на другие, на мой взгляд, достойные внимания публикации.
#security #article
Сбылась моя мечта, хоть раз опубликую здесь что-то актуальное и свежее. Буквально вот только что был опубликован уже ставший ежегодным топ лучших публикаций и ресчерчей в области ИБ за 2024 год по версии PortSwigger.
Дата оглашения была известна заранее, поэтому я успел подготовиться и прочитать заранее интересующие статьи 😈. А здесь хочу выделить интересные с точки зрения тематики канала материалы.
Большая часть статьи - это, к сожалению, вода. Однако здесь меня сильно повеселила фраза "Revisiting GitPod". Когда я занимался исследованием вопроса аутентификации для WebSocket, находил материал от тех же snyk.io про интересный кейс с раскруткой Cross-Site WebSocket Hijacking (CSWH) до RCE на примере GitPod. Там как раз был нюанс в использовании поддоменов .gitpod.io для обхода SameSite. Показалось забавным, что авторы снова вернулись к бедному GitPod и снова что-то у них нашли, причем опять за счет поддоменов.
Читающие канал более года обратят внимание, что этот материал уже освещался здесь ранее - как раз во время своей изначальной публикации.
Предлагается довольно любопытный подход к краже authorization response для случая, когда страница с redirect URI в случае "неуспеха" отражает значение из переданного заголовка запроса Referer в заголовке ответа Location, что способствует редиректу. Автор использует прокидывание заголовка Referer через цепочку редиректов, а также особенность работы браузеров, заключающуюся в распространении части URI fragment при выполнении редиректа (в отличие от тех же query-параметров).
На этом в самом топе все, но в следующем посте посмотрим и на другие, на мой взгляд, достойные внимания публикации.
#security #article
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1🤔1
401 Unauthorized: аутентификация и не только
Top 10 web hacking techniques of 2024 от PortSwigger (часть 1) Сбылась моя мечта, хоть раз опубликую здесь что-то актуальное и свежее. Буквально вот только что был опубликован уже ставший ежегодным топ лучших публикаций и ресчерчей в области ИБ за 2024 год…
Top 10 web hacking techniques of 2024 от PortSwigger (часть 2)
Не менее интересно также обратиться к полному списку номинантов и указать статьи, не вошедшие в топ.
4️⃣ POST to XSS: Leveraging Pseudo Protocols to Gain JavaScript Evaluation in SSO Flows
Материал про то, как возможность указания в качестве значения redirect URI URI-схем (или же псевдопротоколов) а-ля
5️⃣ Zoom Session Takeover - Cookie Tossing Payloads, OAuth Dirty Dancing, Browser Permissions Hijacking, and WAF abuse
Last but not least, мне кажется, материал незаслуженно обделили. Опубликован, кстати, в том же блоге, что и упомянутая статья про Web Cache Deception в chat.openai[.]com.
✏️ Авторы нашли интересную cookie-based XSS через отражение (reflection) значения куки с CSP nonce, причём по их словам отражение было на всех страницах всех поддоменов zoom.us. Однако особенность такой XSS в том, что нужно ещё найти подходящий начальный вектор, например, cache poisoning, которое однако было неприменимо в данном случае.
✏️ Здесь авторы пришли к использованию cookie tossing, чтобы "пробросить" установленную на поддомене куку на основной домен, что обеспечило им наличие XSS на нем.
Большие компании вроде Zoom обычно имеют множество поддоменов, аудит которых не всегда может тщательно вестись. Многие из таких поддоменов обычно сами по себе не представляют ценности, и XSS на них могут показаться не сильно полезными. Однако, это не всегда так. В статье авторы нашли POST-based XSS на одном из поддоменов, и использовали ее для реализации XSS уже на домене основном.
✏️ Далее, уже имея таким образом возможность выполнения JS на основном домене, выполняется кража параметров authorization response со страницы redirect URI и получение session ID на их основе.
✏️ Отдельно хочу отметить очень интересную часть про использование того факта, что Zoom есть платформа для аудио- и видео-встреч, а следовательно у пользователей, использовавших веб-версию zoom, уже будут выданы в браузере разрешения на использование камеры и микрофона. Cookie-based натура у XSS в данном случае обеспечила автором постоянство (persistence) в выполнении внедренного JS, что они использовали для демонстрации возможности захвата аудио- и видео-потока на устройстве пользователя и отправки его на сервер атакующего.
✏️ Также продемонстрирована возможность – опять же, за счет использования кук – обернуть использование WAF против самих Zoom: установить пользователю куку с пейлоадом, на который реагирует WAF, что по факту "забанит" доступ пользователя ко всему сайту или – это круче всего – к выборочным страницам за счет использования атрибута path у куки. Вот это правда вау, как по мне, читать было очень интересно.
Глядя на все это, можно заняться любимым делом: попыткой сделать выводы на основе нерепрезентативных предвзятых подборок!
Что примечательного могу отметить:
- Все еще видим неплохие материалы по атакам в контексте OAuth и аутентификации, значит и работа над мерами защиты не перестает быть актуальной
- Немало материалов так или иначе упоминают "OAuth Dirty Dancing", что отсылается к известной статье от Frans Rosén (про которую, кстати, скоро поговорим на канале)
- XSS по-прежнему "still alive & kickin'"
- Неожиданно неоднократно упоминают cookie tossing
В целом отмечаю интересное направление, показывающее актуальность атак с кражей authorization response и дальнейшим его использованием для получения account takeover - рассчитываю, что в течение весны сможем более подробно поговорить про эту тему и проверить, точно ли предлагаемые обычно меры защиты так эффективны.
Естественно, читать такие материалы полезно не только если вы обычно представляете атакующую сторону, но и если вашей задачей так или иначе является проектирование систем. Чтобы понять, как и от чего стоит (или не стоит) защищаться, нужно понимать и сами принципы, стоящие за атаками и уязвимостями.
#security #article
Не менее интересно также обратиться к полному списку номинантов и указать статьи, не вошедшие в топ.
Материал про то, как возможность указания в качестве значения redirect URI URI-схем (или же псевдопротоколов) а-ля
javascript: в сочетании с form post response mode может позволить получить XSS уже на стороне самого authorization server (что, конечно, открывает широкие горизонты перед атакующим).Last but not least, мне кажется, материал незаслуженно обделили. Опубликован, кстати, в том же блоге, что и упомянутая статья про Web Cache Deception в chat.openai[.]com.
Большие компании вроде Zoom обычно имеют множество поддоменов, аудит которых не всегда может тщательно вестись. Многие из таких поддоменов обычно сами по себе не представляют ценности, и XSS на них могут показаться не сильно полезными. Однако, это не всегда так. В статье авторы нашли POST-based XSS на одном из поддоменов, и использовали ее для реализации XSS уже на домене основном.
Глядя на все это, можно заняться любимым делом: попыткой сделать выводы на основе нерепрезентативных предвзятых подборок!
Что примечательного могу отметить:
- Все еще видим неплохие материалы по атакам в контексте OAuth и аутентификации, значит и работа над мерами защиты не перестает быть актуальной
- Немало материалов так или иначе упоминают "OAuth Dirty Dancing", что отсылается к известной статье от Frans Rosén (про которую, кстати, скоро поговорим на канале)
- XSS по-прежнему "still alive & kickin'"
- Неожиданно неоднократно упоминают cookie tossing
В целом отмечаю интересное направление, показывающее актуальность атак с кражей authorization response и дальнейшим его использованием для получения account takeover - рассчитываю, что в течение весны сможем более подробно поговорить про эту тему и проверить, точно ли предлагаемые обычно меры защиты так эффективны.
Естественно, читать такие материалы полезно не только если вы обычно представляете атакующую сторону, но и если вашей задачей так или иначе является проектирование систем. Чтобы понять, как и от чего стоит (или не стоит) защищаться, нужно понимать и сами принципы, стоящие за атаками и уязвимостями.
#security #article
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👏1🤔1
Про различные response modes в OAuth
Спецификация OAuth 2.0 Multiple Response Type Encoding Practices (она крохотная, не поленитесь посмотреть), кроме описания использования различных response types, вводит еще и понятие Response Mode:
Сам документ изначально регистрирует всего два значения для параметра response_mode:
- query;
- fragment.
Однако тут же отмечается, что
И действительно, в дополнение к вышеобозначенным, мы часто встречаем и следующие:
- form_post;
- web_message.
Form post response mode представляет собой ответ в виде HTML-страницы с формой, которая при загрузке страницы через User Agent автоматически отправляет параметры authorization response на адрес redirect URI (
Web message response mode предполагает отправку параметров authorization response через postMessage API. Здесь используется открытие в новом окне (popup) или же внутри iframe URL с адресом authorization request. В ответ authorization server так же возвращает HTML-страницу, которая средствами JS отправляет параметры authorization response родительскому окну.
Вообще данный response mode не то чтобы был особо специфицирован, однако это не мешает ему находить применение в реальных имплементациях.
Про не особо специфицирован: можно найти только два уже протухших драфта, откровенно говоря, в зачаточном состоянии:
🔵 OAuth 2.0 Web Message Response Mode
Здесь могу выделить довольно странную схему "Relay Mode". Базово стоит полагать, что как минимум
Unauthenticated Window будет иметь другой origin, поскольку это страница, принадлежащая authorization server. С таким допущением попробовал сделать PoC, чтобы проверить реализацию, однако шаг 7
выглядит нереализуемым в современных браузерах из-за Same-Origin Policy, а также из-за невозможности передать в сообщении ссылку на объект window без сериализации, как это предлагается. Таким образом не вижу возможности реализовать отправку сообщений между двумя подобными фреймами. Однако допускаю и что моих знаний JS не хватило, чтобы понять предложенную схему.
🔵 OAuth 2.0 Web Message Response Mode for Popup- and Iframe-based Authorization Flows
Соавтор драфта, кстати, является автором понравившейся мне магистерской диссертации, про которую уже писал. Выделить могу интересную цитату в Security Considerations:
Про это поговорим чуть подробнее в дальнейших постах.
Давно проверяли, какие response modes поддерживает ваш authorization server? Загляните, например, в
#oauth
Спецификация OAuth 2.0 Multiple Response Type Encoding Practices (она крохотная, не поленитесь посмотреть), кроме описания использования различных response types, вводит еще и понятие Response Mode:
The Response Mode determines how the Authorization Server returns result parameters from the Authorization Endpoint. Non-default modes are specified using the response_mode request parameter. If response_mode is not present in a request, the default Response Mode mechanism specified by the Response Type is used.
Сам документ изначально регистрирует всего два значения для параметра response_mode:
- query;
- fragment.
Однако тут же отмечается, что
See OAuth 2.0 Form Post Response Mode [OAuth.Post] for an example of a specification that defines an additional Response Mode. Note that it is expected that additional Response Modes may be defined by other specifications in the future, including possibly ones utilizing the HTML5 postMessage API and Cross Origin Resource Sharing (CORS).
И действительно, в дополнение к вышеобозначенным, мы часто встречаем и следующие:
- form_post;
- web_message.
Form post response mode представляет собой ответ в виде HTML-страницы с формой, которая при загрузке страницы через User Agent автоматически отправляет параметры authorization response на адрес redirect URI (
<form method="post" action="https://site.com/callback">). Таким образом данные передаются через POST-запрос к обозначенному эндпоинту. Подход далеко не новый: аналогичное мы могли наблюдать еще со времен SAML POST Binding.Web message response mode предполагает отправку параметров authorization response через postMessage API. Здесь используется открытие в новом окне (popup) или же внутри iframe URL с адресом authorization request. В ответ authorization server так же возвращает HTML-страницу, которая средствами JS отправляет параметры authorization response родительскому окну.
Вообще данный response mode не то чтобы был особо специфицирован, однако это не мешает ему находить применение в реальных имплементациях.
Про не особо специфицирован: можно найти только два уже протухших драфта, откровенно говоря, в зачаточном состоянии:
Здесь могу выделить довольно странную схему "Relay Mode". Базово стоит полагать, что как минимум
Unauthenticated Window будет иметь другой origin, поскольку это страница, принадлежащая authorization server. С таким допущением попробовал сделать PoC, чтобы проверить реализацию, однако шаг 7
Unauthenticated window obtains the window object of the Message Target Window via the MessageEvent object in the Relay Response and send Authorization Response as a Web Message.
выглядит нереализуемым в современных браузерах из-за Same-Origin Policy, а также из-за невозможности передать в сообщении ссылку на объект window без сериализации, как это предлагается. Таким образом не вижу возможности реализовать отправку сообщений между двумя подобными фреймами. Однако допускаю и что моих знаний JS не хватило, чтобы понять предложенную схему.
Соавтор драфта, кстати, является автором понравившейся мне магистерской диссертации, про которую уже писал. Выделить могу интересную цитату в Security Considerations:
In flows using the web message response mode, the confidentiality of the authorization response is scoped to the postMessage's receiver origin that does not contain a path. Thus, cross-site scripting (XSS) vulnerabilities on any path within the web application's origin will leak the authorization response to the attacker.
Про это поговорим чуть подробнее в дальнейших постах.
Давно проверяли, какие response modes поддерживает ваш authorization server? Загляните, например, в
/.well-known/openid-configuration, обычно это отражается и там.#oauth
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1🤔1