從五個方面入手,保障微服務應用安全
隨著計算機、網際網路技術的飛速發展,資訊保安已然是一個全民關心的問題,也是各大企業非常重視的問題。企業一般會從多個層次著手保障資訊保安,如:物理安全、網路安全、系統安全(主機和作業系統)、應用安全等。
名詞 | 解釋說明 |
---|---|
應用 | 即應用程式,本文中特指一個微服務應用 |
業務系統 | 即傳統意義上的軟體系統,如:OA辦公系統、個貸系統等。微服務架構中,業務系統不是個業務邏輯概念,一個業務系統由一個或多個應用(微服務)組成。 |
閘道器 | 即API Gateway 是客戶端訪問應用的入口,後端應用的API門戶。通常負責身份認證、API管理、路由、編排等等 |
服務 | 即API,特指程式介面 ,如服務呼叫 即為 API呼叫。需注意在本文中不要與微服務、應用等概念混淆 |
認證管理系統 | 認證管理系統(IAM),負責身份識別和訪問管理,其核心業務是應用系統的訪問者的註冊、賬號密碼憑證、訪問者基本資訊的管理和對已註冊的訪問者進行合法性認證和訪問授權。 |
授權服務 | 指身份認證授權服務,在微服務架構中,通常是認證管理系統(IAM)的一個應用。認證中心具備讀取"訪問者"身份資訊的許可權。負責核實"訪問者"的身份、為訪問者頒發授權碼、訪問令牌等能力 |
訪問者 | 在安全領域統稱" Principal",指應用程式功能UI或API的使用者,包含兩類:1,基於登入的客戶端 2,API 客戶端 |
API客戶端 | API Client 即客戶端程式型別的訪問者,這類客戶端自身具備部分API的訪問許可權,不需要使用者授予其訪問許可權。 |
基於登入的客戶端 | Login-based Client ,使用者訪問服務提供者的應用程式的功能時,需要透過一個客戶端互動介面來與服務提供者互動,使用者需要先登入,然後由客戶端代表使用者身份去訪問服務提供者應用程式。 |
微服務架構中安全訪問相關的簡化版的執行檢視如下:
圖中星號 *標註的位置就是服務呼叫過程中安全訪問過程中的一些需要認證鑑權的關鍵位置,如:內外部訪問認證、令牌驗證與授權、內外網通訊協議等。後續章節將對這部分展開分析。
1.身份認證
-
基於使用者登入的客戶端(Login-based Client):使用者訪問服務提供者的應用程式的功能時,需要透過一個客戶端互動介面來與服務提供者互動,使用者需要先登入,然後由客戶端代表使用者身份去訪問服務提供者應用程式。
-
API 客戶端(API Client):客戶端程式型別的訪問者,這類客戶端自身具備部分API的訪問許可權,不需要使用者授予其訪問許可權。
-
資源所有者
能夠許可對受保護資源的訪問許可權的實體。當資源所有者是個人時,它被稱為終端使用者。
-
資源伺服器
託管受保護資源的伺服器,能夠接收和響應使用訪問令牌對受保護資源的請求。
-
客戶端
使用資源所有者的授權代表資源所有者發起對受保護資源的請求的應用程式。術語“客戶端”並非特指任何特定的的實現特點(例如:應用程式是否是在伺服器、桌上型電腦或其他裝置上執行)。
-
授權伺服器
在成功驗證資源所有者且獲得授權後頒發訪問令牌給客戶端的伺服器。
-
對於前面提到的API 客戶端,自身具備API訪問權,不需要使用者授權,因此在OAuth角色對應時,它 既是客戶端又是資源所有者。
-
微服務架構中Web應用一般採用前後端分離的模式,前端為基於瀏覽器訪問的純前端應用,閘道器作為應用程式的入口,此時 閘道器本身可以代表OAuth中的客戶端身份訪問服務提供端應用的功能介面。
-
在微服務架構中,負責頒發訪問令牌的授權服務通常在IAM系統中實現
-
資源伺服器,在微服務架構中,所有的業務系統中的服務功能提供者都是資源伺服器,也包括IAM系統的賬號、組織機構服務、資源許可權管理服務等等
-
(A) API客戶端與授權伺服器IAM進行身份驗證並請求訪問令牌。
-
(B) 授權伺服器IAM對API客戶端進行身份驗證,如果有效,頒發訪問令牌。客戶端儲存訪問令牌,在後 續的請求過程中使用。如果令牌過期或失效或需要重複此流程再次申請訪問令牌。
-
此類應用通常不具備與使用者互動的UI,無需使用者授權,具備保證客戶端憑證安全的能力
-
此類應用後端需要具備透過https訪問授權伺服器的能力
-
此類應用或裝置需要具備儲存Access Token的能力
2.2 基於登入的客戶端作為訪問者,使用授權碼許可
本場景以微服務架構中常見的前後端分離Web應用作為示例,前端是單頁應用,閘道器作為Web後臺是服務提供端應用功能入口,也可作為OAuth2.0的客戶端,讓前端Web應用能借助閘道器實現授權碼交換。因此在微服務架構中,即便是純前端單頁應用類的Web應用,仍可以用基於閘道器互動的授權碼模式獲取訪問令牌。其他非前後端分離的混合Web應用自身就是客戶端,不需要藉助閘道器交換訪問令牌。
-
(A) 閘道器透過引導瀏覽器開始流程授權流程,重定向到統一認證中心的登入頁面。
-
(B)使用者輸入密碼登入,授權伺服器驗證使用者身份,並確認使用者是否授權閘道器的訪問請求。
-
(C)使用者授權後,認證中心根據之前閘道器注冊時提供的回撥地址,引導瀏覽器重定向回到閘道器。重定向URI包含授權碼
-
(D)閘道器透過包含上一步中收到的授權碼和閘道器自身憑證從授權伺服器IAM的請求訪問令牌。
-
(E)授權伺服器IAM對閘道器進行身份驗證,驗證授權程式碼,並確保接收的重定向URI與閘道器注冊時的URI相匹配。匹配成功後,授權伺服器IAM響應返回訪問令牌與可選的重新整理令牌給閘道器。
-
為了前端會話保持,訪問令牌由閘道器在響應時返回到前端,儲存到前端儲存空間,如Cookie、Local Storage、Session Storage等。
-
訪問令牌失效後,閘道器根據自己的客戶端憑證+重新整理令牌一起傳送授權伺服器,獲取新的訪問令牌和重新整理令牌,並再返回響應中將訪問令牌寫入到使用者瀏覽器的儲存中。
-
授權碼模式中,使用者的憑證(使用者名稱、密碼)是使用者透過瀏覽器與授權服務互動,並不經過閘道器, 安全性最好。
-
模擬web端,使用移動端瀏覽器與WebView
-
使用URI scheme與Intent在應用間跳轉
-
重定向過程中的回撥URL引數,容易被惡意App佔用URL Scheme或者監聽localhost埠擷取。
-
執行環境不可靠,移動App不具備安全儲存客戶端秘鑰的能力,而使用授權碼獲取訪問令牌時需要校驗客戶端秘鑰。
-
(A) 移動App客戶端建立並儲存名為code_verifier的隨機秘鑰串,並將秘鑰字串加密轉換的結果t(code_verifier)稱為code_challenge,將轉換後的code_challenge以及轉換方法一併傳送到授權服務中。
-
(B) 授權服務返回授權碼並記錄code_challenge和轉換方法t_m。
-
(C) 移動App客戶端收到授權碼後,將授權碼和code_verifier秘鑰串傳送到授權伺服器,用以申請訪問令牌。
-
(D) 授權伺服器根據轉換方法t_m 轉換code_verifier 並與步驟A中收到的code_challenge比較,如果一致則返回訪問令牌,否則拒絕非法請求。
-
rfc8252 - OAuth 2.0 for Native Apps
()
-
rfc7636 - Proof Key for Code Exchange by OAuth Public Clients
()
-
(A)使用者提供給特權App使用者名稱和密碼。
-
(B)特權App將使用者憑據提交給授權伺服器IAM,申請訪問令牌
-
(C)授權伺服器IAM 驗證使用者的憑證,如果有效,頒發訪問令牌給特權App。特權App對授權伺服器頒發的訪問令牌、重新整理令牌進行儲存和更新。
-
雖然是特權App,但App中不要持久化儲存使用者密碼,僅登入時使用
-
App負責儲存Access Token 、Refresh Token
-
身份認證類API:即登入認證相關的API。為了避免使用者、客戶端憑證洩漏第三方(除IAM、訪問者之外為第三方),身份認證類API或UI建議由IAM系統直接開放給訪問者呼叫進行身份認證。
-
應用功能類API:功能實現來自服務提供者,透過閘道器開放給訪問者。閘道器是訪問應用API的入口。
-
方案一:閘道器委託授權服務驗證,每次收到請求後,閘道器均將訪問令牌傳送到IAM認證服務進行認證,認證透過後才允許繼續訪問。
-
客戶端成功認證後,使用UUID型別的訪問令牌呼叫閘道器上的服務
-
由於UUID型別令牌不包含客戶端的資訊,閘道器需要委託IAM認證服務校驗令牌
-
令牌檢查合法後,將請求路由到服務提供者
-
應用中也無法解析令牌,需要根據UUID令牌到IAM中獲取使用者資訊
-
方案二(推薦):閘道器直接驗證,要求閘道器能識別IAM頒發的令牌,這種模式推薦用 JWT令牌,閘道器需要具備解析校驗JWT加密的訪問令牌的能力。
-
客戶端成功認證後,使用JWT令牌呼叫閘道器上的服務
-
閘道器自己直接解密JWT令牌進行校驗
-
令牌檢查合法後,將請求路由到服務提供者
-
應用受到請求後,如果需要更多許可權資訊,如果可以根據Token去許可權管理服務獲取許可權資訊(非必須步驟,需要時新增)。
JWT令牌是防篡改的,但並不加密,如需要儲存到瀏覽器儲存中,建議採用JWT+JWE方式進行令牌加密。令牌中存放必要少量資料即可,避免濫用。多數伺服器通常會對Http header、cookie長度做限制。
-
方案一,內部令牌:系統內的應用在釋出介面到閘道器時,提供一個系統內部共享的令牌給閘道器和系統內所有應用,接收到請求時檢查請求頭中是否包含系統內信任的令牌, 如果包含可信任令牌,那麼就允許訪問,否則就拒絕
-
方案二,系統內保密令牌+閘道器證書單獨認證:系統內用保密令牌互動就是方案一,只是內部令牌不共享給閘道器,閘道器用公私鑰證書籤名方式與域內系統建立信任,由閘道器生成公私鑰證書,頒發公鑰給各個系統,閘道器呼叫服務提供者時,請求頭中帶上用私鑰簽名的令牌,應用收到請求以後用閘道器釋出的公鑰驗證其令牌。
-
客戶端1獲取了API Key 但其沒有合法的訪問令牌,如果不允許匿名訪問,則閘道器會拒絕客戶端1訪問,返回錯誤碼401表示客戶端未透過認證;
-
客戶端2擁有了合法的訪問令牌,但其API Key不合法,閘道器在客戶端2認證檢查透過後,檢查API Key,發現其許可權不足,則返回錯誤碼403表示客戶端的許可權不足;
-
客戶端3擁有合法的客戶端訪問令牌和API Key訪問閘道器上的服務,閘道器認證、鑑權透過之後,將請求路由到實際的服務提供端,最終發回正常響應資料。
關於許可權管理,是業務系統自治或是集中管控,根據企業自身的需求特點決定即可。
3.通訊安全
為什麼用了https就能保證通訊安全呢?https是http+ssl,採用密碼學手段對通訊報文做了加密,使得報文無法被篡改,做到了安全傳輸,從而保障了通訊安全。關於https原理和負載均衡器證書配置相關資料網路上有很多,請大家即用即查。
4.程式碼安全
敏感配置加密 :上述各種服務安全場景和方案聊了那麼多,大家發現儲存好令牌、金鑰、密碼是一切安全的前提。這些東西千萬不能外洩。要保證密碼不洩露的辦法就是做好敏感資料保密,技術手段上則要求儲存密碼、憑證的地方(配置檔案和資料庫表)需要加密儲存。如:配置檔案中的資料庫口令、資料表中存放的密碼資料等
程式碼質量管理 :建議在開發期對於編碼規範進行制定,還可以透過工具進行輔助檢查和控制,如開源的程式碼質量管理工具Sonar,可以支援多種程式語言,方便的與編譯構建工具整合如Maven,在程式碼進入正式提交對應分支前就將一些安全問題在前期預防,如SQL隱碼攻擊等。
執行時安全掃描 :測試階段,可以透過安全掃描軟體,如AppScan 等工具對業務系統的前後端功能進行掃描,檢查系統漏洞並即時修復。儘量減小在上線執行後出現安全事故的風險。
5.管理審計
運維管理安全方面,根據安全需求,要有安全相關的管理規範和工具支撐,對系統管理、許可權分配和關鍵資料進行嚴格管控,並做好操作審計日誌記錄。
比如很多安全級別高的行業或企業中如軍工類,對於業務系統的修改、許可權管理審計做了嚴格的流程規範和功能支撐。如典型的三員管理,採用三權分立、互相制約的思路,包含系統管理員、安全管理員、安全審計員三個角色,互相能看到對方的資訊,將業務過程分成不同的段,每段由對應人員負責,不讓任何人掌控全域性。
審計工作是非常重要的一環,沒有任何系統和流程是絕對安全的。關鍵的操作、資料變化等審計日誌需要完整記錄。一旦發生問題,可以透過審計日誌排查分析追蹤。常見內容舉例如下:
-
對於敏感資料項(如:密碼)的訪問
-
客戶端註冊、使用者認證授權過程
-
許可權的授予和廢除
-
關鍵資料的變更、刪除
-
審計功能的啟動和關閉
-
其他關鍵API、命令的訪問
以上這些審計方面的工作中,如果是基於API相關的審計資訊記錄,如邊界互動報文資料,建議基於統一的技術框架進行記錄管理。一些內部實現方法,則可以採用介面、方法上加註解,AOP攔截後記錄的方案。其他情況可根據實際需求設計審計資料儲存的方案。
參考引用
-
rfc6749-The OAuth 2.0 Authorization Framework
()
-
rfc8252-OAuth 2.0 for Native Apps
(2)
-
rfc7636-Proof Key for Code Exchange by OAuth Public Clien
()
-
PKCE授權碼模式
()
-
如何在微服務架構中實現安全性
(https://mp.weixin.qq.com/s/zMJknIq2qVCkNMtyBiFtag)
-
如何在移動端開發中正確地使用OAuth協議
()
關於作者 :炎峰,現任普元金融研究院架構師。主要負責普元流程產品的核心架構設計與產品版本發展規劃,先後參與了國家電網BPM、BAM平臺、浦發銀行新一代流程平臺等大型平臺專案建設與實施 。
轉載本文需註明出處:微信公眾號EAWorld,違者必究。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31562043/viewspace-2654497/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 遊戲安全,應該從哪些方面入手?遊戲
- IT人應從五個方面做職業規劃
- Mac執行越來越慢,從這兩個方面入手!Mac
- 使用OAuth2和JWT為微服務提供安全保障OAuthJWT微服務
- 開發直播帶貨系統,需要從哪幾個方面入手?
- 應用部署初探:6個保障安全的最佳實踐
- 鴻蒙Next安全之應用加密:保障應用程式碼安全鴻蒙加密
- 教育直播平臺開發需求方案從哪幾個方面入手
- 資料庫正常執行,但是速度慢,應該從哪方面入手資料庫
- web安全測試必須注意的五個方面Web
- 培養IT管理層的“精益意識”,要從這三個方面入手!
- 使用 OAuth 2 和 JWT 為微服務提供安全保障 – 基本概念OAuthJWT微服務
- 使用 OAuth 2 和 JWT 為微服務提供安全保障 - 基本概念OAuthJWT微服務
- 從SpringCloud看一個微服務框架的「五臟六腑」SpringGCCloud微服務框架
- 從七個方面維護伺服器安全伺服器
- 通向微服務成功的五個步驟微服務
- 如何從複雜單體應用快速遷移到微服務?微服務
- 從 Spring Cloud 看一個微服務框架的「五臟六腑」SpringCloud微服務框架
- 保障Web服務的安全Web
- Knative 實戰:一個微服務應用的部署微服務
- 小白如何入門Web前端?你可以從這幾方面入手Web前端
- 五方面入手精選資料庫審計產品資料庫
- 微服務從程式碼到k8s部署應有盡有系列(五、民宿服務)微服務K8S
- Dubbo 入門系列之快速部署一個微服務應用微服務
- Java微服務應用測試,走起Java微服務
- 企業應用架構演化探討:從微服務到Service Mesh應用架構微服務
- 從負載均衡到路由,微服務應用現場一鍵到位負載路由微服務
- 好程式設計師Java分享JVM從哪方面入手學習程式設計師JavaJVM
- 從原始碼入手探索koa2應用的實現原始碼
- 從單體應用到微服務開發旅程微服務
- silky微服務的應用服務和服務條目微服務
- Oracle優化的五個方面Oracle優化
- “破局”資料大迴圈 應從流通、技術和法治保障等多維度入手
- [譯] 用 Rust 寫一個微服務Rust微服務
- 財務共享中心進行知識管理應該從哪裡入手?
- 影響靜態應用安全測試工具(SAST)分析速度的3個方面AST
- 從0實現一個前端微服務(上)前端微服務
- 微服務工程中,基礎元件應用微服務元件