保護(hù)Kubernetes集群的三大要素
譯文隨著基于容器的技術(shù)迅速得到采用,組織日益關(guān)注Kubernetes集群的安全性。雖然云和企業(yè)發(fā)行版提供了可靠的安全功能,但它們需要根據(jù)組織的安全要求進(jìn)行調(diào)整。
本文將介紹保護(hù)Kubernetes集群需要考慮的三個(gè)基本方面:
- 基于角色的訪問(wèn)控制(RBA)
- 開(kāi)放策略代理(OPA)
- 網(wǎng)絡(luò)策略
基于角色的訪問(wèn)控制
假設(shè)一家組織有三個(gè)應(yīng)用程序團(tuán)隊(duì)(藍(lán)隊(duì)、綠隊(duì)和紅隊(duì))。由于這些團(tuán)隊(duì)開(kāi)發(fā)不同的產(chǎn)品,應(yīng)該授予它們?cè)L問(wèn)Kubernetes集群的不同權(quán)限。比如說(shuō),綠隊(duì)和紅隊(duì)不應(yīng)查看、訪問(wèn)或刪除藍(lán)隊(duì)部署的集群。
RBAC是一種控制用戶可以訪問(wèn)哪些Kubernetes資源的方法。雖然RBAC在默認(rèn)情況下啟用,但必須加以配置才能使用它。
RBAC有五個(gè)關(guān)鍵要素:
- 主題——用戶和進(jìn)程
- 資源——應(yīng)限制訪問(wèn)的對(duì)象
- 動(dòng)作——可以執(zhí)行的操作(常常名為動(dòng)作)集合
- 角色——將API資源與動(dòng)作連接起來(lái)的對(duì)象
- 角色綁定——將角色與主題連接起來(lái)的對(duì)象
不妨回到前面的那家組織,定義只有藍(lán)隊(duì)才能創(chuàng)建、刪除和列出Pod、部署(Deployment)和服務(wù)(Service)的策略。
我們先創(chuàng)建一個(gè)名為“role-blue”的角色對(duì)象,我們?cè)谄渲卸x可以對(duì)特定的Kubernetes資源執(zhí)行的操作。在這個(gè)特定情況下,角色允許對(duì)資源:Pod、部署和服務(wù)執(zhí)行“創(chuàng)建”、“刪除”和“列表”等操作。
接下來(lái),我們創(chuàng)建一個(gè)名為“blue-rb”的角色綁定。這個(gè)角色綁定屬于“blue-ns”,它將上面創(chuàng)建的角色“role-blue”與名為“blue”的藍(lán)隊(duì)聯(lián)系起來(lái)。
一旦將這些資源運(yùn)用到集群,“blue”團(tuán)隊(duì)的用戶就能夠執(zhí)行“role-blue”中定義的操作。
開(kāi)放策略代理
開(kāi)放策略代理(OPA)是一種通用策略引擎,可以跨整個(gè)堆棧統(tǒng)一策略實(shí)施。它的高級(jí)聲明性語(yǔ)言提供了將策略指定為代碼的靈活性。您可以使用OPA在Kubernetes、CI/CD管道或API 網(wǎng)關(guān)中實(shí)施策略。不妨深入了解如何在Kubernetes中使用和實(shí)施它。
Kubernetes實(shí)施OPA的機(jī)制名為Gatekeeper。它被設(shè)計(jì)和部署成準(zhǔn)入控制器,負(fù)責(zé)攔截請(qǐng)求、處理請(qǐng)求,并返回允許或拒絕的響應(yīng)。
如果允許,對(duì)象會(huì)部署到集群上;否則,請(qǐng)求將被拒絕,并向用戶提供反饋。管理員可以定義策略,指示Kubernetes限制容器或命名空間可以消耗的內(nèi)存或CPU等資源,僅批準(zhǔn)基于來(lái)自特定注冊(cè)中心的鏡像的容器,限制NodePort服務(wù)創(chuàng)建,或執(zhí)行標(biāo)準(zhǔn)命名。
比如說(shuō),這是一個(gè)示例模板和約束策略,只有在命名空間中配置ResourceQuota后才允許創(chuàng)建Pod。
網(wǎng)絡(luò)策略
網(wǎng)絡(luò)策略與常規(guī)防火墻非常相似,不同之處在于它們以應(yīng)用程序?yàn)橹行摹D鸀閼?yīng)用程序定義網(wǎng)絡(luò)策略后,Kubernetes會(huì)自動(dòng)將這些規(guī)則運(yùn)用于關(guān)聯(lián)的容器,這是由于容器會(huì)在高度動(dòng)態(tài)的環(huán)境中不斷創(chuàng)建和終止。網(wǎng)絡(luò)策略控制進(jìn)出這些容器的流量。
默認(rèn)情況下,進(jìn)出Pod的網(wǎng)絡(luò)流量不受限制。一個(gè)好的開(kāi)頭是設(shè)置拒絕所有流量的規(guī)則,然后只允許必要的流量。
默認(rèn)情況下,Kubernetes使用平面網(wǎng)絡(luò)結(jié)構(gòu),允許任何Pod與集群中的其他Pod或服務(wù)進(jìn)行通信。在有多個(gè)應(yīng)用程序或多級(jí)應(yīng)用程序的集群中,縱深防御在保護(hù)通信層方面起到了關(guān)鍵作用。網(wǎng)絡(luò)策略使我們能夠做到這一點(diǎn)。
這是一個(gè)“app1-network-policy”,它在“blue”命名空間中為標(biāo)簽為“role=db”的Pod運(yùn)用以下規(guī)則:
- [Ingress] 允許通過(guò)端口6379的來(lái)自ipBlock 172.17.0.0/24的連接。
- [Ingress] 如果來(lái)自其他Pod的連接被標(biāo)記為“role=frontend”,并且如果屬于端口6379上帶有標(biāo)簽“project=myproject”的命名空間,允許這些連接。
- [Egress] Pod可以通過(guò)5978端口與IP范圍為10.0.0.0/24的其他Pod進(jìn)行通信。
原文標(biāo)題:??3 key elements to protect a Kubernetes cluster???,作者:Avinash Desireddy