微服務安全認證架構是如何演進而來的?

2020-08-28 我不禿頭

之前有同事問為何要用基於JWT令牌的認證架構,然後近期又有童鞋在後臺留言問微服務安全認證架構的實踐,因此我決定花兩篇推文來解答一下。為了答好這個話題,我們先來看看微服務的安全認證架構是如何演進而來的,從而更好地理解。

1 單塊階段(上)

首先,我們有必要再次了解下認證和授權這兩個基本概念:

認證,Authentication,識別你是誰。即在網站上用來識別某個用戶是否是註冊過的合法用戶。

授權,Authorization,識別你能做什麼。即在網站上用來識別某個用戶是否有某方面的權限。

假設我們把時間倒退回2006年,我們有一個叫做MyShop的網站,它的安全架構大概是下面這個樣子,我們暫且稱之為v1版本:

MyShop v1版本的認證操作

可以看到,這個v1版本的傳統安全認證架構,使用到了我們十分熟悉的Session + Cookie的模式來實現用戶的認證。即當一個註冊用戶通過登錄操作請求後,Web伺服器通過向資料庫進行校驗用戶名和密碼,通過後就會向Session中添加一條記錄,然後返回給瀏覽器。在返回給瀏覽器的報文中,會將sessionId放在Cookie裡頭。

MyShop v1版本的訪問操作

這樣一來,用戶在登錄之後再訪問網站的時候,就會將帶有sessionId的Cookie傳給Web伺服器,而Web伺服器就可以通過Cookie中的sessionId去Session記錄中檢查,如果沒有過時就認為其是認證的活躍用戶。

在ASP.NET Core中,提供了一個管理Session的中間件,我們可以在StartUp中註冊和使用這個中間件即可用來管理會話狀態。

參考資料:有關ASP.NET Core中的會話和狀態管理,這裡是傳送門。

2 單塊階段(下)

v1版本上線測試之後,測試人員發現存在一個問題:登錄用戶會間歇性地退出登錄,而且會話還沒有超時。經過分析後發現,原來的Session記錄只會在登錄過的那臺Web伺服器上存在,而MyShop是以集群方式來部署的,由前置的Nginx代理伺服器進行負載均衡地請求轉發。針對這個問題,MyShop設計了下圖所示的v1.1版本的認證架構,又稱為黏性Session架構。也就是說,不管哪一次請求,Nginx都會將對應的sessionId發給對應的Web伺服器進行處理,而不是均衡地輪流轉發。換句話說,Nginx伺服器將會維護sessionId與各個Web伺服器的Session之間的關聯,以保證在會話期間的Session綁定。

MyShop v1.1版本-黏性會話

就這樣,一晃兩三年又過了,MyShop v1.1的認證架構支持了它早期的快速發展。但是,隨著業務和用戶量的不斷擴展,它也逐漸暴露出穩定性和擴展性方面的問題。這些問題,歸根結底還是由黏性會話所造成的。

(1)穩定性:黏性會話會將用戶會話綁定到某個伺服器上,如果我們要對這個伺服器進行一些升級或改造又或伺服器延遲或宕機,那麼此伺服器上的一波認證用戶信息就會瞬間消失,用戶必須重新登錄。

(2)擴展性:黏性會話使得Web伺服器和Nginx負載均衡伺服器上都保存了狀態,整體上屬於一個有狀態架構。隨著流量的增長,這些狀態同時給Web伺服器和負載均衡器都會帶來較大的壓力。和無狀態的應用架構比起來,這種有狀態的應用架構比較難以擴展。

一般來說,常見的解決黏性會話的解決方案有以下幾種:

(1)會話同步複製:即各個Web伺服器之間同步Session,但是會引入複雜性,整體的性能較低。(2)無狀態會話:即Session數據不存在伺服器端,而是存在瀏覽器端,但是存在數據洩露風險,且瀏覽器端對於Cookie的大小有限制(4KB)。

(3)集中狀態會話:即將Session集中存儲在某個存儲中,比如Memcached或Redis這種高性能緩存中。

因此,MyShop選擇了集中狀態會話的方式演進出了v1.5安全認證架構,如下圖所示:

MyShop v1.5版本-集中狀態會話

在v1.5版本中,Web伺服器和Nginx伺服器不再存儲會話狀態,轉而交由Redis進行統一存儲,從而提高了穩定性和擴展性。對於Redis來說,也可以採用高可用集群方案,業界也有很多可擴展的實踐案例。

畫外音:雖然是單塊時代發展出來的技術,但是無狀態會話和集中狀態會話卻是微服務安全認證架構的基礎。

3 微服務架構階段(上)

時光飛逝,時間來到了2015年,這期間MyShop的業務量也迅速的飛漲,期間網際網路的技術也發生了大變化。微服務架構、無線應用、SPA應用雨後春筍般的出現,MyShop的技術團隊也準備陸續應用實踐,進一步豐富和擴展業務渠道,賦能業務端。但是,微服務架構的安全認證授權也存在著一些挑戰:

微服務認證授權挑戰

(1)後臺應用和服務眾多,如何對每一個服務進行認證和鑑權?傳統的用戶名&密碼以及Session/Cookie的方式還能夠適用嗎?(2)前端的用戶入口眾多,如果每個入口都搞一套登錄認證,顯然成本高且難以擴展。有沒有一種SSO單點登錄的方案?經過MyShop技術團隊的分析,傳統的用戶名&密碼+Session/Cookie的方式無法直接套用在微服務架構上,但是可以借鑑之前的思路,他們提出了面向微服務架構的v2.0安全認證體系,如下圖所示:

MyShop v2.0版本-基於Token的認證

v2.0安全認證體系最大的變化就在於,將登陸認證抽取為一個獨立的API微服務AuthService,擁有一個獨立的UserDB。這個服務統一承擔登陸認證、用戶校驗、令牌頒發等職責。此外,v2.0版本還引入了Token作為服務調用認證鑑權的主要憑證。這裡的話,v2.0採用的是一個透明令牌(也稱為引用令牌),即它是一個無意義的隨機字符串。這個令牌跟Auth Service上的一次登陸會話相關聯,後續也可以通過API去校驗這個令牌的合法性。

畫外音:其實這個Token令牌,就相當於一個SessionId。每個微服務拿到令牌,都可以去AuthService進行認證鑑權。

總結下來,v2.0的安全認證體系的步驟如下:

Step1.用戶通過某種客戶端(Web/SPA/H5/App等)進行登陸,AuthService通過比對用戶資料庫進行校驗;

Step2.AuthService校驗通過後會建立一個用戶會話Session(此Session和之前版本的類似,存在一個過期時間,可以存儲在AuthService所在的伺服器上也可以存在Redis中),然後頒發一個Token給客戶端;

Step3.客戶端向後臺微服務發請求,會帶上剛剛得到的Token;

Step4.微服務接收到用戶請求時,首先會向AuthService發出一個請求對這個Token進行合法性校驗;

Step5.AuthService校驗Token通過後會返回該用戶的詳情信息(如果微服務需要的話,可以拿到用戶的一些比如角色之類的信息);Step6.微服務進行自己的邏輯處理,最終返回數據給客戶端;

畫外音:v2.0版本可以看做是v1.5的一個升級改造,專門針對微服務架構的場景進行了擴展,可以應對微服務架構存在的挑戰。它把登錄認證、令牌頒發等工作封裝在了AuthService中,其他微服務統一共用AuthService,經過擴展還可以實現SSO單點登錄。

4 微服務架構階段(下)

v2.0認證架構雖然可以解決問題,但是又引發了另外的問題:首先,每個微服務都需要實現部分認證鑑權的邏輯,使得微服務開發方無法聚焦於業務邏輯的開發。其次,認證鑑權邏輯分散在每個微服務當中,一方面會帶來不規範容易出錯的問題,另一方面也會有潛在的安全風險(比如某些開發人員可能會忘記校驗令牌)。為了解決上面提到的問題,同時考慮到微服務拆分後引入微服務API網關,MyShop技術團隊設計了下圖所示的v2.5認證架構:Token+Gateway結合方式

MyShop v2.5版本-基於Token+Gateway的認證

從上圖可以看出,該架構將每個微服務都要進行的部分認證鑑權的邏輯從微服務轉移到了網關中。即網關處負責拿到令牌向AuthService進行鑑權,通過後再將請求轉發到後端的微服務,微服務不再包含任何認證鑑權的邏輯。總體上,通過引入網關進行令牌的鑑權之後,大大減少了後端微服務開發方的職責,使得他們更專注於微服務的業務邏輯的開發。此外,引入網關之後,網關可以統一處理登錄客戶端的校驗,也便於實現SSO單點登錄,也為MyShop後續的微服務化和業務成長提供了基礎。

畫外音:v2.5版本應該是目前大多數團隊所採用的一種認證架構了。對,我司也是,不過Token類型使用的是JWT。

5 小結

本文通過一個MyShop的案例的演化介紹了微服務的安全認證架構是如何演進而來的,但是v2.5版本(Token+Gateway方式)總體上還是比較重,每個請求都還是需要到AuthService上去做認證鑑權的操作,這對於AuthService來說算是壓力比較大。針對這個問題,業界廣泛採用JWT這種輕量級的解決方案來重構安全認證架構。那麼問題來了,JWT是什麼?原理?實現方式?大家可以評論區討論一下

相關焦點

  • 微服務安全認證架構是如何演進而來的?坐好小板凳一起來聽一聽
    之前有同事問為何要用基於JWT令牌的認證架構,然後近期又有童鞋在後臺留言問微服務安全認證架構的實踐,因此我決定花兩篇推文來解答一下。為了答好這個話題,我們先來看看微服務的安全認證架構是如何演進而來的,從而更好地理解。
  • 騷年快答 | 微服務安全認證架構如何演進來的?
    騷年快答,答你所問之前有同事問為何要用基於JWT令牌的認證架構,然後近期又有童鞋在後臺留言問微服務安全認證架構的實踐為了答好這個話題,我們先來看看微服務的安全認證架構是如何演進而來的,從而更好的理解。1 單塊階段(上)首先,我們有必要再次了解下認證和授權這兩個基本概念:認證,Authentication,識別你是誰。即在網站上用來識別某個用戶是否是註冊過的合法用戶。
  • AliP9整理出微服務筆記:Spring微服務不止架構和設計
    微服務是一種架構風格,也是一種針對現代業務需求的軟體開發方法。微服務並非發明出來的,確切地說是從之前的架構風格演進而來的。本文各章的內容都很實用,細緻講授了如何將微服務技術與業務相結合。通過一系列示例(包括一個旅遊業的案例研究),文中闡述了微服務架構的實現,涉及Spring框架、Spring Boot和Spring Cloud. 這些都是用於開發和部署大規模可擴展微服務的強大且久經考驗的工具。本文基於Spring框架的最新規範編寫。藉助本書,你可以快速構建網際網路級現代Java應用。
  • 微保 Serverless 實踐之架構演進
    本文將具體介紹微保前端的架構演進過程,以及團隊最終選擇使用騰訊雲 Serverless 技術支撐前端架構的原因。微保團隊使用 Serverless 技術的主要應用場景:前端開發同學,應用在BFF層,目前接入的有小程序,H5 頁面。
  • 閒魚服務端架構演進歷程
    閒魚能有今天的成績,離不開背後的技術迭代、架構升級和技術人的付出。閒魚初創時,架構設計面臨著哪些挑戰?閒魚服務端架構在 6 年時間裡是怎樣演進的?閒魚在服務端架構上還在做哪些新嘗試?… 帶著這些問題,InfoQ 記者採訪了閒魚技術部高級技術專家巴滕。自閒魚創立以來,他一直參與閒魚服務端架構持續演進的工作。
  • 實現全託管,騰訊雲服務網格的架構演進
    本文深度解析服務網格架構演進和發展趨勢。微服務架構看起來非常優雅,兼顧可伸縮和可擴展性,但是呢在實際使用過程中的,用戶卻發現該架構極度複雜。這是單體化演進的根本原因。TCM託管演進-數據面視角下面介紹託管控制面架構的演進,讓我們從數據面的視角下,看看數據面對控制面有哪些依賴:
  • 雲原生時代,應用架構將如何演進?
    阿里雲高級技術專家許曉斌通過本文分享從 IaaS 上雲時代到 PaaS 上雲時代的應用架構演進方向,以及雲原生技術與應用架構演進的關係。BaaS——Backend as a Service,能夠儘量使用現有的服務來構建應用程式。Service Mesh 的本質是管理流量,今天的應用程式都在接收流量,提供服務時流量又需要出去,在這個過程中如何管理服務發現、流量路由規則等都需要 Service Mesh 技術。
  • 江蘇大學:基於微服務構建分布式數據服務平臺
    縱向是指針對某一模塊或組件拆分形成獨立的原子服務。分層是指梳理、抽取核心或者公共的原子服務下沉至核心或公共服務層,逐步形成穩定的底層服務。其次是拆分的粒度,這是服務拆分的難點,微服務架構也是循序演進的過程,可參考以下原則:1.功能完整,職責單一;2.API版本兼容性優先;3.迭代演進,團隊可接受。
  • 網易嚴選的網關架構演進之路
    而作為嚴選對外服務的總入口,網關承接了主要的業務流量,保障著嚴選業務的穩定運行,並幫助業務進行更好的容災和降級。隨著服務化、容器化的演進,嚴選 API 網關也轉變角色,作為嚴選邊緣網關,協助業務進行無感知的流量遷移。最後,嚴選 API 網關統一到了基於雲原生的輕舟 Envoy API 網關,不斷往更高級的形態演進。
  • 關於微服務拆分,聽聽一位微服務架構師的肺腑之言
    但在架構轉型時,原有系統應該如何進行微服務拆分呢?要避免哪些陷阱呢?在本文中,騰訊雲微服務架構師崔凱將為大家詳細解答。01 引言天下大勢,分久必合,合久必分,架構設計風格隨著系統的不斷演進逐步進行著分分合合的變化。
  • 中臺辨析:架構的演進趨勢
    但是這種架構風格並沒有很好地處理它的前身SOA遺留的問題,就是如何確定服務的顆粒度,於是,不溫不火快10年的DDD派上用場了。DDD這種可以直接按照限界上下文導出數據和行為相結合的設計結果的方法,很適合推微服務一把。Chris Richardson在其著作《微服務架構設計模式》一書中就專門花了兩章來介紹DDD與微服務的結合。
  • 中小團隊開始回歸單體架構,那麼電信運營商該不該用微服務?
    作者 | 路宇浩 微服務作為目前主流系統架構模式之一,已獲得多數企業青睞,其在一定程度上被業內視為單體架構演進的方向。本文通過分析微服務架構與單體架構的性能特點與適用性,並對運營商系統進行梳理研究,提出了微服務架構系統適用性評估體系,同時對雲原生時代運營商微服務改造策略進行研究。
  • 技術大咖為你從理論到實踐講透架構演進之路
    CBS架構演進2. 要求日益嚴苛的需求場景對CBS的挑戰3. 低延遲架構優化4. 優化成果和場景案例日調1000億,騰訊微服務平臺的架構演進隨著組織或項目發展,業務系統總會逐漸成長。當現有架構不再滿足需求,我們該如何破局?
  • 信服云為IT基礎架構演進提供新思路
    傳統IT架構升級新思路參會者普遍認為,過去十年中,各行業IT基礎架構主要以虛擬化技術為依託,採用VMware為主流的虛擬化產品和服務。但傳統的IT基礎架構在實際應用中存在不少問題。除此之外,隨著雲計算、大數據、AI等技術的逐漸成熟,信息安全與合規政策的不斷變化,傳統的IT基礎架構也急需進化。來自不同行業的CTO與專家們對IT架構的穩定性、遷移擴容能力,以及信息的安全合規等問題進行了激烈討論。不少專家提出,業界需要一套穩定性達到國際領先水平,又具備平滑遷移與彈性擴容的解決方案,更重要的是在兼顧成本的同時,可以滿足信息安全合規的各項要求。
  • 傳統IT架構轉型-從SOA和微服務到雲原生解決方案實踐
    第一部分首先闡述從SOA到微服務,中臺,雲原生的一個架構演進過程。將這個的目的就是要說明實際我們當前看到的很多類似中臺,雲原生這些新的技術概念實際上仍然是傳統的SOA,雲計算,領域建模等思想的一個延續。第二部分是講微服務思想下企業架構規劃的核心思路和方法論,重點是講解對傳統企業架構規劃方法的優化和改進。
  • 荔枝微課基礎架構的演進與實踐
    本文將會詳細講述荔枝微課是如何做雲原生下的微服務基礎架構設計。分享人:王誠強,荔枝微課基礎架構負責人,主要從事基礎技術研究開發、基於雲原生的基礎架構設計以及基礎架構團隊的管理建設。致力於雲原生理念下,以微服務搭建中臺。
  • 分享一個SpringCloud微服務網關架構以及安全策略
    1、 網關架構總體設計當用戶請求系統時,必須通過網關路由到對應的服務。請求網關的順序:1. 通過過安全策略攔截器進行記錄請求日誌同時進行防止惡意訪問和攻擊安全防護策略;2. 通過熔斷機制防止系統故障蔓延,導致整個系統癱瘓。3. 到達路由之前判斷是否需要限流,如需要限流將進行限流策略4.
  • 打造企業級微服務平臺架構,分布式應用場景管理
    微服務系統可以在「自己的程序」中運行,並通過「輕量級設備與HTTP型API進行溝通」。關鍵在於該服務可以在自己的程序中運行。通過這一點我們就可以將服務公開與微服務平臺架構(在現有系統中分布一個API)區分開來。在服務公開中,許多服務都可以被內部獨立進程所限制。
  • 美國國防部如何推進零信任架構?
    Wallace站在國防部的視角,結合國防部網絡架構的三次演進,總結了國防部零信任的七大支柱,強調了身份的奠基作用,提及了零信任與微分段和SDP的聯繫。Wallace曾講述過自己從零信任的懷疑者變成信徒的轉化過程。並強調,「零信任思想具有很大的包容性。」
  • 讀《演進式架構》有感
    最近讀了一本很有意思的書《演進式架構》,從一個不太一樣的角度來描述架構這件事。也讓我痛定思痛的反省了一下過去犯的錯誤,以及由於知識欠缺,所留下的遺憾。這不是一篇介紹書目的軟文,所以不會通篇介紹書中內容,我也沒有電子版的連結,單純是結合個人經歷抒發一些感慨......