Predix微服務架構下的用戶對微服務權限控制實踐

作者: 周睿| 軟件工程師 |GE數字集團

微服務架構是當下最流行的架構設計思想之一,其優勢是服務解耦,單個服務靈活擴展等等。軟件行業有句俗話–”沒有銀彈”,一個架構或者技術在解決一些問題的時候,必然也會帶來一些問題,其中問題之一就是如何控制用戶對微服務,微服務和微服務之間的訪問權限控制。

Predix自身藉助於Cloud Foundry,已內置了一個強大的OAuth2認證服務UAA。藉助UAA,在Predix上就可以方便的解決微服務架構下的權限控制問題。

首先,訪問控制的設計場景是:
1. 用戶並不可以訪問所有的微服務,而是根據收費策略或業務要求而定,部分可訪問,部分不可訪問,並且可以及時的修改控制。
2. 服務和服務之間的請求使用用戶的身份,而並非服務的身份,方便進行操作記錄審計,避免發生提權漏洞的發生。

爲了滿足這些場景,我們可以使用UAA產生的Token機制來輕鬆的實現一個靈活的用戶對微服務的權限控制策略。

舉個例子,假設我們有:
- 入口微服務: service0
- 後端微服務: service1, service2, service3

用戶:
- user1
- user2

user1和user2都通過service0作爲訪問入口。user1可以訪問service1, user2可以訪問service2。service1和service2都會分別以user1, user2的身份訪問service3。

在UAA中,首先,爲入口服務創建一個client_id和client_secret,用於用戶OAuth登錄,獲取Token:
- client_id0: secret

然後爲每一個服務創建一個用戶組:
- group_service0
- group_service1
- group_service2
- group_service3

爲client_id0配置上scope和authorize: group_service0, group_service1, group_service2, group_service3。

把user1添加到group_service0, group_service1, group_service3中,
把user2添加到group_service0, group_service2, group_service3中。

service0負責和UAA服務完成OAuth過程,獲取到User Token和Refresh Token。然後service0向service1, service2發送的所有請求,都把兩個Token帶在HTTP Header中。service1和service2向service3發送的請求中也要帶着兩個Token。User Token用於權限檢查,但是因爲User Token有失效時間,如果要在後臺配置定時或長時間執行的任務,就需要Refresh Token在過期以後換取新的User Token。

每個微服務在接收到請求時,都讀取HTTP Header中的token,並向UAA驗證Token是否合法,然後分別檢查Token中的信息。
service1在接收到請求時,檢查scope中包含自己需要的group: group_service1,如果存在,就接受這個請求,如果不存在,就駁回請求。
service2在接收到請求時,檢查scope中包含自己需要的group: group_service2,如果存在,就接受這個請求,如果不存在,就駁回請求。
service3在接收到請求時,檢查scope中包含自己需要的group: group_service3,如果存在,就接受這個請求,如果不存在,就駁回請求。

User1的User Token裏包含scope: group_service1, group_service3, 所以可以訪問service1, service3, 不可以訪問service2。
User2的User Token中包含scope: group_service2, group_service3,所以可以訪問service2, service3,不可以訪問service1。

以上例子就是如何用UAA中的User Token,client和group來解決微服務架構下,用戶對微服務權限控制的簡便方法。其優點是:

  1. 每個微服務只要檢查自己需要的scope就可以了,當一個請求會觸發請求另一個微服務時,也不需要關心用戶是否有另一個微服務的權限,只要把原始請求的User Token傳遞下去, 處理邏輯比較簡單明瞭。
  2. 入口服務service0不需要存儲和處理用戶對微服務的權限,只需要把獲取的Token原封不動的傳遞下去,把用戶權限的配置信息統一保存在UAA中。
  3. 整個流程不需要複雜的代碼實現,僅僅利用了OAuth Token自身的機制。
  4. 各個服務可以通過User Token很容易的進行用戶操作審計。
  5. 用戶對微服務的權限可以根據收費策略或業務要求進行靈活調整。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章