Авторизация в микросервисной архитектуре: от токенов до политик доступа

Представьте, что вы построили город из сотен маленьких, умных домов – микросервисов. Каждый дом выполняет свою функцию: один готовит еду, другой следит за отоплением, третий охраняет ворота. Но как сделать так, чтобы жилец из кухни не мог самовольно менять настройки системы безопасности? Как дать почтальону доступ только к почтовому ящику, а не во все комнаты? В этом и есть суть авторизации в распределенной системе – решать, кто, что и при каких условиях может делать.

Почему старые правила здесь не работают

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

Основа основ: токены вместо паролей

Ключевую роль здесь играют токены, чаще всего в формате JWT (JSON Web Tokens). Это цифровой пропуск, который сервис выдает пользователю после успешной аутентификации. Внутри него в зашифрованном виде хранятся данные (claims) о пользователе: его идентификатор, роли, скоуп (scope – область допустимых действий). Когда пользователь через API Gateway (единую точку входа) обращается к какому-либо сервису, он просто предъявляет этот токен.

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

OAuth2 и OIDC: протоколы для сложного мира

Но кто выдает эти токены и как они попадают от одного сервиса к другому? Здесь на сцену выходят протоколы OAuth2 и OIDC (OpenID Connect).

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

OIDC расширяет OAuth2, добавляя стандартизированную информацию о пользователе (идентичность). Именно он чаще выступает в роли Identity Provider (IdP) – единого центра аутентификации. Вы логинитесь один раз у IdP, получаете набор токенов (access_token, id_token), и с ними ходите по всем сервисам. Это и есть федеративная идентификация.

Где и как применять политики доступа

Сами политики доступа – это правила, написанные на специальном языке (например, Rego для Open Policy Agent). Они отвечают на вопрос «Разрешено ли действие X для пользователя Y над ресурсом Z?». И применять их можно на разных уровнях:

  • На уровне API Gateway: Это первый рубеж обороны. Здесь можно отфильтровать очевидные нарушения: проверить наличие токена, его базовую валидность и наличие минимально необходимого скоупа для вызова группы сервисов. Быстро и эффективно отсекает массу некорректных запросов.
  • Внутри каждого микросервиса: Это самый тонкий и важный уровень. Сервис, получив JWT-токен и извлекая из него контекст безопасности (роли, права, атрибуты), сверяет его со своими внутренними политиками. Например, сервис «Заказы» проверяет, может ли пользователь с ролью «менеджер» просматривать заказы только своего филиала, а не всех.
  • Через выделенный сервис авторизации: В очень сложных системах политики выносят в отдельный специализированный микросервис. Все остальные сервисы при каждом запросе спрашивают у него: «Можно ли?». Это централизует логику управления, но создает зависимость и потенциальную точку отказа.
  • С помощью Service Mesh: В продвинутых архитектурах сервис-меш (например, Istio) позволяет декларативно настраивать политики доступа между сервисами на уровне сетевого трафика. Вы можете задать правила вида «сервису А разрешено вызывать только методы GET сервиса Б», не трогая код самих сервисов.

Антипример: что будет, если этого не делать

Допустим, вы просто передаете идентификатор пользователя между сервисами, полагаясь на их «честность». Сервис «Отзывы» получает запрос на удаление отзыва с ID=123. Он проверяет, принадлежит ли этот отзыв пользователю с ID=456. Но кто гарантировал, что этот ID=456 – подлинный? Предыдущий сервис мог подменить его. Без криптографически подписанного токена с мандатами пользователя вы строите безопасность на песке.

Постройте свою защиту слоями. Используйте API Gateway с поддержкой OAuth2/OIDC как единый фасад для входа. Наделите каждый микросервис способностью самостоятельно проверять JWT-токены и оценивать встроенные в них claims против своих локальных политик. Для сложных межсервисных сценариев используйте обмен токенами по OAuth2. И помните: в распределенной системе безопасность – это не стена, а проверка документов на каждом пропускном пункте. Надежные документы (токены) и четкие инструкции для охраны (политики) не дадут вашему цифровому городу погрузиться в хаос.

➤