Аутентификация с помощью JWT-токенов | 1С:Зазеркалье

Вспомним, что такое jwt

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

Нам требуется их помощь для аутентификации и авторизации пользователя на сайте.

Что такое оauth2.0?


Разработку нового Auth мы решили начать с изучения доступных протоколов и технологий. Самый распространённый стандарт авторизации — фреймворк авторизации OAuth2.0. 

Стандарт был принят в 2022 году, и спустя восемь лет протоколы были обновлены. Создатели оригинального протокола решили написать OAuth 2.1, чтобы сжать все изменения от OAUT 1.0 в один документ, потому что было очень много RFC. В настоящее время он находится в черновом варианте.

R FC 6749 содержит описание самой последней версии OAuth. Именно ее мы и рассмотрим.

O Auth 2.0 является основой для аутентификации.

В нем описывается правильная работа системы безопасности для безопасной авторизации. Поток узлов, взаимодействующих друг с другом, является одним из примеров деталей, которые описываются очень подробно. Другим остается выбрать, какую реализацию они хотят.

Какие особенности есть у стрижки?

Разбираемся в особенностях.

Что такое grant?

Грант – это информация, которая показывает успешную авторизацию клиента владельцем ресурса для получения маркера доступа.

Например, уведомление появляется при регистрации в Google. Отображающийся на экране ток-ен указывает на то, что какая-то служба хочет получить доступ к информации о вас или ваших ресурсах. Уведомление “Экран согласия” – так оно называется.

База данных получает запись о том, что такой-то и такой-то пользователь предоставил такой-то доступ к такой-то и такой-то службе, когда мы нажимаем “ОК”. Идентификатор успешной аутентификации, например, строка, хранящаяся в базе данных, отправляется клиенту.

Подобный грант можно получить 4 различными способами:

Authorization code


Самый распространённый flow на данный момент. В основном используется для confidential клиентов, но с появлением дополнительной проверки с помощью PKCE, может применяться и для public-клиентов. 

Json web token (jwt)

Три незащищенных сегмента строки соединяются точками, образуя веб-токи J SON (JWT; также произносится “джот”).

Openid connect

Мы пришли к спецификации OpenID Connect (OIDC).

Спецификация O IDC описывает способы аутентификации пользователей поверх IAUT 2.0. Фонд OpenID Foundation (ODF) отвечает за создание стандартов O IDC.

Уровень идентификации, называемый O IDC, помогает в аутентификации пользователей с помощью сервера аутентификации.

Вы помните, что токены распространяются сервером авторизации. Токены – это биты закодированных данных, которые передаются между сторонами (например, приложением или сервером авторизации). В OIDC ID-токены распространяются сервером авторизации.

Payload

Любые данные, которые вы хотите отправить токену, являются полезной нагрузкой. Спецификация включает следующие зарезервированные поля:

  • Issuer (эмитент) эмитент токена
  • Sub (subject) “субъект”, получатель токена
  • Aud (audience) аудитория, получатели токена
  • Exp (expire time) время истечения срока действия токена
  • Nbf (not before) время истечения срока действия токена
  • Iat (issued at) время создания токена
  • Jti (JWT id) токен-ид

Хотя каждое из этих утверждений необязательно, их использование может привести к возникновению споров.

Иногда информация может передаваться между сторонами с помощью маркера с их согласия. Этот вид полезной нагрузки может использоваться веб-клиентами.

Resource owner password credentials flow

Что касается рекомендаций по безопасности, как они в настоящее время изложены в рекомендательных письмах

Этот поток абсолютно не рекомендуется из-за проблем с безопасностью.

Signature

Закодированные заголовок и полезная нагрузка объединяются с разделителем “точка” (“”) ИЛИ для создания подписи. Алгоритм, выбранный в заголовке, затем используется для хэширования этой строки. Подпись создается алгоритмом хэширования.

В нашем примере токен будет выглядеть так: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBdXRoIFNlcnZlciIsInN1YiI6ImF1dGgiLCJleHAiOjE1MDU0Njc3NTY4NjksImlhdCI6MTUwNTQ2NzE1MjA2OSwidXNlciI6MX0.9VPGwNXYfXnNFWH3VsKwhFJ0MazwmNvjSSRZ1vf3ZUU

Абстрактный oauth 2.0. flow c применением access token

Мы рассмотрели различные типы токенов, роли и внешность. Давайте рассмотрим правила пользования сервисом.

Эта иллюстрация может быть использована для объяснения абстрактного плана (или потока) взаимодействия участников. Шаги этого плана выполняются в порядке сверху вниз. Давайте более подробно остановимся на этом вопросе.


Клиент получает одобрение от resource owner, на основе которого ему выдаётся доступ к ресурсу. Всё просто. А будет ли так же просто, если мы добавим в эту схему работу с refresh token?

Абстрактный oauth 2.0. flow c применением refresh token

Первые два шага не пропускаются; они рассматриваются одинаково.

Схема подробнее:

Аутентификация при помощи id-токенов

Давайте посмотрим, как осуществляется OIDC-аутентификация.

Имейте в виду, что это упрощенный план. У вас могут быть дополнительные потоки, в зависимости от конструкции вашей системы.

Виды токенов

Мы больше не сможем получить доступ к частной информации, если срок действия старого JWT истечет. Теперь любой посетитель может получить доступ к JWT. Срок действия маркера обновления, конечно, может истечь, но не в ближайшее время.

С одной стороны, без сервера авторизации проверка пользователя упрощается с помощью токенов авторизации.

const validateToken = token => {
    const [ header, payload, signature ] = token.split('.');
    return signature === HS256(`${header}.${payload}`, SECRET_KEY);
}

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

Делегирование с областью видимости

Как API устанавливает степень доступа приложения В этом случае область действия устанавливается путем корректировки видимой области действия приложения.

То, что приложение может сделать для пользователя, ограничивается областью видимости. Она не позволяет пользователю предоставлять себе разрешения, которых у него еще нет. Область видимости гарантирует, что пользователь HireMe123 не сможет создать новый личный счет, если пользователь MyCalApp не имеет полномочий на создание новых корпоративных счетов.

Области, в которых находится ресурс или API, делегируют управление доступом компании Apple. API отвечает за то, чтобы области доступа соответствовали правам пользователей.

Давайте рассмотрим, как это проявляется в реальном использовании.

Я использую программу HireMe123. HireMe123 хочет создать событие на мой адрес электронной почты, используя API MyCalApp от третьей стороны. Приложение HireMe123 запросило токен доступа MyCalApp. Этот маркер содержит важную информацию.

  • Sub: (мой идентификатор пользователя в MyCalApp);
  • Aud: MyCalAppAPI (этот токен создается для доступа к API MyCalApp);
  • Scope: write:events (scope предполагает, что HireMe123 может использовать API для записи событий в мой календарь).

На сервер MyCalApp поступил запрос от HireMe123. Область write:events становится видимой для API MyCalApp, когда он получает запрос.

Однако, MyCalApp имеет учетные записи с сотнями тысяч пользовательских календарей. Чтобы убедиться, что этот запрос от HireMe123 относится только к возможности моей учетной записи создавать события.

Области действия определяют, что приложение сможет делать от имени пользователя при использовании делегированной авторизации. Это подмножество общих разрешений пользователя.

Доступ к api при помощи токенов доступа

В предыдущем разделе мы обсудили токены доступа и работу делегированного доступа с использованием OAuth 2.0 и серверов авторизации. Теперь давайте упорядочим эту информацию. Для этого мы вернемся к сценарию HireMe123 и MyCalApp.

Доступ к api ресурса

Допустим, мы хотим вызвать API одностраничного приложения, используя маркер доступа. Как эта функция

Заголовок jwt

Заголовок – это первый сегмент токена. Он может выглядеть следующим образом:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9

Алгоритм и тип подписи содержатся в заголовке токена, который представляет собой объект JSON. Для шифрования базы 64Url используются алгоритмы BASF и CAPTCHA (двоичные данные, представленные в виде текста).

Расшифровать это можно так:

{
  "alg": "RS256",
  "typ": "JWT"
}

Задача auth

В десятках сервисов возникла проблема с авторизацией в начале ” “.

“. Эта служба обеспечивает решение дилеммы, возникшей в результате ее отказа. Она помогла перенести данные пользователей во все базы данных и создать бесшовную аутентификацию во всех службах.

Три основные задачи сервиса Auth

Зачем вообще нужны токены


При разработке приложений, общающихся с сервером, обычно вылезают следующие этапы:

Аутентификация с помощью JWT-токенов | 1С:Зазеркалье

Зачем на самом деле нужен второй токен

Аутентификация с помощью JWT-токенов | 1С:Зазеркалье

Случай 2: Боб не воспользовался обновлением, потому что увидел два жетона, принадлежащие Алисе.

Боб получит токен пожизненного доступа. Когда приложение Алисы и приложения других пользователей (например, Боба) обновят токены, будут возвращены две пары токенов.

Пример 2: Боб использовал обновление после распознавания обоих токенов Алисы.

Зачем нужен второй токен

В OAuth 2 и некоторых других схемах авторизации (например,

Есть два жетона вместо одного. начальный,

Карта доступа

Зачем нужен первый токен

Аутентификация с помощью JWT-токенов | 1С:Зазеркалье

Заявления

Давайте сосредоточимся на утверждениях из сегмента полезной нагрузки токена теперь, когда мы знакомы со структурой JWT и основами утверждений. Утверждения также включают ID-токены, которые являются идентификационными данными.

Заявления аутентификации

Рассмотрите вопросы, которые будут приниматься во внимание при проверке подлинности. Комментируйте и критикуйте политические заявления.

Заявления идентичности

Заявления включают также рекомендации для пользователя. Что представляют собой такие заявления?

Изменение алгоритма подписи

При использовании асимметричных алгоритмов проверка подписи осуществляется с использованием открытого ключа службы и закрытого ключа для подписи токена.

Некоторые реализации библиотек JWT имеют логические недостатки, возникающие при получении и подписании токена с использованием симметричного алгоритма (например, для HS256 потребуется использование открытого ключа сервиса) или при проверке подписи.

Нам требуется новый JWT, чтобы продумать иллюстрацию такого нападения:

Перехват токена

Перехват пользовательского токена может иметь множество неприятных последствий.

Во-вторых, JWT хранится только для одной части полезной нагрузки и передается открытым текстом. Другими словами, информация в пределах одного домена будет доступна злоумышленнику, который перехватит токен и извлечет данные пользователя.

Лучшие практики утверждают, что для предотвращения подобной угрозы необходимо предпринять следующие действия:

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

В-третьих, хакер может украсть токен и использовать его для входа в приложение как пользователь JWT.

Здесь рекомендации следующие:

  • Как и в первом случае, секунда

Повышаем безопасность

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

Я поделюсь с вами некоторыми советами по повышению безопасности. Пожалуйста, не стесняйтесь делиться своими методами решения проблем в разделе комментариев. Я включу их в список

Подбор ключа симметричного алгоритма подписи

Если для подписания JWT используются симметричные алгоритмы (HS256, HS512 и т.д.), то незваный гость может попытаться услышать фразу ключа.

Захватив его, злоумышленник может свободно и легко манипулировать токенами JWT от имени любого зарегистрированного пользователя.

В нашем примере JWT был подписан с помощью строки пароля. Она проста, не требует разбора пароля и включает все основные словари перебора. С помощью hashcat или John the Ripper злоумышленник может быстро узнать парольную фразу.

Рекомендации для защиты от атаки в этом случае такие:

  • Использовать длинные парольные фразы, состоящие из больших и малых букв латинского алфавита, цифр и специальных символов, и хранить их в строгой конфиденциальности;
  • Следить за тем, чтобы парольная фраза периодически менялась. Это снизит удобство использования для пользователей (поскольку им придется время от времени заново проходить аутентификацию), но поможет предотвратить компрометацию ключевой информации.

Поддержка jwt-токенов в платформе

Благодаря существованию объекта TokenAccess в языке Embedded Language, разработчикам не нужно разбираться в структуре токена JWT. Его характеристики не требуют пояснений (см. примеры ниже).


Для поддержки JWT-токенов в платформе реализовано следующее:

Полезная нагрузка jwt

Полезная нагрузка – это второй сегмент токена. Если вы посмотрите на этот сегмент, он выглядит следующим образом:

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0

Утверждения о пользователе и событии аутентификации содержатся в этом объекте JSON. Например:

Полезные ссылки

  1. Зачем нужен Refresh Token, если есть Access Token?
  2. Токены обновления: когда их использовать и как они взаимодействуют с JWT
  3. Больше сюрпризов OAuth 2.0: токен обновленияЗачем нужен токен обновления, если есть токен доступа?

Права доступа

Права доступа предоставляются клиенту в виде scope. Параметр scope состоит из scope-tokens, которые представляют собой строки, разделенные пробелами.

Каждый scope-token имеет уникальные права, которые предоставляются клиенту. Например, scope-токен doc_read может предоставить доступ к документу, связанному с ресурсом. Конечная область видимости будет выглядеть следующим образом: email doc_read employee.

Токен scope-token создается O Auth 2.0 и подстраивается под ваши требования. Ваше творчество и первые два символа таблицы ASCII – единственные ограничения для имен scope-token.

При регистрации в качестве клиента в настройках службы авторизации клиенту предоставляется стандартная область действия. Однако у клиента есть возможность запросить у сервера авторизации другую область действия. Окончательный набор диапазонов может выглядеть совершенно по-разному в зависимости от политики сервера авторизации и выбранного владельца ресурса.

Преимущества jwt

По сравнению с традиционным методом аутентификации на основе сеанса, J WT обладает преимуществами.

Во-вторых, в отличие от традиционной схемы, использование токенов не требует хранения данных обо всех выданных документах. Пользователь передает свой токен приложению при каждом обращении к нему. Приложение имеет возможность проверить подпись и получить необходимые поля.

Во-вторых, токены не нужно самостоятельно регистрировать и проверять приложению.

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

В-четвертых, часть полезной нагрузки приложения может содержать практически любые данные.

По вышеупомянутым причинам аутентификация JWT часто используется в многочисленных корпоративных приложениях. Служба получает необходимую информацию непосредственно из токена и тем самым экономит время. Эта схема очень популярна в приложениях, реализующих парадигму микросервисной архитектуры.

Пример имплементации:

Front-end:

Back-end:

Проблемы


Первая версия Auth — часть монолита. Он использует свой собственный протокол общения с сервисами. Такая «схема» была необходима в тот момент, но за несколько лет работы проявились проблемы.

Auth является монолитной структурой. В результате сервис не может быть независимо разработан и развернут, поскольку он привязан к циклу выпуска. При масштабировании службы весь монолит также должен быть развернут.

Аутентификация требуется Dodo IS. В предыдущей реализации каждое действие вовлекало внешние службы, проверяющие данные пользователя. Мы можем привязываться к Auth настолько сильно, что система Dodo IS в целом может дать сбой.

Auth зависит от Redis. Если он не функционирует должным образом, сбой Redis приведет к краху Auth. Мы используем Azure Redis, который может похвастаться SLA 99,9%. В результате сервис может не работать до 44 минут каждый месяц. Такая простота недостижима.

Не полагаясь на стандарты, текущая версия Auth использует свой собственный протокол аутентификации. Если говорить о бэкенде наших сервисов, то большинство из них используют CMOS, и нам не составит труда поддержать библиотеку для нашего протокола. Но на разработку и поддержку библиотеки уйдет больше времени, если будут выпущены сервисы на Python, Go или Rust.

Контроль доступа на основе ролей используется в текущей версии Auth. Как правило, роль является компонентом функциональности сервиса, а не отдельной функцией. Например, в пиццериях есть помощники менеджеров. Они могут отвечать за составление расписания или учет сырья для конкретных проектов.

Мы решили написать новую версию Auth, потому что в самом начале проекта возникло множество проблем. Только на изучение стандартов аутентификации и авторизации OpenID Connect 1.5 и OAuth 2.0 ушло три недели.

Примечание: Чтобы понять, что происходит вокруг RFC, эта статья утрированно пересказывает RFC. Здесь я попытался отвлечь внимание читателя от этого сложного вопроса и одновременно описать возможные символы, которые может содержать ответ службы.

Проблемы, связанные с использованием токенов доступа для аутентификации

Если HireMe123 интерпретирует успешный вызов API MyCalApp, сделанный с помощью маркера доступа, как доказательство аутентификации пользователя на HireMe123. Это создает определенные трудности. Мы не можем подтвердить, получил ли конкретный человек маркер доступа.

Например:

  • Кто-то мог украсть маркер доступа другого пользователя.
  • Токен доступа мог быть взят у другого клиента (не HireMe123) и вставлен в HireMe123.

Это разногласие известно как сбитый с толку заместитель. HireMe123 не знает об источнике выдачи токена. Аутентификация – это процесс проверки того, что пользователь является тем, за кого себя выдает. Однако у HireMe123 нет причин полагаться на подлинность пользователя, учитывая, что он может использовать токены входа и пароли от API для доступа к API.

Регистрация клиента

Вы можете зарегистрировать клиента вручную или, например, через обнаружение службы.

фантазии

В конкретном приложении. Однако любой метод регистрации должен включать URI перенаправления и тип клиента в дополнение к идентификатору клиента.

Адрес, на который будет перенаправлен владелец ресурса после успешной авторизации, известен как URI перенаправления. Для проверки того, что услуга зарегистрирована на имя того или иного лица, используется адрес.

Тип клиента – Тип клиента влияет на то, как вы должны взаимодействовать с ним. Способность клиента хранить мандаты авторизации – токены – определяет его тип. Например, существует только две категории клиентов:

Токены

В OAuth 2.0 токен – это строка, к которой клиент не может получить доступ. Обычно строка выглядит сгенерированной случайным образом; клиенту не важен формат. Токен может использоваться как ключ для получения доступа к чему-либо. как, например, новый токен или токен доступа к защищенному ресурсу;

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

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

Права доступа, которые предоставляются клиенту во время авторизации, назначаются маркеру доступа. Как выглядят права доступа OAuth 2.0?

Токены доступа

Доступ к ресурсам предоставляется с помощью маркеров доступа. Доступ к API MyCalApp предоставляется HireMe123.

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

Токены доступа непрозрачны для клиента

Очень важно, чтобы маркеры доступа были скрыты от клиента, поскольку они предназначены для API ресурсов. Почему?

Токены доступа всегда подвержены изменениям. Они должны обновляться достаточно часто, чтобы пользователь получал свежие. Затем они могут быть перевыпущены с новыми полномочиями или для предоставления доступа к дополнительным API. Клиентское приложение не должно содержать никакого кода, который зависит от информации в маркере доступа. В противном случае код будет хрупким и почти наверняка разрушится.

Уязвимости jwt

В этом разделе будут рассмотрены основные атаки на JWT и предложения по их снижению.

Формат jwt

Заголовок, полезная нагрузка и подпись составляют J WT. Подпись формируется из заголовка и полезной нагрузки, которые формируются отдельно в JSON и кодируются в base64. Подпись вычисляется из связанных вместе элементов кода.

На JWT ставится печать. Альтернативная версия: Аналогичное обстоятельство обсуждалось позже.

Тип маркера, в данном случае JWT, указан в тексте.

{
  "typ": "JWT",
  "alg": "HS256"
}

Приложения могут игнорировать его, но стандарт не рекомендует это делать.

Поле alg должно быть заполнено. Был применен алгоритм HMAC-SHA256, который в данном случае использует один секретный ключ для проверки подписи.

Для подписей JWT могут использоваться алгоритмы асимметричного шифрования. Кроме того, стандарт допускает использование других алгоритмов, таких как RS512, S256, и ни одного.

Токен не был подписан, на что указывает элемент none. Токен без компонента подписи не может быть проверен.

Закодируем этот JSON в base64 и получим: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Итоги

Хотя мы рассмотрели много вопросов, мы даже не поцарапали поверхность. Однако я надеюсь, что вам будет полезно пройти этот краткий курс по аутентификации и авторизации.

В заключение

Используя эту стратегию, мы уменьшаем задержку серверов и значительно упрощаем вычислительную логику. Это имеет короткое окно использования с точки зрения безопасности.

Злоумышленнику также потребуется украсть обновление, чтобы использовать больше. При повторном входе в систему такой пользователь получает обновленную пару JWT RT, а также свежие украденные.

Вместо вывода


В этой статье я опустил много подробностей, чтобы максимально просто и доступно рассказать о самом важном. Например, типы запросов, как и в каком виде передавать параметры, какие символы допустимы в качестве значений для того. 

Для получения дополнительной информации об OAuth 2.0 и Device Flow я рекомендую прочитать RFC 6749 (для OAuth 1.0). Обновления RFC можно также найти на сайте OAuth.

Если вы нашли эту статью полезной, оставьте, пожалуйста, комментарий.

Полезные ссылки:

Похожее:  Что такое двойная защита? Как её включить?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *