作者 |?匡大虎? 阿里巴巴技術(shù)專家
導(dǎo)讀:如何解決多租戶集群的安全隔離問題是企業(yè)上云的一個關(guān)鍵問題,本文主要介紹 Kubernetes 多租戶集群的基本概念和常見應(yīng)用形態(tài),以及在企業(yè)內(nèi)部共享集群的業(yè)務(wù)場景下,基于 Kubernetes 原生和 ACK 集群現(xiàn)有安全管理能力快速實(shí)現(xiàn)多租戶集群的相關(guān)方案。
這里首先介紹一下"租戶",租戶的概念不止局限于集群的用戶,它可以包含為一組計算,網(wǎng)絡(luò),存儲等資源組成的工作負(fù)載集合。而在多租戶集群中,需要在一個集群范圍內(nèi)(未來可能會是多集群)對不同的租戶提供盡可能的安全隔離,以較大程度的避免惡意租戶對其他租戶的***,同時需要保證租戶之間公平地分配共享集群資源。
在隔離的安全程度上,我們可以將其分為軟隔離 (Soft Multi-tenancy) 和硬隔離 (Hard Multi-tenancy) 兩種。
關(guān)于多租戶的不同應(yīng)用場景,在下節(jié)會有更細(xì)致的介紹。
下面介紹一下典型的兩種企業(yè)多租戶應(yīng)用場景和不同的隔離需求:
該場景下集群的所有用戶均來自企業(yè)內(nèi)部,這也是當(dāng)前很多 K8s 集群客戶的使用模式,因?yàn)榉?wù)使用者身份的可控性,相對來說這種業(yè)務(wù)形態(tài)的安全風(fēng)險是相對可控的,畢竟老板可以直接裁掉不懷好意的員工:)根據(jù)企業(yè)內(nèi)部人員結(jié)構(gòu)的復(fù)雜程度,我們可以通過命名空間對不同部門或團(tuán)隊(duì)進(jìn)行資源的邏輯隔離,同時定義以下幾種角色的業(yè)務(wù)人員:
在建立了基于用戶角色的訪問控制基礎(chǔ)上,我們還需要保證命名空間之間的網(wǎng)絡(luò)隔離,在不同的命名空間之間只能夠允許白名單范圍內(nèi)的跨租戶應(yīng)用請求。
另外,對于業(yè)務(wù)安全等級要求較高的應(yīng)用場景,我們需要限制應(yīng)用容器的內(nèi)核能力,可以配合 seccomp / AppArmor / SELinux 等策略工具達(dá)到限制容器運(yùn)行時刻 capabilities 的目的。
當(dāng)然 Kubernetes 現(xiàn)有的命名空間單層邏輯隔離還不足以滿足一部分大型企業(yè)應(yīng)用復(fù)雜業(yè)務(wù)模型對隔離需求,我們可以關(guān)注?Virtual Cluster,它通過抽象出更高級別的租戶資源模型來實(shí)現(xiàn)更精細(xì)化的多租管理,以此彌補(bǔ)原生命名空間能力上的不足。
在 SaaS 多租場景下, Kubernetes 集群中的租戶對應(yīng)為 SaaS 平臺中各服務(wù)應(yīng)用實(shí)例和 SaaS 自身控制平面,該場景下可以將平臺各服務(wù)應(yīng)用實(shí)例劃分到彼此不同的命名空間中。而服務(wù)的最終用戶是無法與 Kubernetes 的控制平面組件進(jìn)行交互,這些最終用戶能夠看到和使用的是 SaaS 自身控制臺,他們通過上層定制化的 SaaS 控制平面使用服務(wù)或部署業(yè)務(wù)(如下左圖所示)。
例如,某博客平臺部署在多租戶集群上運(yùn)行。在該場景下,租戶是每個客戶的博客實(shí)例和平臺自己的控制平面。平臺的控制平面和每個托管博客都將在不同的命名空間中運(yùn)行??蛻魧⑼ㄟ^平臺的界面來創(chuàng)建和刪除博客、更新博客軟件版本,但無法了解集群的運(yùn)作方式。
KaaS 多租場景常見于云服務(wù)提供商,該場景下業(yè)務(wù)平臺的服務(wù)直接通過 Kubernetes 控制平面暴露給不同租戶下的用戶,最終用戶可以使用 K8s 原生 API 或者服務(wù)提供商基于 CRDs/controllers 擴(kuò)展出的接口。出于隔離的最基本需求,這里不同租戶也需要通過命名空間進(jìn)行訪問上的邏輯隔離,同時保證不同租戶間網(wǎng)絡(luò)和資源配額上的隔離。
與企業(yè)內(nèi)部共享集群不同,這里的最終用戶均來自非受信域,他們當(dāng)中不可避免的存在惡意租戶在服務(wù)平臺上執(zhí)行惡意代碼,因此對于 SaaS/KaaS 服務(wù)模型下的多租戶集群,我們需要更高標(biāo)準(zhǔn)的安全隔離,而 Kubernetes 現(xiàn)有原生能力還不足以滿足安全上的需求,為此我們需要如安全容器這樣在容器運(yùn)行時刻內(nèi)核級別的隔離來強(qiáng)化該業(yè)務(wù)形態(tài)下的租戶安全。
在規(guī)劃和實(shí)施多租戶集群時,我們首先可以利用的是 Kubernetes 自身的資源隔離層,包括集群本身、命名空間、節(jié)點(diǎn)、pod 和容器均是不同層次的資源隔離模型。當(dāng)不同租戶的應(yīng)用負(fù)載能夠共享相同的資源模型時,就會存在彼此之間的安全隱患。為此,我們需要在實(shí)施多租時控制每個租戶能夠訪問到的資源域,同時在資源調(diào)度層面盡可能的保證處理敏感信息的容器運(yùn)行在相對獨(dú)立的資源節(jié)點(diǎn)內(nèi);如果出于資源開銷的角度,當(dāng)有來自不同租戶的負(fù)載共享同一個資源域時,可以通過運(yùn)行時刻的安全和資源調(diào)度控制策略減少跨租戶***的風(fēng)險。
雖然 Kubernetes 現(xiàn)有安全和調(diào)度能力還不足以完全安全地實(shí)施多租隔離,但是在如企業(yè)內(nèi)部共享集群這樣的應(yīng)用場景下,通過命名空間完成租戶間資源域的隔離,同時通過 RBAC、PodSecurityPolicy、NetworkPolicy 等策略模型控制租戶對資源訪問范圍和能力的限制,以及現(xiàn)有資源調(diào)度能力的結(jié)合,已經(jīng)可以提供相當(dāng)?shù)陌踩綦x能力。而對于 SaaS、KaaS 這樣的服務(wù)平臺形態(tài),我們可以通過阿里云容器服務(wù)近期推出的安全沙箱容器來實(shí)現(xiàn)容器內(nèi)核級別的隔離,能夠較大程度的避免惡意租戶通過逃逸手段的跨租戶***。
本節(jié)重點(diǎn)關(guān)注基于 Kubernetes 原生安全能力的多租戶實(shí)踐。
ACK 集群的授權(quán)分為 RAM 授權(quán)和 RBAC 授權(quán)兩個步驟,其中 RAM 授權(quán)作用于集群管理接口的訪問控制,包括對集群的 CRUD 權(quán)限(如集群可見性、擴(kuò)縮容、添加節(jié)點(diǎn)等操作),而 RBAC 授權(quán)用于集群內(nèi)部 Kubernetes 資源模型的訪問控制,可以做到指定資源在命名空間粒度的細(xì)化授權(quán)。
ACK 授權(quán)管理為租戶內(nèi)用戶提供了不同級別的預(yù)置角色模板,同時支持綁定多個用戶自定義的集群角色,此外支持對批量用戶的授權(quán)。如需詳細(xì)了解 ACK 上集群相關(guān)訪問控制授權(quán),請參閱相關(guān)幫助文檔。
NetworkPolicy 可以控制不同租戶業(yè)務(wù) pod 之間的網(wǎng)絡(luò)流量,另外可以通過白名單的方式打開跨租戶之間的業(yè)務(wù)訪問限制。
您可以在使用了 Terway 網(wǎng)絡(luò)插件的容器服務(wù)集群上配置 NetworkPolicy,這里可以獲得一些策略配置的示例。
PSP 是 K8s 原生的集群維度的資源模型,它可以在apiserver中pod創(chuàng)建請求的 admission 階段校驗(yàn)其運(yùn)行時刻行為是否滿足對應(yīng) PSP 策略的約束,比如檢查 pod 是否使用了 host 的網(wǎng)絡(luò)、文件系統(tǒng)、指定端口、PID namespace 等,同時可以限制租戶內(nèi)的用戶開啟特權(quán)(privileged)容器,限制掛盤類型,強(qiáng)制只讀掛載等能力;不僅如此,PSP 還可以基于綁定的策略給 pod 添加對應(yīng)的 SecurityContext,包括容器運(yùn)行時刻的 uid,gid 和添加或刪除的內(nèi)核 capabilities 等多種設(shè)置。
關(guān)于如何開啟 PSP admission 和相關(guān)策略及權(quán)限綁定的使用,可以參閱這里。
OPA(Open Policy Agent)是一種功能強(qiáng)大的策略引擎,支持解耦式的 policy decisions 服務(wù)并且社區(qū)已經(jīng)有了相對成熟的與 Kubernetes 的集成方案。當(dāng)現(xiàn)有 RBAC 在命名空間粒度的隔離不能夠滿足企業(yè)應(yīng)用復(fù)雜的安全需求時,可以通過 OPA 提供 object 模型級別的細(xì)粒度訪問策略控制。
同時 OPA 支持七層的 NetworkPolicy 策略定義及基于 labels/annotation 的跨命名空間訪問控制,可以作為 K8s 原生 NetworkPolicy 的有效增強(qiáng)。
在多租戶場景下,不同團(tuán)隊(duì)或部門共享集群資源,難免會有資源競爭的情況發(fā)生,為此我們需要對每個租戶的資源使用配額做出限制。其中 ResourceQuota 用于限制租戶對應(yīng)命名空間下所有 pod 占用的總資源 request 和 limit,LimitRange 用來設(shè)置租戶對應(yīng)命名空間中部署 pod 的默認(rèn)資源 request 和 limit 值。另外我們還可以對租戶的存儲資源配額和對象數(shù)量配額進(jìn)行限制。
關(guān)于資源配額的詳細(xì)指導(dǎo)可以參見這里。
從 1.14 版本開始 pod 的優(yōu)先級和搶占已經(jīng)從 beta 成為穩(wěn)定特性,其中 pod priority 標(biāo)識了 pod 在 pending 狀態(tài)的調(diào)度隊(duì)列中等待的優(yōu)先級;而當(dāng)節(jié)點(diǎn)資源不足等原因造成高優(yōu)先的 pod 無法被調(diào)度時,scheduler 會嘗試驅(qū)逐低優(yōu)先級的 pod 來保證高優(yōu)先級 pod 可以被調(diào)度部署。
在多租戶場景下,可以通過優(yōu)先級和搶占設(shè)置確保租戶內(nèi)重要業(yè)務(wù)應(yīng)用的可用性;同時 pod priority 可以和 ResouceQuota 配合使用,完成租戶在指定優(yōu)先級下有多少配額的限制。
注意:惡意租戶可以規(guī)避由節(jié)點(diǎn)污點(diǎn)和容忍機(jī)制強(qiáng)制執(zhí)行的策略。以下說明僅用于企業(yè)內(nèi)部受信任租戶集群,或租戶無法直接訪問 Kubernetes 控制平面的集群。
通過對集群中的某些節(jié)點(diǎn)添加污點(diǎn),可以將這些節(jié)點(diǎn)用于指定幾個租戶專門使用。在多租戶場景下,例如集群中的 GPU 節(jié)點(diǎn)可以通過污點(diǎn)的方式保留給業(yè)務(wù)應(yīng)用中需要使用到 GPU 的服務(wù)團(tuán)隊(duì)使用。集群管理員可以通過如 effect: "NoSchedule" 這樣的標(biāo)簽給節(jié)點(diǎn)添加污點(diǎn),同時只有配置了相應(yīng)容忍設(shè)置的 pod 可以被調(diào)度到該節(jié)點(diǎn)上。
當(dāng)然惡意租戶可以同樣通過給自身 pod 添加同樣的容忍配置來訪問該節(jié)點(diǎn),因此僅使用節(jié)點(diǎn)污點(diǎn)和容忍機(jī)制還無法在非受信的多租集群上保證目標(biāo)節(jié)點(diǎn)的獨(dú)占性。
關(guān)于如何使用節(jié)點(diǎn)污點(diǎn)機(jī)制來控制調(diào)度,請參閱這里。
在多租戶集群中不同租戶用戶共享同一套 etcd 存儲,在最終用戶可以訪問 Kubernetes 控制平面的場景下,我們需要保護(hù) secrets 中的數(shù)據(jù),避免在訪問控制策略配置不當(dāng)情況下的敏感信息泄露。為此可以參考 K8s 原生的 secret 加密能力,請參閱這里。
ACK 也提供了基于阿里云 KMS 服務(wù)的 secrets 加密開源解決方案,可以參閱這里。
在實(shí)施多租戶架構(gòu)時首先需要確定對應(yīng)的應(yīng)用場景,包括判斷租戶內(nèi)用戶和應(yīng)用負(fù)載的可信程度以及對應(yīng)的安全隔離程度。在此基礎(chǔ)上以下幾點(diǎn)是安全隔離的基本需求:
而對于如 SaaS、KaaS 等服務(wù)模型下,或者我們無法保證租戶內(nèi)用戶的可信程度時,我們需要采取一些更強(qiáng)有力的隔離手段,比如:
注意:文中圖片來源。
“阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實(shí)踐,做最懂云原生開發(fā)者的技術(shù)圈。”
文章名稱:K8s實(shí)踐|如何解決多租戶集群的安全隔離問題?-創(chuàng)新互聯(lián)
文章地址:http://sd-ha.com/article38/ipipp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、關(guān)鍵詞優(yōu)化、電子商務(wù)、網(wǎng)站設(shè)計、品牌網(wǎng)站制作、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容