Chiến lược xác thực microservice


138

Tôi đang gặp khó khăn trong việc lựa chọn chiến lược xác thực hợp lý / an toàn cho kiến ​​trúc microservice. Bài đăng SO duy nhất tôi tìm thấy về chủ đề này là bài này: Đăng nhập một lần trong Kiến trúc microservice

Ý tưởng của tôi ở đây là có trong mỗi dịch vụ (ví dụ: xác thực, nhắn tin, thông báo, hồ sơ, v.v.) một tham chiếu duy nhất cho mỗi người dùng (khá logic sau đó là của anh ta user_id) và khả năng có được người dùng hiện tại idnếu đăng nhập.

Từ các nghiên cứu của tôi, tôi thấy có hai chiến lược khả thi:

1. Kiến trúc dùng chung

Kiến trúc dùng chung

Trong chiến lược này, ứng dụng xác thực là một dịch vụ khác. Nhưng mỗi dịch vụ phải có khả năng thực hiện chuyển đổi session_id=>user_id vì vậy nó phải đơn giản. Đó là lý do tại sao tôi nghĩ về Redis, sẽ lưu trữ khóa: giá trị session_id:user_id.

2. Kiến trúc tường lửa

Kiến trúc tường lửa

Trong chiến lược này, lưu trữ phiên không thực sự quan trọng, vì nó chỉ được xử lý bởi ứng dụng xác thực. Sau đóuser_id có thể được chuyển tiếp đến các dịch vụ khác. Tôi đã nghĩ về Rails + Devise (+ Redis hoặc mem-cacheed, hoặc lưu trữ cookie, v.v.) nhưng có rất nhiều khả năng. Điều duy nhất quan trọng là Service X sẽ không bao giờ cần xác thực người dùng.


Làm thế nào để hai giải pháp so sánh về:

  • Bảo vệ
  • sự mạnh mẽ
  • khả năng mở rộng
  • dễ sử dụng

Hoặc có thể bạn sẽ đề xuất một giải pháp khác mà tôi chưa đề cập ở đây?

Tôi thích giải pháp số 1 tốt hơn nhưng chưa tìm thấy nhiều triển khai mặc định sẽ bảo đảm cho tôi trong thực tế là tôi đang đi đúng hướng.

Tôi hy vọng câu hỏi của tôi không bị đóng cửa. Tôi thực sự không biết nơi nào khác để hỏi nó.

Cảm ơn trước


1
Bạn có vui lòng thông báo chi tiết hơn về những gì bạn đang cố gắng để đạt được? Trong trường hợp đầu tiên, xác thực có xảy ra với Redis hay trong chính các dịch vụ không? Redis bị thiếu trong sơ đồ thứ hai, đây có phải là chủ ý?
Plamen Petrov

Tôi đã thêm một số thông tin. Xin vui lòng cho tôi biết nó vẫn chưa rõ ràng. Cảm ơn!
Augustin Riedinger

Bạn có nghĩ về ý tưởng tạo ra một dịch vụ siêu nhỏ sử dụng Giao thức OAuth và dịch vụ khác của bạn sử dụng Mã thông báo được tạo không?
Tiarê Balbi

Tôi tò mò về giải pháp này, nhưng tôi vẫn không hiểu nó sẽ hoạt động như thế nào trong thực tế. Bạn có biết nơi tôi có thể tìm thấy một số triển khai tiêu chuẩn của nó?
Augustin Riedinger

@AugustinRiedinger, cảm ơn vì đã đưa nó lên. Tôi cũng đang phá vỡ ứng dụng web nguyên khối của mình thành các dịch vụ vi mô bằng cách thực hiện các bước bé. Trong trường hợp của bạn, là các Dịch vụ 1-n không trạng thái hoặc đầy đủ trạng thái. Trong trường hợp chúng có đầy đủ trạng thái, bạn có nghĩ đến việc quản lý phiên trong mỗi dịch vụ này không. Cảm ơn
Manchanda. P

Câu trả lời:


61

Dựa trên những gì tôi hiểu, một cách tốt để giải quyết nó là sử dụng giao thức OAuth 2 (bạn có thể tìm thêm một chút thông tin về nó trên http://oauth.net/2/ )

Khi người dùng của bạn đăng nhập vào ứng dụng của bạn, họ sẽ nhận được mã thông báo và với mã thông báo này, họ sẽ có thể gửi đến các dịch vụ khác để xác định chúng trong yêu cầu.

Mô hình OAuth 2

Ví dụ về thiết kế dịch vụ xích Mô hình kiến ​​trúc

Tài nguyên:


1
Cảm ơn nó là khá rõ ràng. Tôi thấy bài viết rất hay này phân tích khá nhiều giải pháp tương tự: dejanglozic.com/2014/10/07/ Lời
Augustin Riedinger

16
Câu trả lời của bạn rất hay, nhưng làm thế nào để mã thông báo được tạo từ Cổng API (từ bên trong nó hoặc trong AuthMicroService) có thể được xử lý bởi một dịch vụ siêu nhỏ ngẫu nhiên, mà mục tiêu không phải là xác thực và có thể không có quản lý oauth bên trong Mã doanh nghiệp của anh ấy?
mfrachet

Ví dụ: bạn có thể sử dụng Netflix Zuul để gửi mã thông báo nhận được trong cổng tới tất cả các dịch vụ và họ sẽ biết thông tin người dùng. docs.spring.io/spring-boot/docs/civerse/reference/htmlsingle/
Tiarê Balbi 22/2/2016

Một điều thú vị khác khi sử dụng OAuth2 giữa các dịch vụ là bạn có thể có các điểm cuối phân biệt giữa các hành động xác thực dịch vụ và xác thực người dùng.
cmp

2
OAuth liên quan nhiều hơn đến việc cấp quyền truy cập hệ thống cho dữ liệu của người dùng được giữ trong một hệ thống khác. Điều này với tôi có vẻ như là một trường hợp tốt cho SAML.
Rob Grant

8

Câu trả lời ngắn: Sử dụng xác thực dựa trên mã thông báo loại Oauth2.0, có thể được sử dụng trong bất kỳ loại ứng dụng nào như ứng dụng web hoặc ứng dụng di động. Trình tự các bước liên quan đến một ứng dụng web sẽ là

  1. xác thực với nhà cung cấp ID
  2. giữ mã thông báo truy cập trong cookie
  3. truy cập các trang trong webapp
  4. gọi các dịch vụ

Sơ đồ dưới đây mô tả các thành phần cần thiết. Một kiến ​​trúc như vậy tách biệt web và apis dữ liệu sẽ cho khả năng mở rộng, khả năng phục hồi và ổn định tốt

nhập mô tả hình ảnh ở đây


Không AWS Lambda trở nên "lạnh" và mất thời gian để khởi động? Điều đó sẽ làm cho đăng nhập chậm, phải không?
tsuz

@tsuz, AWS hiện đã giới thiệu tính năng tương tranh trong lambda nơi bạn có thể bảo lưu đồng thời. Với điều này, bạn có thể khắc phục vấn đề bắt đầu lạnh. docs.aws.amazon.com/lambda/latest/dg/ từ
Sandeep Nair

Tôi rất muốn thấy câu trả lời này từ nhiều năm trước, thật đơn giản để hiểu cách kiến ​​trúc microservice với các dịch vụ
micros

@Sandeep, tôi nghĩ rằng bạn đang đề cập đến đồng thời được cung cấp và không được bảo lưu.
Anil Kumar

0

Mẫu cổng API nên được sử dụng để triển khai điều này bằng OpenID Connect. Người dùng sẽ được IDP xác thực và sẽ nhận được mã thông báo JWT từ máy chủ ủy quyền. Bây giờ hệ thống cổng API có thể lưu trữ mã thông báo này trong cơ sở dữ liệu Redis và đặt cookie trên trình duyệt. API gateway sẽ sử dụng cookie để xác thực yêu cầu của người dùng và sẽ gửi mã thông báo đến microservice.

API Gateway hoạt động như một điểm vào duy nhất cho tất cả các loại ứng dụng khách như ứng dụng khách java script công khai, ứng dụng web truyền thống, ứng dụng di động gốc và ứng dụng khách của bên thứ ba trong kiến ​​trúc microservice.

Bạn có thể tìm thêm chi tiết về nó trên http://proficientblog.com/microservice-security/


-2

bạn có thể sử dụng máy chủ idenitty 4 cho mục đích xác thực và ủy quyền

bạn phải sử dụng Kiến trúc tường lửa do đó bạn có nhiều quyền kiểm soát hơn về tính bí mật, mạnh mẽ, khả năng mở rộng và dễ sử dụng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.