簡體   English   中英

使用 Spring Security 保護 REST 微服務

[英]Securing REST microservices with Spring Security

我正在尋找一種最佳實踐和高效的解決方案來保護通過 REST 與 Web 客戶端應用程序通信的多個微服務。

當前設置

這些微服務是用 Java 制作的,使用 Spring 框架並運行到 Docker 容器中。

客戶端是一個 Angular 2 應用程序。

我創建了一個新的 µService,它將充當“網關”,並且是我的 Web 客戶端和我的其他服務之間的唯一通信點。

我從遠程身份驗證 API 檢索 JWT 加密令牌(我們稱之為 LOCK)

我正在考慮的解決方案

在此處輸入圖片說明

我可以將登錄 JWT 存儲到 cookie 中,然后將其發送到網關。

網關將令牌嵌入到發送給相關 µService 的最終有效載荷中,並將用戶(如果用戶是新用戶)存儲到數據庫中。

然后微服務獲取查詢,在遠程身份驗證服務中檢查用戶角色,如果足夠,則返回 200 狀態和結果。

編輯

我們需要在 µServices hive 中安裝一個 RabbitMQ Broker,從而使用 WebSockets。 為了以與保護 REST API 相同的方式保護 WebSockets,我不確定我們是否仍然應該在網關中管理安全性,或者在微服務級別單獨管理它。 因為會傳輸大量消息,我們也許應該擺脫會減慢傳輸速度的中間件。

問題

這是一個好習慣嗎? 什么可以做得更好? 你有什么例子可以滿足相同的需求嗎? 非常感謝您的分享和想法。

我建議你看看Dave Sayer關於這個主題的精彩網絡研討會。 他建議了幾種可能的選擇,從Spring會話到OAuth2。

您可以在此處找到網絡研討會: https//spring.io/blog/2014/11/07/webinar-replay-security-for-microservices-with-spring-and-oauth2

還有一個代碼示例的教程,但我現在找不到它。

我會通過以下方式做到這一點:

考慮到每個微服務都在 apigateway 后面,即使是身份驗證/授權微服務 -> 讓我們簡單地稱之為auth

一旦請求到來,apigateway 就會檢查 auth 服務,auth 服務會做它需要的事情來驗證令牌和請求者是否合法,並用 200/401(/403) 響應 apigateway。

如果 apigw 得到 200,它會將請求轉發到該端點上的任何微服務,否則返回其他狀態。

如果我們考慮這種情況,並且它是通過 apigateway 進入您環境的唯一入口點,我認為您沒有任何理由保護其他服務之間的通信。

讓我們考慮這個場景:

client -> calls POST /api/v1/cars

  1. 在客戶端和 apigw 之間我們有一個安全調用,因為顯然我們將使用證書......因此客戶端將調用https://..../api/v1/cars
  2. 請求到達 apigw,它解密請求
  3. 得到 jtw
  4. 詢問 auth -> 這個返回 200
  5. 將請求轉發給CarsMicroservice
  6. Cars 微服務信任該請求,因為它知道其他人已經進行了 JTW 簽名解密,因此可以安全地假設其中的任何信息都是合法的
  7. 如果carsMicroservice需要一些用戶特定的信息,例如這是一個創建新車的帖子,出於某種原因而不是使用JWT令牌中的subject字段,即用戶的uuid,我們需要一個用戶名->汽車關聯當請求到達carsMicroservice時,它會對payload進行DECODE ,獲取用戶uid,要求userMicroservice返回該用戶的所有信息。 這種通信不需要是安全的,因為它是在所有必要的安全檢查之后在內部完成的。

當然,您可以強制執行此操作,即用戶可以訪問的唯一用戶信息是他自己的等,但這些是自定義啟發式的。

此外,您可能必須在微服務之間建立信任。 您可以使用以下組合:

  • 使用 LDAP/OAuth2 令牌
  • 使用 IP 白名單
  • CORS 規則
  • HTTPS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM