Стратегия микросервисной аутентификации


138

Мне трудно выбрать подходящую / безопасную стратегию аутентификации для микросервисной архитектуры. Единственный пост SO, который я нашел по этой теме, это: Единый вход в микросервисной архитектуре.

Моя идея здесь состоит в том, чтобы иметь в каждой службе (например, аутентификация, обмен сообщениями, уведомление, профиль и т. Д.) Уникальную ссылку на каждого пользователя (вполне логично, тогда его user_id) и возможность получить текущего пользователя, idесли он вошел в систему.

Из моих исследований я вижу две возможные стратегии:

1. Общая архитектура

Общая архитектура

В этой стратегии приложение аутентификации является одним из сервисов среди других. Но каждый сервис должен иметь возможность сделать преобразование session_id=>, user_idпоэтому он должен быть очень простым. Вот почему я подумал о Redis, что бы хранить ключ: значение session_id:user_id.

2. Архитектура брандмауэра

Архитектура брандмауэра

В этой стратегии хранилище сеансов на самом деле не имеет значения, так как оно обрабатывается только приложением для аутентификации. Затем они user_idмогут быть перенаправлены в другие службы. Я думал о Rails + Devise (+ Redis или mem-cached, или о хранилище файлов cookie и т. Д.), Но есть масса возможностей. Единственное, что имеет значение, это то, что Service X никогда не понадобится аутентифицировать пользователя.


Как эти два решения сравниваются с точки зрения:

  • безопасность
  • прочность
  • масштабируемость
  • простота использования

Или, может быть, вы предложите другое решение, которое я здесь не упомянул?

Мне больше нравится решение №1, но я не нашел особой реализации по умолчанию, которая гарантировала бы мне, что я иду в правильном направлении.

Я надеюсь, что мой вопрос не закрывается. Я действительно не знаю, где еще спросить это.

заранее спасибо


1
Не могли бы вы рассказать подробнее о том, чего вы пытаетесь достичь? В первом случае аутентификация происходит в Redis или в самих сервисах? Redis отсутствует на второй диаграмме, это намеренно?
Пламен Петров

Я добавил некоторую информацию. Пожалуйста, дайте мне знать, это все еще неясно. Спасибо!
Августин Ридингер

Задумывались ли вы над идеей создания микросервиса, использующего протокол OAuth, и созданного токеном службы других пользователей?
Тиаре Балби

Мне интересно это решение, но я все еще не понимаю, как оно будет работать на практике. Вы знаете, где я мог бы найти некоторые стандартные реализации этого?
Августин Ридингер

@AugustinRiedinger, спасибо, что подняли это. Я также разбиваю свое монолитное веб-приложение на микросервисы, делая шаги для ребенка. В вашем случае Сервисы 1-n не имеют состояния или не имеют состояния. Если они заполнены состоянием, задумывались ли вы об управлении сессиями в каждой из этих служб. Спасибо
Манчанда. P

Ответы:


61

Исходя из того, что я понимаю, хорошим способом решения является использование протокола OAuth 2 (вы можете найти немного больше информации об этом на http://oauth.net/2/ )

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

Модель OAuth 2

Пример цепного микросервисного проектирования Архитектурная модель

Ресурсы:


1
Спасибо, это довольно ясно. Я обнаружил, что эта очень хорошая статья разлагает почти то же самое решение: dejanglozic.com/2014/10/07/…
Августин Ридингер

16
Ваш ответ великолепен, но каким образом токен, сгенерированный из шлюза API (изнутри или в AuthMicroService), может обрабатываться случайным микросервисом, целью которого не является проверка подлинности, и, вероятно, нет управления oauth внутри его деловой код?
mfrachet

Например, вы можете использовать Netflix Zuul для отправки токена, полученного в шлюзе, всем службам, и они будут знать информацию о пользователе. docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…
Тиаре Балби

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

2
OAuth больше относится к предоставлению системного доступа к данным пользователя, хранящимся в другой системе. Для меня это выглядит как хороший случай для SAML.
Роб Грант

8

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

  1. аутентифицироваться по ID провайдера
  2. сохранить токен доступа в cookie
  3. получить доступ к страницам в веб-приложении
  4. позвонить в службы

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

введите описание изображения здесь


Разве AWS Lambda не становится «холодной» и требует времени для запуска? Это замедлит вход в систему, не так ли?
tsuz 03

@tsuz, AWS теперь представила функцию параллелизма в лямбда, где вы можете зарезервировать параллелизм. Этим вы можете решить проблему холодного запуска. docs.aws.amazon.com/lambda/latest/dg/…
Сандип Наир

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

@Sandeep, я думаю, вы имеете в виду подготовленный параллелизм, а не зарезервированный.
Анил Кумар

0

Шаблон API-шлюза должен использоваться для реализации этого с использованием OpenID Connect. Пользователь будет аутентифицирован IDP и получит токен JWT с сервера авторизации. Теперь система шлюза API может сохранять этот токен в базе данных Redis и устанавливать cookie в браузере. API-шлюз будет использовать куки-файл для проверки запроса пользователя и отправит токен на микросервисы.

API Gateway выступает в качестве единой точки входа для всех типов клиентских приложений, таких как общедоступное клиентское приложение java-скрипта, традиционное веб-приложение, собственное мобильное приложение и сторонние клиентские приложения в архитектуре Microservice.

Вы можете найти более подробную информацию об этом на http://proficientblog.com/microservices-security/


-2

вы можете использовать idenitty server 4 для аутентификации и авторизации

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.