王兆熠 于千慧 袁迎迎 魏星
摘要:云計(jì)算和微服務(wù)已經(jīng)成為廣大開發(fā)者和運(yùn)維人員的首選部署方案。它們具有更高的資源利用率、應(yīng)用間更低的耦合性和更靈活的架構(gòu)設(shè)計(jì)等優(yōu)點(diǎn),為人們提供了更多的選擇。雖然云計(jì)算和微服務(wù)降低了復(fù)雜系統(tǒng)的開發(fā)和運(yùn)維難度,但隨著服務(wù)和功能模塊的增加,對(duì)于外部和模塊間訪問的控制難度也越來越大。為了以更加簡(jiǎn)單方便的方式進(jìn)行微服務(wù)的訪問控制,本文采用以文獻(xiàn)調(diào)查為輔、實(shí)踐為主的方法,基于Istio服務(wù)網(wǎng)格進(jìn)行微服務(wù)的訪問控制的研究與探索。通過實(shí)踐,本文發(fā)現(xiàn)借助Istio的安全能力,開發(fā)和運(yùn)維人員可以通過在Kubernetes中編寫和下發(fā)配置文件來方便地開啟或?qū)χ付ǚ?wù)配置更細(xì)粒度的訪問控制。新一代服務(wù)網(wǎng)格Istio提供了更方便、快捷和安全的信息安全把控和審計(jì)能力。
關(guān)鍵字:云計(jì)算;服務(wù)網(wǎng)格;Istio;訪問控制;Kubernetes
一、引言
(一)研究目的
軟件業(yè)務(wù)系統(tǒng)的不斷壯大,其所涉及的業(yè)務(wù)功能模塊和中間件也越來越多,這也導(dǎo)致了模塊的開發(fā)難度逐步增大,模塊間調(diào)用邏輯越發(fā)復(fù)雜。單體式架構(gòu)早已不能滿足當(dāng)今需求,其拓展性低、耦合度高、運(yùn)維難的缺點(diǎn)深受詬病。云計(jì)算和微服務(wù)的到來給了這一問題全新的解決思路,企業(yè)可以通過業(yè)務(wù)分解,將負(fù)責(zé)模塊間通信的部分抽離出來,讓研發(fā)人員專注于業(yè)務(wù)邏輯的研發(fā),而不用過多地關(guān)注其他的因素。然而,越來越多的服務(wù)數(shù)量也為服務(wù)間或外部訪問的控制帶來了難度。本文的目標(biāo)是探索訪問控制在服務(wù)網(wǎng)格(Istio)中的實(shí)踐方式和技術(shù)細(xì)節(jié)。
(二)研究背景與文獻(xiàn)綜述
Peter博士在2005年的一次云計(jì)算會(huì)議上首次使用了微服務(wù)這個(gè)術(shù)語。微服務(wù)誕生于一次架構(gòu)師大會(huì),被用于描述許多架構(gòu)師正在嘗試的新型的架構(gòu)風(fēng)格之一。Netflix和亞馬遜是微服務(wù)的早期先驅(qū)者之一[1]。
微服務(wù)的架構(gòu)風(fēng)格是從小型、獨(dú)立的應(yīng)用程序中開發(fā)出復(fù)雜的應(yīng)用軟件,這些應(yīng)用程序使用獨(dú)立于語言的接口(API)相互通信。如果公司無法優(yōu)化長(zhǎng)期以來形成的單體架構(gòu),那么業(yè)務(wù)架構(gòu)將難以升級(jí)或維護(hù),變得過于復(fù)雜。國(guó)內(nèi)學(xué)者對(duì)于云計(jì)算和微服務(wù)的研究較為深入。張玉超[2]在他的研究中表示,云計(jì)算具有規(guī)模大、資源利用高效、通用性強(qiáng)和成本低的特點(diǎn),這非常契合微服務(wù)所需要的基礎(chǔ)特性。借助云計(jì)算,企業(yè)可以以更經(jīng)濟(jì)、更高效的方式將應(yīng)用部署上云。張墨涵[3]等人提到,微服務(wù)間每個(gè)服務(wù)互相獨(dú)立,架構(gòu)靈活,服務(wù)職責(zé)單一。即便其中某個(gè)服務(wù)發(fā)生故障,也可以將影響面縮到最小,且有利于資源的伸縮。這非常適合應(yīng)用在當(dāng)今的云平臺(tái)環(huán)境。國(guó)內(nèi)學(xué)者同時(shí)發(fā)現(xiàn)了微服務(wù)訪問控制的重要性。潘孝陽[4]在他的研究中表明,微服務(wù)的設(shè)計(jì)暴露了更大的可攻擊面,服務(wù)間的通信更容易成為攻擊的目標(biāo)。其次,因?yàn)榉?wù)之間相互信任,所以如果某一個(gè)微服務(wù)被攻陷,可能會(huì)波及整個(gè)系統(tǒng)。因此,對(duì)微服務(wù)的訪問控制進(jìn)行設(shè)計(jì)非常重要。何修宇[5]提到,微服務(wù)運(yùn)行環(huán)境差異大又相互影響,傳統(tǒng)的權(quán)限控制方法難以適應(yīng),且權(quán)限管理規(guī)則復(fù)雜。業(yè)內(nèi)沒有統(tǒng)一標(biāo)準(zhǔn)的難題也說明了權(quán)限控制需要著重研究。
(三)研究方法與研究范圍
本文主要采用了文獻(xiàn)研究法和實(shí)驗(yàn)法兩種方法。通過文獻(xiàn)研究法,本文對(duì)研究背景和歷史進(jìn)行了學(xué)習(xí),并對(duì)已有的研究成果進(jìn)行了總結(jié)。這樣做可以建立對(duì)本次研究的宏觀認(rèn)知。同時(shí),本文還通過實(shí)驗(yàn)法在服務(wù)網(wǎng)格中應(yīng)用訪問控制,并確定了訪問控制的內(nèi)部邏輯和控制機(jī)制等。本文首先對(duì)微服務(wù)的變革進(jìn)行了探索,包括其演進(jìn)模式,每個(gè)階段的特性,以及對(duì)新一代服務(wù)網(wǎng)格Istio的研究。其次,本文對(duì)訪問控制的原理和部署進(jìn)行了實(shí)踐,對(duì)JWT和Istio的安全策略進(jìn)行了探索和學(xué)習(xí)。
二、微服務(wù)的變革
(一)微服務(wù)的演進(jìn)
過去,在業(yè)務(wù)項(xiàng)目中,快速開發(fā)和上線是最重要的考慮因素,導(dǎo)致對(duì)系統(tǒng)后期的發(fā)展、拓展性、健壯性和可用性不夠關(guān)注。隨著業(yè)務(wù)的發(fā)展,性能和需求滿足不了的問題逐步顯現(xiàn)。對(duì)于傳統(tǒng)的單體系統(tǒng)來說,所有模塊之間耦合緊密,功能邊界不清晰,調(diào)用關(guān)系錯(cuò)綜復(fù)雜,難以調(diào)整和排查問題。當(dāng)系統(tǒng)遇到性能瓶頸時(shí),只能通過負(fù)載均和多實(shí)例部署無法解決問題,無法對(duì)模塊進(jìn)行拆分和縱向擴(kuò)展。此外,由于高耦合特性,當(dāng)其中一個(gè)小模塊出現(xiàn)問題時(shí),可能會(huì)波及整個(gè)系統(tǒng),導(dǎo)致整體服務(wù)不可用。微服務(wù)是基于云原生架構(gòu)的一種方法,是SOA架構(gòu)模式的演變。微服務(wù)希望開發(fā)人員將龐大的系統(tǒng)劃分為不同的小模塊,解耦功能,并通過輕量級(jí)協(xié)議使服務(wù)協(xié)同工作。微服務(wù)具有以下特性:?jiǎn)我宦氊?zé)、輕量級(jí)通信、獨(dú)立性、進(jìn)程隔離、支持混合技術(shù)棧、簡(jiǎn)化治理、易于維護(hù)。
在Phil的文章《Service Mesh》中[6],提出了微服務(wù)通信的演變過程。最初,開發(fā)人員希望兩個(gè)服務(wù)之間可以直接簡(jiǎn)單通信,但實(shí)際情況非常復(fù)雜,網(wǎng)絡(luò)可能面臨丟包、錯(cuò)誤等問題。因此,開發(fā)人員需要單獨(dú)處理網(wǎng)絡(luò)問題,而不僅僅是業(yè)務(wù)邏輯。隨著TCP協(xié)議的出現(xiàn),網(wǎng)絡(luò)處理可以下沉,從業(yè)務(wù)服務(wù)中分離出來,成為系統(tǒng)網(wǎng)絡(luò)層的一部分。隨后,諸如Spring Cloud等分布式框架的出現(xiàn),實(shí)現(xiàn)了分布式系統(tǒng)所需的各種通用功能,如服務(wù)注冊(cè),負(fù)載均衡,認(rèn)證授權(quán)等。這些框架在一定程度上封裝了底層邏輯,使開發(fā)人員能夠更快速地開發(fā)健壯的分布式系統(tǒng)。盡管Spring Cloud是一個(gè)出色的開發(fā)框架,但仍存在一些問題,如侵入性強(qiáng)、升級(jí)成本高、治理功能不完善、開發(fā)門檻高及不支持語言無關(guān)性。為解決這些問題,Service Mesh的出現(xiàn)為開發(fā)者帶來了全新的解決方案。作為基礎(chǔ)設(shè)施,Service Mesh可以與業(yè)務(wù)解耦,以Side Car(邊車)的形式部署,解決復(fù)雜環(huán)境下的微服務(wù)通信問題。
(二)服務(wù)網(wǎng)格
本文主要基于對(duì)Istio服務(wù)網(wǎng)格的研究。在云原生領(lǐng)域中,Istio和Kubernetes密不可分,因此備受關(guān)注。官方對(duì)Istio的描述是一個(gè)開放平臺(tái),用于連接、加固安全、控制和觀察服務(wù)?!斑B接”代表能夠智能地控制服務(wù)之間的調(diào)用流量,實(shí)現(xiàn)灰度升級(jí)、AB測(cè)試和紅黑部署等功能;“加固安全”表示自動(dòng)為服務(wù)之間的調(diào)用提供認(rèn)證、授權(quán)和加密;“控制”保證資源在消費(fèi)者之間公平分配;“觀察”表示能夠查看服務(wù)運(yùn)行過程中的各種數(shù)據(jù),例如日志、監(jiān)控和tracing,以了解服務(wù)的運(yùn)行情況。
Istio擴(kuò)展了Kubernetes的能力,利用強(qiáng)大的Envoy服務(wù)代理建立了一個(gè)可編程的、應(yīng)用感知的網(wǎng)絡(luò)。Istio與Kubernetes協(xié)作,為大規(guī)模的服務(wù)部署管理提供了統(tǒng)一、通用的流量管理、遙測(cè)和安全方案。
為了提供統(tǒng)一的上層入口,服務(wù)網(wǎng)格(Istio)演化出了控制面的概念,如圖1所示??刂泼尕?fù)責(zé)和所有的數(shù)據(jù)面(即邊車組成的網(wǎng)絡(luò))進(jìn)行交互,例如下發(fā)策略,采集監(jiān)控?cái)?shù)據(jù)等。
三、訪問控制
(一)訪問控制的意義
訪問控制是系統(tǒng)安全基礎(chǔ)設(shè)施中的一個(gè)基本要素。每個(gè)網(wǎng)絡(luò)安全工程師都希望在不影響工作流程的情況下,應(yīng)用最小特權(quán)原則、零信任原則、職責(zé)分離或其他安全方案的原則。訪問控制的主要目的是限制對(duì)信息和功能系統(tǒng)的訪問。當(dāng)訪問控制功能正常工作時(shí),它可以降低信息在沒有正確授權(quán)的情況下被非法訪問和數(shù)據(jù)泄露的風(fēng)險(xiǎn)。Algimantas在他的研究中提到[7],訪問控制在確?;谖⒎?wù)的系統(tǒng)的身份管理和網(wǎng)絡(luò)安全方面起著關(guān)鍵作用。訪問控制是微服務(wù)架構(gòu)的一個(gè)重要功能組件,因?yàn)樗?guī)范了對(duì)每個(gè)微服務(wù)內(nèi)部資源的訪問,并幫助維護(hù)數(shù)據(jù)的保密性和完整性。微服務(wù)中的訪問控制有助于執(zhí)行安全策略,防止對(duì)API、數(shù)據(jù)存儲(chǔ)和其他資源的未授權(quán)訪問。這確保只有經(jīng)過授權(quán)的實(shí)體才能訪問敏感信息。此外,訪問控制有助于增強(qiáng)審計(jì)功能,可以更方便地記錄誰在什么時(shí)間訪問了哪些資源。
(二)JSON Web Token
提到訪問控制,JWT是其中不可或缺的一環(huán)。JWT的全稱為Json Web Token,它是一個(gè)用于安全地以JSON的格式傳輸信息的標(biāo)準(zhǔn)(RFC 7519)。JWT是一種基于令牌(Token)的無狀態(tài)認(rèn)證機(jī)制。由于它是一個(gè)基于客戶端的無狀態(tài)會(huì)話,服務(wù)器不必完全依賴數(shù)據(jù)存儲(chǔ)介質(zhì)來保存會(huì)話信息。一個(gè)正確的JWT通常由三部分組成,分別是頭部(Header)、負(fù)載 (Payload)和簽名(Signature)。這三部分之間由英文的句點(diǎn)進(jìn)行分隔。頭部部分主要聲明了Token的類型和加密所使用的算法。負(fù)載部分的信息相對(duì)豐富,可以使用鍵值對(duì)格式自定義字段,當(dāng)然,也有一些預(yù)留字段用于聲明Token的簽發(fā)者、主體、過期時(shí)間等。簽名是其中最重要的部分,它由加密后的頭部和負(fù)載計(jì)算而來,用于確定Token的信息是否被非法篡改。用戶在訪問目標(biāo)資源時(shí),需要在請(qǐng)求的頭部中加入”Authorization: Bearer
(三)JSON Web Key
當(dāng)談及Istio的訪問控制時(shí),JWK同樣是必不可少的一個(gè)元素,并且與JWT相輔相成,共同完成了訪問控制的認(rèn)證和鑒權(quán)。JWK全稱是Json Web Key,顧名思義,它是一個(gè)密鑰,用于加密JWT。JWK采用鍵值(Key-Value)形式。在JWK中,常見的字段有:Kty(加密算法類型)、Use(密鑰用途)、Sig(簽名)、Alg(密鑰算法)和Kid(密鑰標(biāo)識(shí))。
(四)訪問控制在Istio中的實(shí)現(xiàn)
1.環(huán)境準(zhǔn)備
①準(zhǔn)備一臺(tái)安裝有Linux(Ubuntu或CentOS)系統(tǒng)的電腦或虛擬機(jī);②在設(shè)備中安裝好Docker和Kubernetes;③安裝Istio;④在期望的命名空間中安裝Istio的Bookinfo示例;⑤對(duì)集群和網(wǎng)格進(jìn)行調(diào)試,確保Bookinfo相關(guān)服務(wù)部署后可以正常訪問。
2.訪問控制的實(shí)踐
研究實(shí)踐的目的是為Productpage服務(wù)創(chuàng)建訪問控制規(guī)則,以確保只有攜帶正確Token的請(qǐng)求才能正常訪問Productpage服務(wù)。在Istio中啟用訪問控制功能需要兩個(gè)組件資源,它們分別稱為訪問控制(RequestAuthentication)和認(rèn)證策略(AuthorizationPolicy)。在Istio中,認(rèn)證策略的工作模式如圖2所示,以外部用戶訪問網(wǎng)格內(nèi)的服務(wù)為例。
首先,用戶需向認(rèn)證服務(wù)器請(qǐng)求一個(gè)JWT。該JWT使用加密密鑰JWK和相關(guān)負(fù)載信息生產(chǎn)。用戶攜帶JWT請(qǐng)求目標(biāo)服務(wù)時(shí),首先要經(jīng)過服務(wù)網(wǎng)格的網(wǎng)關(guān)IngressGateway。網(wǎng)關(guān)將流量導(dǎo)向目標(biāo)容器。流量進(jìn)入該容器時(shí),將被邊車劫持。邊車負(fù)責(zé)對(duì)JWT進(jìn)行校驗(yàn),如果合法有效,則允許訪問通過;否則,訪問將被拒絕。邊車中的相關(guān)配置由上文提到的Istio控制面下發(fā)。因此,在相關(guān)配置中,需要聲明密鑰信息和token中的信息用于解密和驗(yàn)證。在某些情況下,也需要通過聲明來決定哪些特定的服務(wù)需要開啟訪問控制功能。
在上面兩個(gè)配置文件樣例中,配置文件通過selector標(biāo)簽選擇器進(jìn)行指定資源的選擇,這個(gè)selector和k8s中的selector一致。
在部署時(shí),上述兩個(gè)配置文件缺一不可,必須同時(shí)存在,訪問控制功能才能被正確地開啟。當(dāng)然,訪問控制的范圍可以不局限于指定的應(yīng)用,還可以是k8s中的某個(gè)命名空間或者整個(gè)k8s集群。下面以RequestAuthentication配置為例。
通過觀察上述配置,可以發(fā)現(xiàn)控制范圍的主要參數(shù)為Selector和Namespace。當(dāng)存在Selector時(shí),訪問控制的生效范圍被縮小到指定的應(yīng)用 (或者是容器)上。當(dāng)Selector不存在,Namespace參數(shù)為Istio-System以外的集群名稱時(shí),生效范圍為指定的命名空間。當(dāng)Namespace參數(shù)為Istio-System,即Istio的安裝命名空間時(shí),生效范圍為整個(gè)集群。部署成功后,用戶需要在請(qǐng)求的Header中攜帶正確的Token來進(jìn)行訪問。若Token信息錯(cuò)誤或未攜帶Token,都會(huì)提示訪問錯(cuò)誤。這里使用Curl命令對(duì)服務(wù)進(jìn)行訪問測(cè)試。
四、結(jié)束語
當(dāng)下越來越多的業(yè)務(wù)系統(tǒng)或數(shù)字化解決方案正被部署在現(xiàn)代化的平臺(tái)上,例如各大廠商的云平臺(tái)。同時(shí),越來越多的開發(fā)者傾向于使用容器化和微服務(wù)的方式來構(gòu)建他們的程序。在過去,諸如負(fù)載均衡和路由等基礎(chǔ)能力是與軟件能力融為一體的;然而,現(xiàn)在云平臺(tái)將這些能力集成或封裝起來,使開發(fā)者能夠更方便地使用。云計(jì)算和微服務(wù)的流行降低了復(fù)雜業(yè)務(wù)場(chǎng)景的開發(fā)和后續(xù)維護(hù)難度,但也給外部訪問或服務(wù)間訪問的控制和審計(jì)帶來了挑戰(zhàn)。
借助Istio服務(wù)網(wǎng)格的能力,開發(fā)者可以輕松地接管網(wǎng)格內(nèi)部流量,對(duì)微服務(wù)進(jìn)行流量和安全上的統(tǒng)一管控和配置。通過Istio的安全策略配置,開發(fā)者和運(yùn)維人員可以輕松地基于JWT對(duì)訪問進(jìn)行把控,這是一種更為簡(jiǎn)單、有效、安全、可靠的訪問控制體系。
作者單位:王兆熠 于千慧 袁迎迎 魏星 中國(guó)聯(lián)合網(wǎng)絡(luò)通信有限公司濟(jì)南軟件研究院
參考文獻(xiàn)
[1]? Laura Mauersberger. Microservices: What They Are and Why Use Them [EB/OL]. 2017-08-14[2023-06-01]. https://www.leanix.net/en/blog/a-brief-history-of-microservices.
[2] 張玉超.計(jì)算機(jī)網(wǎng)絡(luò)與云計(jì)算技術(shù)的應(yīng)用[J].集成電路應(yīng)用,2023,40(02): 44-46.
[3] 張墨涵,王雪英,沈?qū)W東等. 微服務(wù)架構(gòu)技術(shù)與挑戰(zhàn)[J]. 網(wǎng)絡(luò)安全技術(shù)與應(yīng)用, 2023(02):3-4.
[4] 潘孝陽,黃曉芳.微服務(wù)框架的安全管控機(jī)制的設(shè)計(jì)[J].西南科技大學(xué)學(xué)報(bào),2018,33(4):71-75.
[5] 何修宇.微服務(wù)環(huán)境下訪問控制技術(shù)的研究與應(yīng)用[D].北京郵電大學(xué), 2018.
[6]Phil Calcado. Pattern: Service Mesh [EB/OL]. [2023-06-01]. https://philcalcado.com/2017/08/03/pattern_service_mesh.html.
[7] Algimantas Venckauskas,Donatas Kukta,Sarunas Grigaliunas,Rasa Bruzgien? . Enhancing Microservices Security with Token-Based Access Control Method [EB/OL]. [2023-06-01]. https://doi.org/10.3390/s23063363.
中國(guó)聯(lián)合網(wǎng)絡(luò)通信有限公司濟(jì)南軟件研究院 - 平臺(tái)架構(gòu)項(xiàng)目集 - 應(yīng)用交付能力項(xiàng)目組。
王兆熠(1998.07-),男,漢族,山東濟(jì)南,碩士,初級(jí)工程師,研究方向:人工智能與云計(jì)算運(yùn)維研發(fā);
于千慧(2000.04-),女,漢族,山東煙臺(tái),本科,研究方向:云計(jì)算運(yùn)維研發(fā);
袁迎迎(1996.05-),女,漢族,山東濰坊,碩士,初級(jí)工程師,研究方向:云計(jì)算運(yùn)維研發(fā);
魏星(1990.08-),男,漢族,山東臨沂,本科,初級(jí)工程師,研究方向:云計(jì)算運(yùn)維研發(fā)。