容器的靈活性和可擴展性鼓勵許多開發(fā)人員將工作負(fù)載轉(zhuǎn)移到Kubernetes。盡管Kubernetes具有許多優(yōu)勢,但它也帶來了新的安全挑戰(zhàn)。因此了解容器化環(huán)境(尤其是Kubernetes)中存在的各種安全風(fēng)險至關(guān)重要。

要了解如何保護Kubernetes環(huán)境,就要了解其相關(guān)的攻擊面。從Windows和Linux開始,MITRE ATT&CK中那些戰(zhàn)術(shù)和技術(shù)知識庫,幫助企業(yè)更加深入去了解其環(huán)境中的攻擊狀況,并確保他們對各種風(fēng)險有足夠的檢測和緩解措施。

針對Kubernetes的安全攻防,雖然攻擊技術(shù)與針對Linux或Windows的攻擊技術(shù)不同,但戰(zhàn)術(shù)實際上是相似的,我們基于目前在ATT&CK領(lǐng)域的研究,創(chuàng)建一個類似ATT&CK的矩陣——Kubernetes攻擊矩陣(如圖1所示),將它們作為一個框架,描述跨越Kubernetes基礎(chǔ)設(shè)施和應(yīng)用的關(guān)鍵攻擊戰(zhàn)術(shù)和技術(shù)。

圖1:Kubernetes攻防矩陣

一、初始訪問

初始訪問戰(zhàn)術(shù)包括所有用于獲得資源訪問權(quán)限的攻擊技術(shù)。在容器化環(huán)境中,這些技術(shù)可以實現(xiàn)對集群的初始訪問。這種訪問可以直接通過集群管理工具來實現(xiàn),也可以通過獲得對部署在集群上的惡意軟件或脆弱資源的訪問來實現(xiàn)。

1.云賬戶訪問憑證泄漏

用戶將項目代碼上傳到Github等第三方代碼托管平臺,或者個人辦公PC被黑等都可能導(dǎo)致云賬號訪問憑證發(fā)生泄漏,如果泄漏的憑證被惡意利用,可能會導(dǎo)致用戶上層的資源(如ECS)被攻擊者控制,進而導(dǎo)致K8S集群被接管。

2.運行惡意鏡像

在集群中運行一個不安全的鏡像可能會破壞整個集群的安全。進入私有鏡像倉庫的攻擊者可以在鏡像倉庫中植入不安全的鏡像。而這些不安全的鏡像極有可能被用戶拉取出來運行。此外,用戶也可能經(jīng)常使用公有倉庫(如Docker Hub)中不受信任的惡意鏡像?;诓皇苄湃蔚母R像來構(gòu)建新鏡像也會導(dǎo)致類似的結(jié)果。

3.Kubeconfig/token泄漏

kubeconfig文件中包含了關(guān)于Kubernetes集群的詳細(xì)信息,包括集群的位置和相關(guān)憑證。如果集群以云服務(wù)的形式托管(如AKS或GKE),該文件會通過云命令下載到客戶端。如果攻擊者獲得該文件的訪問權(quán),那么他們就可以通過被攻擊的客戶端來訪問集群。

4.應(yīng)用漏洞

在集群中運行一個面向互聯(lián)網(wǎng)的易受攻擊的應(yīng)用程序,攻擊者就可以據(jù)此實現(xiàn)對集群的初始訪問。例如那些運行有RCE漏洞的應(yīng)用程序的容器就很有可能被利用。如果服務(wù)賬戶被掛載到容器(Kubernetes中的默認(rèn)行為)上,攻擊者就能夠使用這個服務(wù)賬戶憑證向API服務(wù)器發(fā)送請求。

二、執(zhí)行

執(zhí)行是指攻擊者用來在集群內(nèi)運行其代碼的技術(shù)。

1.在容器中執(zhí)行命令

擁有權(quán)限的攻擊者可以使用exec命令(”kubectl exec”)在集群的容器中運行惡意命令。在這種方法中,攻擊者可以使用合法的鏡像,如操作系統(tǒng)鏡像(如Ubuntu)作為后門容器,并通過使用”kubectl exec”遠(yuǎn)程運行其惡意代碼。

2.創(chuàng)建新的容器或pod執(zhí)行命令

攻擊者可能試圖通過部署一個新的容器在集群中運行他們的代碼。如果攻擊者有權(quán)限在集群中部署pod或controller(如DaemonSet / ReplicaSet / Deployment),就可以創(chuàng)建一個新的資源來運行其代碼。

3.容器內(nèi)應(yīng)用漏洞利用

在集群中部署的應(yīng)用程序,如果存在遠(yuǎn)程代碼執(zhí)行漏洞,攻擊者就可以在集群中運行代碼。如果服務(wù)賬戶被掛載到容器中(Kubernetes中的默認(rèn)行為),攻擊者將能夠使用該服務(wù)賬戶憑證向API服務(wù)器發(fā)送請求。

4.在容器內(nèi)運行的SSH服務(wù)

運行在容器內(nèi)的SSH服務(wù)可能被攻擊者利用。如果攻擊者通過暴力破解或者其他方法(如釣魚)獲得了容器的有效憑證,他們就可以通過SSH獲得對容器的遠(yuǎn)程訪問。

三、持久化

持久化戰(zhàn)術(shù)是指攻擊者用來保持對集群持久訪問的技術(shù),以防他們最初的立足點丟失。

1.后門容器

攻擊者在集群的容器中運行他們的惡意代碼。通過使用Kubernetes控制器,如DaemonSets或Deployments,攻擊者可以確保在集群中的一個或所有節(jié)點上運行確定數(shù)量的容器。

2.掛載宿主機敏感目錄的容器

攻擊者在運行新的容器時,使用-v參數(shù),將宿主機的一些敏感目錄或文件,例如/root/.ssh/,/etc,/var/spool/cron/,/var/run/docker.sock,/proc/sys/kernel/core_pattern,/var/log等掛載到容器內(nèi)部目錄,進而寫入ssh key或者crond命令等,來獲取宿主機權(quán)限,最終達到持久化的目的。

3.Kubernetes CronJob

Kubernetes CronJob是基于調(diào)度的Job執(zhí)行,類似于Linux的cron,我們可以利用k8S CronJob產(chǎn)生一個pod,然后在里面運行給定的命令,進而實現(xiàn)持久化。

4.特權(quán)容器

用docker–privileged可以啟動docker的特權(quán)模式,這種模式允許我們以其宿主機具有(幾乎)所有能力來運行容器,包括一些內(nèi)核特性和設(shè)備訪問,這種模式下運行容器會讓docker擁有宿主機的訪問權(quán)限,并帶有一些不確定的安全風(fēng)險。

5.Webshell

如果容器內(nèi)運行的Web服務(wù)存在一些遠(yuǎn)程命令執(zhí)行(RCE)漏洞或文件上傳漏洞,攻擊者可能利用該類漏洞寫入WebShell,由于主機環(huán)境和容器環(huán)境的差異性,一些主機上的安全軟件可能無法查殺此類WebShell ,所以攻擊者也會利用此類方法進行權(quán)限維持。

四、權(quán)限提升

權(quán)限提升戰(zhàn)術(shù)包括攻擊者用來在環(huán)境中獲得比他們目前擁有的更高權(quán)限的技術(shù)。在容器化環(huán)境中,這可能包括從容器中獲得對節(jié)點的訪問,在集群中獲得更高權(quán)限,甚至獲得對云資源的訪問。

1.特權(quán)容器

特權(quán)容器是一個擁有主機所有能力的容器,它解除了普通容器的所有限制。實際上,這意味著特權(quán)容器幾乎可以做主機上可操作的所有行為。攻擊者如果獲得了對特權(quán)容器的訪問權(quán),或者擁有創(chuàng)建新的特權(quán)容器的權(quán)限(例如,通過使用被攻擊的pod的服務(wù)賬戶),就可以獲得對主機資源的訪問權(quán)。

2.創(chuàng)建高權(quán)限的binding roles

基于角色的訪問控制(RBAC)是Kubernetes的一個關(guān)鍵安全功能。RBAC可以限制集群中各種身份操作的權(quán)限。Cluster-admin是Kubernetes中一個內(nèi)置的高權(quán)限角色。如果攻擊者有權(quán)限在集群中創(chuàng)建綁定權(quán)限,那么就可以創(chuàng)建一個綁定到集群管理員ClusterRole或其他高權(quán)限的角色。

3.掛載宿主機敏感目錄的容器

hostPath mount可以被攻擊者用來獲取對底層主機的訪問權(quán),從而從容器逃逸到主機。

4.通過泄漏的配置信息訪問其他資源

如果Kubernetes集群部署在云中,在某些情況下,攻擊者可以利用他們對單個容器的訪問,獲得對集群外其他云資源的訪問。例如,在AKS中,每個節(jié)點都包含服務(wù)憑證,存儲在/etc/kubernetes/azure.json中。AKS使用這個服務(wù)主體來創(chuàng)建和管理集群運行所需的Azure資源。

默認(rèn)情況下,該服務(wù)委托人在集群的資源組中有貢獻者的權(quán)限。若攻擊者獲得了該服務(wù)委托人的文件訪問權(quán)(例如通過hostPath掛載),就可以使用其憑證來訪問或修改云資源。

五、防御繞過

防御繞過戰(zhàn)術(shù)包括攻擊者用來逃避檢測和隱藏其活動的技術(shù)。

1.清除容器日志

攻擊者可能會刪除被攻擊的容器上的應(yīng)用程序或操作系統(tǒng)日志,以試圖防止檢測到他們的活動。

2.刪除Kubernetes日志

Kubernetes日志,記錄集群中資源的狀態(tài)變化和故障。事件包括容器的創(chuàng)建、鏡像的拉取、或一個節(jié)點上的pod調(diào)度。Kubernetes日志對于識別集群中發(fā)生的變化非常有用。因此,攻擊者可能想刪除這些事件(例如,通過使用”kubectl delete events-all”),以免檢測到他們在集群中的活動。

3.創(chuàng)建與已有應(yīng)用相似名稱的惡意Pod/container

由控制器(如Deployment或DaemonSet)創(chuàng)建的Pod在其名稱中具有隨機后綴。攻擊者可以利用這一事實,將他們的后門pods命名為由現(xiàn)有控制器創(chuàng)建的pod的名稱。例如,攻擊者可以創(chuàng)建一個名為coredns-{隨機后綴}的惡意pod,看起來與CoreDNS部署有關(guān)。另外,攻擊者可以在管理容器所在的kube-system命名空間中部署他們的容器。

4.通過代理隱藏訪問ip

K8S API Server會記錄請求IP,攻擊者可以使用代理服務(wù)器來隱藏他們源IP。具體來說,攻擊者經(jīng)常使用匿名網(wǎng)絡(luò)(如TOR)進行活動。這可用于與應(yīng)用程序本身或與API服務(wù)器進行通信。

六、憑證訪問

憑證訪問戰(zhàn)術(shù)包括攻擊者用來竊取憑證的一系列技術(shù)。在容器化環(huán)境中,這包括運行中的應(yīng)用程序的憑證、身份、存儲在集群中的秘鑰或云憑證。

1.Kubernetes Secret

Kubernetes secret也是K8S中的一個資源對象,主要用于保存輕量的敏感信息,比如數(shù)據(jù)庫用戶名和密碼,令牌,認(rèn)證密鑰等。Secret可以通過pod配置進行使用。有權(quán)限從API服務(wù)器中檢索Secret的攻擊者(例如,通過使用pod服務(wù)賬戶)就訪問Secret中的敏感信息,其中可能包括各種服務(wù)的憑證。

2.云服務(wù)憑證

當(dāng)集群部署在云中時,在某些情況下,攻擊者可以利用他們對集群中的容器的訪問來獲得云的憑證。例如,在AKS中,每個節(jié)點都包含服務(wù)憑證。

3.訪問容器服務(wù)賬戶

Service Account Tokens是pod 內(nèi)部訪問K8S apiserver的一種特殊的認(rèn)證方式。攻擊者可以通過獲取Service Account Tokens,進而訪問K8S apiserver。

4.配置文件中的應(yīng)用憑證

開發(fā)人員在Kubernetes配置文件中存儲敏感信息,例如pod配置中的環(huán)境變量。攻擊者如果能夠通過查詢API服務(wù)器或訪問開發(fā)者終端上的這些文件來訪問這些配置,就可以竊取存儲的敏感并加以利用,例如數(shù)據(jù)庫,消息隊列的賬號密碼等。

七、發(fā)現(xiàn)

發(fā)現(xiàn)戰(zhàn)術(shù)是攻擊者用來探索他們獲得環(huán)境訪問權(quán)限的技術(shù)。這種探索有助于攻擊者進行橫向移動并獲得對額外資源的訪問權(quán)限。

1.訪問Kubernetes API

Kubernetes API是進入集群的網(wǎng)關(guān)。集群中的行動是通過向RESTful API發(fā)送各種請求來執(zhí)行的。集群的狀態(tài),包括部署在其上的所有組件,可以由API服務(wù)器檢索。攻擊者可以發(fā)送API請求來探測集群,并獲得關(guān)于集群中的容器、秘密和其他資源的信息。

2.訪問Kubelet API

Kubelet是安裝在每個節(jié)點上的Kubernetes代理。Kubelet負(fù)責(zé)正確執(zhí)行分配給該節(jié)點的pod。如果Kubelet暴露了一個不需要認(rèn)證的只讀API服務(wù)(TCP端口10255),攻擊者獲得主機的網(wǎng)絡(luò)訪問權(quán)(例如,通過在被攻擊的容器上運行代碼)后就可以向Kubelet API發(fā)送API請求。具體來說,查詢https://[NODE IP]:10255/pods/可以檢索節(jié)點上正在運行的pod。https://[NODE IP]:10255/spec/可以檢索節(jié)點本身的信息,例如CPU和內(nèi)存消耗。

3.集群中的網(wǎng)絡(luò)和服務(wù)

攻擊者可以在cluster中發(fā)起內(nèi)網(wǎng)掃描來發(fā)現(xiàn)不同pod所承載的服務(wù),并通過其漏洞進行后續(xù)滲透。

4.訪問Kubernetes dashboard

Kubernetes dashboard是一個基于Web的用戶界面,用于監(jiān)控和管理Kubernetes集群。通過儀表盤,用戶可以使用其服務(wù)賬戶(kubernetes-dashboard)在集群中執(zhí)行操作,其權(quán)限由該服務(wù)賬戶綁定或集群綁定決定。攻擊者如果獲得了對集群中容器的訪問權(quán),就可以使用其網(wǎng)絡(luò)訪問儀表盤的pod。因此,攻擊者可以使用儀表盤的身份檢索集群中各種資源的信息。

5.查詢metadata API 服務(wù)

云提供商提供實例元數(shù)據(jù)服務(wù),用于檢索虛擬機的信息,如網(wǎng)絡(luò)配置、磁盤和SSH公鑰。該服務(wù)可通過一個不可路由的IP地址被虛擬機訪問,該地址只能從虛擬機內(nèi)部訪問。攻擊者獲得容器訪問權(quán)后,就可以查詢元數(shù)據(jù)API服務(wù),從而獲得底層節(jié)點的信息。

八、橫向移動

橫向移動戰(zhàn)術(shù)包括攻擊者用來在受害者的環(huán)境中移動的技術(shù)。在容器化環(huán)境中,這包括從對一個容器的特定訪問中獲得對集群中各種資源的訪問權(quán)限,從容器中獲得對底層節(jié)點的訪問權(quán)限,或獲得對云環(huán)境的訪問權(quán)限。

1.訪問云資源

攻擊者可能會從一個被攻擊的容器轉(zhuǎn)移到云環(huán)境中。

2.容器服務(wù)賬戶

攻擊者獲得對集群中容器的訪問權(quán)后,就可能會使用掛載的服務(wù)賬戶令牌向API服務(wù)器發(fā)送請求,并獲得對集群中其他資源的訪問權(quán)限。

3.集群內(nèi)網(wǎng)絡(luò)和服務(wù)

默認(rèn)狀態(tài)之下,通過Kubernetes可以實現(xiàn)集群中pod之間的網(wǎng)絡(luò)連接。攻擊者獲得對單個容器的訪問權(quán)后,就可能會利用它來實現(xiàn)集群中另一個容器的網(wǎng)絡(luò)訪問權(quán)限。

4.訪問Tiller endpoint

Helm是一個流行的Kubernetes軟件包管理器,由CNCF維護。Tiller在集群中暴露了內(nèi)部gRPC端點,監(jiān)聽端口為44134。默認(rèn)情況下,這個端點不需要認(rèn)證。攻擊者可以在任何可以訪問Tiller服務(wù)的容器上運行代碼,并使用Tiller的服務(wù)賬戶在集群中執(zhí)行操作,而該賬戶通常具有較高的權(quán)限。

九、危害

影響戰(zhàn)術(shù)包括攻擊者用來破壞、濫用或擾亂環(huán)境的正常行為的技術(shù)。

1.數(shù)據(jù)破壞

攻擊者可能試圖破壞集群中的數(shù)據(jù)和資源,包括刪除部署、配置、存儲和計算資源。

2.資源劫持

攻擊者可能會濫用失陷的資源來運行任務(wù)。一個常見情況是攻擊者使用失陷的資源來進行數(shù)字貨幣挖掘。攻擊者如果能夠訪問集群中的容器或有權(quán)限創(chuàng)建新的容器,就可能利用失陷的資源來進行這種活動。

3.拒絕服務(wù)

攻擊者可能試圖進行拒絕服務(wù)攻擊,讓合法用戶無法使用服務(wù)。在容器集群中,這包括損害容器本身、底層節(jié)點或API服務(wù)器的可用性。

4.加密勒索

惡意的攻擊者可能會加密數(shù)據(jù),進而勒索用戶,索要匿名的數(shù)字貨幣。

了解容器化環(huán)境的攻擊面是為這些環(huán)境建立安全解決方案的第一步。上面介紹的矩陣可以幫助企業(yè)確定其防御系統(tǒng)在應(yīng)對針對Kubernetes的不同威脅方面存在的差距。

此外,為了確保應(yīng)用的安全,系統(tǒng)管理員還應(yīng)該按照該指南謹(jǐn)慎行事,及時打補丁、進行更新和升級,降低風(fēng)險。NSA和CISA還建議定期對K8S設(shè)置進行審查并進行漏洞掃描,確??紤]到了所有相關(guān)風(fēng)險并及時應(yīng)用了安全補丁。

如欲了解更多詳細(xì)信息,請關(guān)注公眾號「青藤技術(shù)服務(wù)」,查看《K8S加固指南》中文版本報告全文。

分享到

songjy