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


138

Мені важко вибирати гідну / безпечну стратегію аутентифікації для архітектури мікросервісу. Єдине повідомлення про те, що я знайшов у цій темі, це: Єдиний вхід у архітектуру мікросервісів

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

З моїх досліджень я бачу дві можливі стратегії:

1. Спільна архітектура

Спільна архітектура

У цій стратегії додаток для аутентифікації є однією з інших послуг. Але кожен сервіс повинен бути в змозі зробити перетворення session_id=> user_idтому він повинен бути мертвим простим. Ось чому я подумав про Redis, який би зберігав ключ: value session_id:user_id.

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

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

У цій стратегії зберігання сеансу насправді не має значення, оскільки ним керує лише програма аутентифікації. Тоді user_idбалон можна переадресувати на інші служби. Я подумав про Rails + Devise (+ Redis або mem-cached, або зберігання файлів cookie тощо), але є багато можливостей. Важливо лише те, що Service X ніколи не потребуватиме автентифікацію користувача.


Як порівняти ці два рішення щодо:

  • безпека
  • стійкість
  • масштабованість
  • простота використання

А може, ви запропонуєте інше рішення, про яке я тут не згадував?

Мені подобається рішення №1 краще, але я не знайшов особливої ​​реалізації за замовчуванням, який би забезпечив мене тим, що я йду в правильному напрямку.

Я сподіваюся, що моє питання не закриється. Я не знаю, де ще це запитати.

Спасибі заздалегідь


1
Чи не хотіли б ви вказати більше деталей щодо того, що ви намагаєтесь досягти? У першому випадку чи відбувається автентифікація щодо Redis, або в самих службах? Redis відсутній у другій схемі, це навмисно?
Пламен Петров

Я додав деяку інформацію. Будь ласка, дайте мені знати, що це все ще незрозуміло. Дякую!
Августин Рідінгер

Чи замислювалися ви над ідеєю створити мікросервіс, який використовує протокол OAuth та службу вашого іншого, використовує створений Token?
Тіаре Бальбі

Мені цікаво це рішення, але я досі не розумію, як це буде працювати на практиці. Чи знаєте ви, де я міг би знайти деякі стандартні його реалізації?
Августин Рідінгер

@AugustinRiedinger, дякую за це Я також розбиваю свою монолітну веб-програму на мікросервіси, роблячи кроки дитини. У вашому випадку, чи є Служби 1-n без громадянства або штатні. Якщо ви повноцінні, чи задумалися ви про управління сеансами в кожній із цих служб. Спасибі
Манчанда. П

Відповіді:


61

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

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

Модель OAuth 2

Приклад дизайну ланцюга мікросервісу Модель архітектури

Ресурси:


1
Спасибі це досить зрозуміло. Мені здалося, що
Августин Рідінгер,

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

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

Ще одна приємна річ у використанні OAuth2 між сервісами - це те, що у вас можуть бути кінцеві точки, які розрізняють дії з аутентифікацією сервісу та аутентифікацією користувача
cmp

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

8

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

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

На схемі нижче зображені компоненти, які були б необхідні. Така архітектура, що розділяє Інтернет та apis даних, дасть хорошу масштабованість, стійкість та стабільність

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


Хіба AWS Lambda не стає «холодною» і потрібен час для запуску? Це зробило б вхід повільним, чи не так?
tsuz

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

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

@Sandeep, я думаю, ви маєте на увазі Забезпечену одночасність і не зарезервовано.
Аніл Кумар

0

Для його реалізації слід використовувати схему шлюзу API, використовуючи OpenID Connect. Користувач отримає автентифікацію IDP та отримає маркер JWT від сервера авторизації. Тепер система шлюзу API може зберігати цей маркер у базі даних Redis та встановлювати файли cookie у браузері. Шлюз API використовуватиме файли cookie для підтвердження запиту користувача та надсилатиме маркер до мікросервісів.

Шлюз API є єдиною точкою входу для всіх типів клієнтських додатків, таких як загальнодоступний клієнтський сценарій Java, традиційний веб-додаток, нативний мобільний додаток та сторонні клієнтські програми в архітектурі мікросервісу.

Більш детальну інформацію про нього можна знайти на http://proficientblog.com/microservices-security/


-2

ви можете використовувати сервер idenitty 4 для автентифікації та авторизації

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.