騷年快答 | 微服務安全認證架構如何演進來的?

2020-08-29 EdisonTalk

騷年快答,答你所問


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

1 單塊階段(上)

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

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

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

然後,這裡還是引用我在波波老師的《Spring Boot與K8s雲原生應用開發》課程中學到的一個案例,來學習網站安全架構的演進。

假設我們把時間倒退回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中的會話和狀態管理,傳送門:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/app-state?view=aspnetcore-3.1

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是什麼?原理?實現方式?下一期騷年快答,為你解答這幾個問題。

上期精彩


專欄:EdisonTalk(愛迪生說)

本文作者EdisonZhou,架構師,阿里雲MVP,博客園&34;博主,Scrum聯盟認證CSM,公眾號「恰童鞋騷年」作者,.NET Core布道者,愛好持續閱讀與分享。

相關焦點

  • 騷年快答 | 微服務架構中的BFF到底是啥?
    騷年快答,答你所問昨天的騷年快答《》一文中留下一個問題:BFF是啥?最後,無線BFF裡面除了多業務線的聚合裁剪邏輯,還引入了Cross-Cutting(跨橫切面)的邏輯,比如安全認證、日誌監控、限流熔斷等等。隨著時間的推移,代碼變得越來越複雜,技術棧越堆越多,開發效率也不斷下降。
  • 微服務安全認證架構是如何演進而來的?坐好小板凳一起來聽一聽
    之前有同事問為何要用基於JWT令牌的認證架構,然後近期又有童鞋在後臺留言問微服務安全認證架構的實踐,因此我決定花兩篇推文來解答一下。為了答好這個話題,我們先來看看微服務的安全認證架構是如何演進而來的,從而更好地理解。
  • 微服務安全認證架構是如何演進而來的?
    之前有同事問為何要用基於JWT令牌的認證架構,然後近期又有童鞋在後臺留言問微服務安全認證架構的實踐,因此我決定花兩篇推文來解答一下。為了答好這個話題,我們先來看看微服務的安全認證架構是如何演進而來的,從而更好地理解。
  • 騷年快答 | JWT到底是個什麼鬼?
    騷年快答,答你所問我們了解了微服務安全認證架構是如何演進而來的,但是發現v2.5架構仍然較重,有沒有輕量級一點的方法呢?其實業界早已有了實踐,它就是基於JWT的安全認證架構。JWT到底是個什麼鬼呢?本篇為你解答!
  • 騷年快答 | 技術與業務中臺到底講了什麼?
    騷年快答,答你所問最近有童鞋在我之前發布的《》一文中提問:技術中臺是什麼?和業務中臺又有什麼區別?這裡我們通過下面這張圖,來看看阿里是如何定義技術中臺的。類似的,還可以看看eBay和拍拍貸的中臺架構示意圖,技術中臺都扮演著同樣的角色。
  • 騷年快答 | 為何微服務項目都使用單體代碼倉庫?
    單體應用一般會採用單體代碼倉庫,但是微服務應用的代碼倉庫應該如何組織呢?是每個微服務一個倉庫嗎?即所有微服務對應一個代碼倉庫下圖展示了這兩種實踐的示意(引用自波波老師《Spring Boot與K8s雲原生應用開發》課程):單體應用倉庫 vs 微服務多體倉庫
  • 微服務平臺之網關架構與應用
    3、認證複雜,每個服務都需要獨立認證。4、難以重構,隨著項目的迭代,可能需要重新劃分微服務。例如,可能將多個服務合併成一個或者將一個服務拆分成多個。如果客戶端直接與微服務通信,那麼重構將會很難實施。5、某些微服務可能使用了防火牆 / 瀏覽器不友好的協議,直接訪問會有一定的困難。以上這些問題可以藉助 API 網關解決。
  • 微一案:初創企業應該如何完善組織架構?
    創業一點都不簡單,資金、人員搭配、組織架構等內容,均是創業之初需要確定且做好的功課。其實,創業公司消亡的很大一部分原因是忽視了搭建組織架構的重要性,人員沒有分配好,團隊沒有凝聚力,企業長遠發展下去的概率幾乎渺茫。那麼,一家企業究竟應該如何完善組織機構?
  • 分享一個SpringCloud微服務網關架構以及安全策略
    1、 網關架構總體設計當用戶請求系統時,必須通過網關路由到對應的服務。請求網關的順序:1. 通過過安全策略攔截器進行記錄請求日誌同時進行防止惡意訪問和攻擊安全防護策略;2. 通過熔斷機制防止系統故障蔓延,導致整個系統癱瘓。3. 到達路由之前判斷是否需要限流,如需要限流將進行限流策略4.
  • 微內核架構
    簡介:作為一名Java程式設計師,相信同學們都聽說過微內核架構設計,也有自己的理解。那麼微內核是如何被提出來的?微內核在作業系統內核的設計中又有什麼作用?本文從插件化(Plug-in)架構的角度來詮釋微內核架構設計,通過微內核架構和微服務架構的對比,分享其對微服務設計的參考意義。
  • 打造企業級微服務平臺架構,分布式應用場景管理
    微服務系統可以在「自己的程序」中運行,並通過「輕量級設備與HTTP型API進行溝通」。關鍵在於該服務可以在自己的程序中運行。通過這一點我們就可以將服務公開與微服務平臺架構(在現有系統中分布一個API)區分開來。在服務公開中,許多服務都可以被內部獨立進程所限制。
  • 什麼是微內核架構設計?
    阿里妹導讀:作為一名Java程式設計師,相信同學們都聽說過微內核架構設計,也有自己的理解。那麼微內核是如何被提出來的?微內核在作業系統內核的設計中又有什麼作用?本文從插件化(Plug-in)架構的角度來詮釋微內核架構設計,通過微內核架構和微服務架構的對比,分享其對微服務設計的參考意義。
  • Maxim推出低功耗、16位安全認證微控制器
    Maxim推出低功耗16位微控制器MAXQ1004,能夠為任何應用增加安全認證功能。MAXQ1004採用Maxim專為高安全等級金融終端微控制器設計的安全技術,具有真正的隨機數發生器(RNG)和支持128位、192位、256位密鑰的高速AES加密引擎。這些特性能夠確保認證和通信架構的高度安全性,抵禦信息解析和密碼分析的攻擊。此類認證功能非常適合用於保護投資收入(電池組認證)、驗證外設(視頻遊戲控制器)、構建安全通信鏈路(汽車遙控鑰匙)等。
  • Coremail歸檔系統2020快問快答
    為了滿足小夥伴們的求知慾,小編特意邀請喵教授對Coremail歸檔系統2020進行六大問題的快問快答。知識點Coremail歸檔系統2020分別由歸檔、數據、應用和管理四大模塊構成。通過實時歸檔技術及強大的海量郵件數據搜尋引擎功能的應用,保障了歸檔數據的完整性和易用性。
  • AliP9整理出微服務筆記:Spring微服務不止架構和設計
    微服務是一種架構風格,也是一種針對現代業務需求的軟體開發方法。微服務並非發明出來的,確切地說是從之前的架構風格演進而來的。本文各章的內容都很實用,細緻講授了如何將微服務技術與業務相結合。通過一系列示例(包括一個旅遊業的案例研究),文中闡述了微服務架構的實現,涉及Spring框架、Spring Boot和Spring Cloud. 這些都是用於開發和部署大規模可擴展微服務的強大且久經考驗的工具。本文基於Spring框架的最新規範編寫。藉助本書,你可以快速構建網際網路級現代Java應用。
  • 關於微服務拆分,聽聽一位微服務架構師的肺腑之言
    微服務基礎設施不完備微服務架構的實際落地並沒有想像中的簡單,在基礎設施能力缺失或並不完善之時,就開始微服務的大踏步落地實踐,無疑會讓團隊成員產生諸多困惑。微服務治理方面,試想如果系統服務成千上萬,但沒有微服務治理平臺做支撐,那麼服務健康狀態要如何掌控?更別提服務路由、限流、降級、熔斷等服務治理的成本。
  • 華為雲服務架構專家認證要來了!
    華為認證HCIE-Cloud Service Solutions Architect V1.0預計將於2019年9月30日正式發布。HCIE-Cloud Service Solutions Architect V1.0是主要面向華為用戶、華為工程師、華為合作夥伴工程師、高校學生以及ICT從業人員的專家級別認證,適用於雲服務方向從業人員的技能提升。
  • 江蘇大學:基於微服務構建分布式數據服務平臺
    實際業務庫主要提供實時的數據來源,如統一認證庫、人事資料庫、一卡通帳戶等,而共享庫主要提供離線的數據分析,將分析結果對外提供數據服務,如科研成果、一卡通歷史消費、論文數量等。  在微服務架構設計中,需要核心組件作為技術支撐,包括:1.服務註冊中心,主要實現服務的註冊與發現,微服務之間通過註冊中心彼此感知,同時從註冊中心訂閱自己需要引用的服務。
  • 認證鑑權與API權限控制在微服務架構中的設計與實現
    背景最近在做權限相關服務的開發,在系統微服務化後,原有的單體應用是基於Session的安全權限方式,不能滿足現有的微服務架構的認證與鑑權需求。微服務架構下,一個應用會被拆分成若干個微應用,每個微應用都需要對訪問進行鑑權,每個微應用都需要明確當前訪問用戶以及其權限。尤其當訪問來源不只是瀏覽器,還包括其他服務的調用時,單體應用架構下的鑑權方式就不是特別合適了。
  • 黑少微服務商店實戰分享:從單體式架構遷移到微服務架構
    遷移到微服務綜述今天給大家分享一下黑少微服務商店是如何做單體式架構遷移到微服務架構。遷移單體式應用到微服務架構意味著一系列現代化過程,有點像這幾代開發者一直在做的事情,實時上,當遷移時,我們可以重用一些想法。一個策略是:不要大規模(big bang)重寫代碼(只有當你承擔重建一套全新基於微服務的應用時候可以採用重寫這種方法)。