劉一田, 林亭君, 劉士進
1(南瑞集團(國網電力科學研究院)有限公司, 南京 211106)
2(河海大學 能源與電氣學院, 南京 210003)
微服務架構和其開源技術棧日益成熟, 已逐步成為互聯網及企業級項目中的主流技術架構, 隨著基于微服務架構的領域服務設計細化, 產生了更多的獨立微服務進程, 進程間的微服務調用頻度更加頻繁, 無狀態的微服務調用請求每次都需要鑒權, 在大量用戶并發訪問時會引發鑒權服務的性能瓶頸, 如何在保證服務性能的同時確保無狀態服務之間的安全訪問控制是微服務安全架構面臨的關鍵問題.
目前主流的四種解決方案及相應問題包括:(1)單點登錄.每次服務訪問前必須與認證服務交互, 這會產生大量瑣碎的網絡流量和重復的工作, 當微服務規模增大時影響比較顯著.(2)分布式會話.將用戶認證的信息存儲在共享存儲中, 且通常由用戶會話作為查詢鍵來實現的分布式哈希映射, 當用戶訪問微服務時, 用戶數據可以從共享存儲中獲取.這種方案的缺點在于共享存儲需要一定保護機制, 需要通過安全鏈接來訪問, 實現復雜度高, 性能有明顯損耗.(3) 客戶端令牌.令牌在客戶端生成, 由身份驗證服務進行簽名, 并且必須包含足夠的信息, 以便可以在所有微服務中建立用戶身份.令牌會附加到每個請求上, 為微服務提供用戶身份驗證, 這種解決方案的安全性相對較好, 但身份驗證注銷時需要使用短期令牌和頻繁檢查認證服務, 性能略有損耗.(4)客戶端令牌和API網關相結合.所有服務請求首先路由到API網關, API網關將請求的原始用戶令牌轉換為內部會話令牌, 有效地避免了身份注銷時令牌問題.上述方案中相比第四種方案有明顯的優勢, 但認證時服務鑒權的粒度和頻度不能平衡, 缺乏柔性適配的安全訪問控制策略.
本文設計的柔性微服務安全訪問控制框架在上述第四種解決方案的基礎上進行了改進和提升.引入支持常規安全策略和自定義安全策略的安全訪問控制策略模板, 更好地實現柔性安全訪問控制, 并通過統一配置服務和消息總線服務實現安全策略的即時發布和應用.通過服務容器化后的容器安全策略加固服務邊界;在微服務API網關中采用分層攔截過濾的方式, 通過前置過濾、路由、后置過濾和異常處理等環節結合安全策略更好地安全訪問控制和容錯;在服務訪問令牌方面, 采用 RFC 7519[1]標準協議格式, 結合安全訪問控制策略, 動態生成輕量級服務訪問令牌, 在增強安全訪問控制的易操作性和性能的同時, 提升了微服務安全訪問控制的柔性.考慮到基于容器的微服務構建正逐步成為微服務架構落地部署的主要模式, 框架采用容器化安全訪問控制策略以增強微服務安全訪問控制能力。
本文設計的柔性微服務安全訪問控制框架結構如圖1所示.分別從服務安全、數據安全、虛擬化安全等多維度增強微服務柔性安全控制, 其主要具備如下特征.
(1)框架設計高可用.整個系統無核心單點, 易運維, 易部署.
(2)安全訪問控制策略靈活和自發現.支持策略模板、模板繼承和覆蓋.
(3)框架的微服務API網關采用HTTPS協議路由請求, 并根據安全訪問控制策略審計和過濾不安全的服務訪問, 屏蔽不符合安全訪問控制策略的請求.在請求高并發時, API網關采用令牌桶算法進行限流, 確保系統的可用性和性能.
(4)服務訪問令牌輕量高效, 實現無狀態會話機制.結合服務訪問令牌和請求刷新令牌兼顧服務安全和性能.
(5)服務訪問控制操作管理更精細, 支持為每個服務API提供按需認證方式.
(6)基于虛擬宿主環境內部安全策略構建安全信任邊界[2].使用基于Docker容器宿主操作系統的腳本語言快速創建和配置私有網絡, 在網絡安全級別上執行強大的安全策略.

圖1 柔性微服務安全框架結構
柔性微服務安全框架執行流程如下.
(1) GIT配置中心統一維護安全策略配置, 配置的變更自動發布到消息總線的約定主題上, 配置中心支持集群、負載均衡及高可用.安全策略服務定時從消息總線訂閱安全策略配置.安全策略配置中以正則表達式描述了請求URL規則的安全策略映射.
(2)服務消費者請求首先經由微服務API網關, 在API網關前置過濾器中以POST方式提交用戶認證信息到認證服務.
(3)認證服務首先和數據庫信息匹配, 匹配成功后調用安全策略服務獲取請求URL對應的安全訪問控制策略, 根據安全策略邏輯動態生成加密簽名的服務訪問令牌并返回給API網關, API網關將服務訪問令牌添加到請求頭中并路由到服務調用者.
(4)服務提供者在接收到帶有服務令牌請求頭的服務調用后, 直接由目標服務根據約定的加密私鑰對令牌進行驗簽和校驗, 校驗通過后則確認令牌有效則正常處理請求并返回響應, 否則返回禁止訪問的響應信息.
(5)API網關根據返回的認證結果做下一步的后置過濾處理或異常處理, 并將處理結果返回給請求的服務.
(6)每一個微服務都構建為獨立的Docker鏡像,通過Kubernetes[3]創建Docker容器, 并為所有容器批量基于Docker 鏡像中linux內核操作系統安全策略構建自定義安全策略描述文件, 實現微服務宿主安全.
柔性微服務安全訪問控制框架采用可擴展的安全訪問控制策略模板, 除了常規安全策略外, 支持JAVA BEAN和安全策略表達式的定義擴展.策略模板的變更通過GIT配置中心發布, 以發布/訂閱模式發送到消息總線的指定主題, 安全訪問控制策略服務訂閱后即時更新安全策略.認證授權服務根據訪問URL匹配的安全訪問控制策略生成輕量級服務訪問令牌, 服務提供者接收到訪問令牌后直接解析鑒權, 并進行相應的路由或異常處理.根據上述框架的設計, 需要實現五個主要關鍵技術組件:(1)高可用的統一配置管理中心和消息總線.(2)靈活可復用的安全訪問控制策略模板.(3)輕量級服務訪問令牌.(4)便捷的微服務API授權管理.(5)服務容器化, 應用容器安全策略.
(1)高可用統一配置中心和消息總線
框架通過基于GIT服務器的GITLAB[4]配置管理視圖編輯安全訪問控制策略配置, 配置完成后提交到高可用統一配置中心, 配置管理中心采用分布式一致性Raft[5]算法以保障統一配置中心集群環境下負載均衡、統一配置的一致性及高可用, 實現配置管理集群實例在節點故障重啟時對請求透明化.集群中的節點分為 Leader、Follower、Candidate 三種角色, 由leader響應客戶端請求并確保響應結果的一致性.統一配置管理節點集群首先選舉一個Leader節點, 由Leader節點對外提供服務, 當配置更新時, Leader節點發出命令, 并在確保集群中多數節點都已完成命令操作后, 發布最終確認配置值到消息總線.如果一個Follower在選舉超時的時間周期里沒收到leader的信息, 就進入新的選舉周期, 自身轉成候選人Candidate角色, 給自己投票, 發起選舉, 并重寫產生 Leader以繼續提供高可用一致性服務.如圖2所示.

圖2 高可用統一配置中心和消息總線結構
為了實現在分布式環境下的即時消息通知和高性能傳輸, 框架采用高性能分布式消息總線Apache Kafka[6]實現安全訪問控制策略的發布/訂閱, 使用3個服務器節點組成集群以保障消息總線的高可用, 通信模式采用發布/訂閱模式, 使消息按照指定主題分發, 安全策略訪問控制服務訂閱消費.
(2)靈活的安全訪問控制策略模板
安全訪問控制策略訪有三種類型:基于身份的安全策略、基于規則的安全策略和綜合訪問控制方式.訪問控制安全策略原則集中在主體、客體和安全控制規則集三者之間的關系.框架中策略描述文件以YAML[7]格式進行描述, 包括相互關聯的4部分:入站、路由、出站、異常處理.這四部分中分別提供了不同的安全策略, 入站部分的安全策略包括基于服務訪問令牌進行授權訪問、請求參數加密、請求頭部設置關聯標識、目錄級安全控制、屬性安全控制等策略;路由部分安全策略包括服務監測和鎖定控制;出站部分的安全策略包括跨域策略、緩存策略、跳轉策略等.安全策略以URL正則表達式的方式定義了服務和安全策略的映射, 并支持自定義安全策略的處理Bean注入.表1中的安全策略描述了入站的令牌生成表達式、令牌驗證表達式對令牌及狀態進行認證鑒權后的處理方式.

表1 安全訪問控制策略模板描述
(3)輕量級服務訪問令牌
框架采用的輕量級服務訪問令牌支持無狀態的會話應用, 使用簽名和加密來驗證和保護會話內容.服務訪問令牌由三部分組成:頭信息(header), 消息體(payload)和簽名(signature), 頭信息指定了該令牌使用的簽名算法, 如表2所示.消息體包含了訪問者的憑證等授權信息.由于客戶端數據可能被篡改, 因此,框架采取密鑰簽名技術驗證令牌的有效性, 防止惡意攻擊, 框架提供了基于國密SM3的簽名算法和SM2加密算法實現[8].為了避免CSRF和XSS攻擊, 同時避免頻繁更新令牌的性能損耗, 框架會定時監測令牌有效期, 并在令牌過期后的下次服務請求時通知服務消費者, 服務消費者通過刷新令牌申請新的服務訪問令牌以確保安全服務訪問控制有效性.

表2 框架輕量級服務訪問令牌格式描述
(4)便捷的微服務API授權管理
微服務API授權管理組件列出給出了所有可用的服務及操作資源, 選中左側的服務操作, 在右側授權設置中選擇授權策略或自定義策略, 如圖3(a)所示, 支持設置服務中的URL查詢參數和請求頭等特殊參數以更好地滿足個性化服務認證鑒權需求.自定義授權配置如圖3(b)所示, 允許指定服務訪問角色、身份令牌來源、身份驗證表達式及秒級令牌有效期, 其中身份令牌來源指定令牌以何種方式傳遞給客戶端, 包括請求頭授權、Cookie授權、Ajax授權等三種方式, 令牌驗證表達式默認分別對應不同身份令牌進行配對使用,并允許自定義令牌驗證表達式以個性化授權認證方式.
(5)服務容器化, 應用容器安全策略
微服務的安全防火墻依賴其所宿主的虛擬化容器及網絡環境, 在部署微服務容器的同時, 需要做好已知服務宿主容器安全攻擊的防御工作, 從而保護微服務及數據的安全性.容器安全始于宿主機的操作系統, 框架選擇使用最小Linux發行版Alpine Linux作為微服務容器鏡像構建的宿主操作系統, 并采用強制訪問控制模式, 從操作系統角度應用最小訪問原則, 使用按需定義的Grsecurity[9]安全策略, 通過支持自動學習訓練生成的基于路徑的訪問控制列表, 限制宿主機訪問權限, 并通過IP限流等網絡安全策略加固微服務安全邊界.
為了對本文提出的柔性微服務安全訪問控制框架的有效性和性能進行驗證, 在一個真實的環境中進行了案例的部署和研究.案例環境由 16 臺 8 核 16G 內存的 PC 服務器 (HPDL 380 G4 378735-AA1)組成, 其中數據庫、認證鑒權微服務、應用微服務、安全訪問控制策略微服務、統一配置管理微服務、消息總線微服務節點比例為 1:1:2:1:3:1, 數據庫和應用服務采用國家電網公司運檢智能分析管控系統的測試數據庫和經過拆分的微服務, 微服務實例以Kubernetes構建的Docker容器形式運行.通過loadrunner模擬并發800用戶的微服務訪問, 通過觀察柔性微服務安全訪問控制框架的效率和穩定性, 評估服務訪問令牌對應用的性能影響, 試驗結果如表3所示.

圖3 微服務 API授權管理

表3 服務訪問令牌對微服務性能的影響
通過BurpSuite[10]掃描微服務應用, 滲透攻擊已發布的微服務接口.驗證結果表明, 設計的柔性微服務安全訪問控制框架符合國家標準中信息系統安全等級保護第二級要素要求[11], 在大并發吞吐量時保證了微服務安全性、服務高可用和高效, 但也發現了一些問題, 針對小規模的應用現有框架的部署架構略顯復雜, 服務訪問令牌會在生產模式下會產生微小的性能損耗, 尚有提升空間.目前, 柔性微服務監控框架已在國網運檢智能分析管控系統中實現并應用, 取得了較好的應用效果.
本文研究了微服務安全訪問控制的策略、令牌機制和容器化安全邊界技術, 在此基礎上, 設計了柔性微服務安全訪問控制框架, 給出了高可用統一配置中心和消息總線、輕量級服務訪問令牌、精細訪問控制、服務容器化并應用Grsecurity策略增強微服務安全邊界等創新點, 闡述了該框架的架構設計及關鍵實現技術.最后, 以國網運檢智能分析管控系統的微服務應用案例為背景, 給出了柔性微服務安全訪問控制框架的應用驗證評估, 驗證結果、效率評估及生產運行實踐表明, 該框架提升了分布式系統中微服務安全訪問控制的靈活度、效率和柔性, 提高了電網信息系統的服務水平.后續將針對遺留問題持續改進優化該框架.