作者:云鼎實驗室
原文鏈接:https://mp.weixin.qq.com/s/qLEjK1sx6P2KG9YgGkxqJg

背景

本文翻譯整理自rhino安全實驗室:近些年針對kubernetes的攻擊呈現愈演愈烈之勢,一旦攻擊者在kubernetes集群中站穩腳跟就會嘗試滲透集群涉及的所有容器,尤其是針對訪問控制和隔離做的不夠好的集群受到的損害也會越大。例如由unit 42研究人員檢測到的TeamTNT組織的惡意軟件Siloscape就是利用了泄露的AWS憑證或錯誤配置從而獲得了kubelet初始訪問權限后批量部署挖礦木馬或竊取關鍵信息如用戶名和密碼,組織機密和內部文件,甚至控制集群中托管的整個數據庫從而發起勒索攻擊。根據微步在線的統計上一次遭受其攻擊的IP地址90%以上屬于中國,因此需要安全人員及時關注并提前規避風險。Siloscape具體攻擊流程如圖1所示。

圖 1-Siloscape攻擊流程

Kubernetes集群中所有的資源的訪問和變更都是通過kubernetes API Server的REST API實現的,所以集群安全的關鍵點就在于如何識別并認證客戶端身份并且對訪問權限的鑒定,同時K8S還通過準入控制的機制實現審計作用確保最后一道安全底線。除此之外K8S還配有一系列的安全機制(如Secret和Service Account等)共同實現集群訪問控制的安全,具體請求如圖2所示:

圖 2-Kubernetes API請求

其中用戶所控制的kubectl即每個Node節點都會啟用的進程,可以把kubelet理解成【Server-Agent】架構中的agent,用來處理Master節點下發到本節點的任務,管理Pod和其中的容器,比如創建容器、Pod掛載數據卷、下載secret、獲取容器和節點狀態等工作。Kubelet會在API Server上注冊節點信息,定期向Master匯報節點資源使用情況。如果沒有做好相關的權限管控或其遭受了任何的攻擊都可能導致對k8s集群更廣泛的危害。如以下圖3操作。

圖 3-Kubectl操作

K8S認證鑒權

認證階段(Authentication)

認證階段即判斷用戶是否為能夠訪問集群的合法用戶,API Server目前提供了三種策略多種用戶身份認證方式,他們分別如下表1:

序號 認證策略 認證方式
1 匿名認證 Anonymous requests
2 白名單認證 BasicAuth認證
3 Token認證 Webhooks、Service Account Tokens、OpenID Connect Tokens等
4 X509證書認證 clientCA認證,TLS bootstrapping等

表 1-認證

其中X509是kubernetes組件間默認使用的認證方式,同時也是kubectl客戶端對應的kube-config中經常使用到的訪問憑證,是一種比較安全的認證方式。

鑒權階段(Authorization)

當API Server內部通過用戶認證后,就會執行用戶鑒權流程,即通過鑒權策略決定一個API調用是否合法,API Server目前支持以下鑒權策略

序號 鑒權策略 概述
1 Always 分為AlwaysDeny和AlwaysAllow,當集群不需要鑒權時選擇AlwaysAllow
2 ABAC 基于屬性的訪問控制
3 RBAC 基于角色的訪問控制
4 Node 一種對kubelet進行授權的特殊模式
5 Webhook 通過調用外部REST服務對用戶鑒權

表 2-鑒權

其中Always策略要避免用于生產環境中,ABAC雖然功能強大但是難以理解且配置復雜逐漸被RBAC替代,如果RBAC無法滿足某些特定需求,可以自行編寫鑒權邏輯并通過Webhook方式注冊為kubernetes的授權服務,以實現更加復雜的授權規則。而Node鑒權策略主要是用于對kubelet發出的請求進行訪問控制,限制每個Node只訪問它自身運行的Pod及相關Service、Endpoints等信息。

準入控制(Admission Control)

突破了如上認證和鑒權關卡之后,客戶端的調用請求還需要通過準入控制的層層考驗,才能獲得成功的響應,kubernetes官方標準的選項有30多個,還允許用戶自定義擴展。大體分為三類驗證型、修改型、混合型,顧名思義驗證型主要用于驗證k8s的資源定義是否符合規則,修改型用于修改k8s的資源定義,如添加label,一般運行在驗證型之前,混合型及兩者的結合。

AC以插件的形式運行在API Server進程中,會在鑒權階段之后,對象被持久化etcd之前,攔截API Server的請求,對請求的資源對象執行自定義(校驗、修改、拒絕等)操作。

Kubelet認證鑒權

認證

Kubelet目前共有三種認證方式:

1.允許anonymous,這時可不配置客戶端證書

authentication: 
anonymous:      
enabled: true

2.webhook,這時可不配置客戶端證書

authentication:   
webhook:    
enabled: true

3.TLS認證,也是目前默認的認證方式,對kubelet 的 HTTPS 端點啟用 X509 客戶端證書認證。

authentication:   
anonymous:       
enabled:false   
webhook:   
enabled: false  
x509:  
clientCAFile: xxxx

然而在實際環境當你想要通過kubectl命令行訪問kubelet時,無法傳遞bearer tokens,所以無法使用webhook認證,這時只能使用x509認證。

鑒權

kubelet可配置兩種鑒權方式分別為AlwaysAllow和Webhook,默認的及安全模式AlwaysAllow,允許所有請求。而Webhook的鑒權過程時委托給API Server的,使用API Server一樣的默認鑒權模式即RBAC。

通常在實際環境中需要我們通過TBAC為用戶配置相關權限,包括配置用戶組以及其相對應的權限。并最終將用戶和角色綁定完成權限的配置。

TLS bootstrapping

TLS在實際實現的時候成本較高,尤其集群中眾多的kubelet都需要與kube-API Server通信,如果由管理員管理證書及權限,很有可能會因為證書過期等問題出現混亂。這時候Kubelet TLS Bootstrapping就應運而生了。其主要實現兩個功能第一,實現kubelet與kube-API Server之間的自動認證通信;第二,限制相關訪問API Server的權限。

K8s目前默認通過TLS bootstrapping這套機制為每個kubelet配置簽名證書確保與API Server的交互安全。其核心思想是由kubelet自已生成及向API Server提交自已的證書簽名請求文件(CSR),k8s-master對CSR簽發后,kubelet再向API Server獲取自已的簽名證書,然后再正常訪問API Server。具體如圖所示:

圖 4-Kubelet TLS bootstrapping工作流程

Kubelet提權案例

攻擊路徑

為了演示kubelet提權攻擊,下面會展示一個簡單的攻擊場景,從獲取TLS引導憑據開始,最終獲得集群中集群管理員的訪問權限。

攻擊步驟

由于Kubelet需要依據憑據與API服務器通信,當攻擊者已經控制了集群中部分運行的容器后可以依托這些憑據訪問API服務器,并通過提權等手段來造成更大的影響。

1、首先攻擊者需要獲取到Node權限并找到kubelet TLS引導憑據,見下圖:

2、嘗試使用TLS憑證檢索有關kubernetes節點的信息,由于這些憑據僅有創建和檢索證書簽名請求的權限即引導憑據用來向控制端提交證書簽名請求(CSR)所以通常會看到找不到相關資源。

其中kubectl auth can-i子命令有助于確定當前憑證是否可以執行相關命令。

3、由于權限不足,可以使用get csr嘗試成為集群中的假工作節點,這樣將允許我們執行更多的命令如列出節點、服務和pod等,但是仍然無法獲取更高級別的數據。

我們使用cfssl為假節點生成CSR,同時將其提交至API Server供其自動批準該證書,通常情況下kube-controller-manager設置為自動批準與前綴一致的簽名請求,并發出客戶證書,隨后該節點的kubelet即可用于常用功能。

4、之后我們將批準通過的證書保存,此時即可查看節點信息等相關內容。 5、為了獲取更高的權限,我們嘗試使用另一個工作節點生成新的CSR,并要求API Server自動通過該證書。

6、我們將新批準的證書保存并以此證書檢查相關的pod信息發現有了密鑰信息,但是當我們嘗試去讀取的時候仍然顯示權限不足。

7、我們再次嘗試其他pod看是否擁有更高級別的權限,重復之前的證書制作并發送至API Server請求批準,這次權限明顯高了許多,我們成功獲取到了ca.crt以及token。

8、接下來我們嘗試使用該token,設置好環境變量并獲取默認命名空間中的所有資源。

9、最后我們檢查其角色的綁定,發現該服務賬戶已于“cluster-admin”角色綁定。

即其為最高權限的賬戶,至此我們可以執行各種不同的攻擊。如從工作節點的實例竊取服務賬戶令牌訪問云資源、列出配置、創建特權容器、后門容器等。

Kubernetes具有廣泛的攻擊面,其中kubelet尤為重要,本案例通過泄露的憑據開始,通過列出相關節點、實例生成和提交CSR充當工作節點,并最終獲得集群管理員訪問權限從而竊取TLS Bootstrap憑據。

緩解措施

在實際生產環境中,一定要保護好kubelet憑證的數據避免類似的提權事件發生,同時還可以搭配以下幾點方式來加固k8s的安全。

1、保護好元數據,元數據由于其敏感性務必在服務后臺加強對元數據讀取的管控,避免攻擊者通過元數據讀取到相關憑據信息,哪怕是低權限的憑據。

2、通過更安全的網絡策略避免類似提權事件發生,默認情況下拒絕所有出站通信,然后根據需要將出站流量列入白名單。在pod上應用該網絡策略,因為需要訪問API服務器和元數據的是node而不是pod。

3、啟用類似Istio這樣的服務網格并配置egress gateway,這將阻止部署在服務網格中的任何容器與任何未經授權的主機進行通信

4、限制對主節點的網絡訪問,如上案例基本都發生在集群,所以傳統的vpn也無法阻止相關危害,用戶可以直接限制對主服務器的訪問來避免k8s的許多攻擊。

參考文獻

https://www.cnblogs.com/huanglingfa/p/13773234.html

https://cloud.tencent.com/developer/article/1553947

https://kubernetes.io/zh/docs/reference/access-authn-authz/authentication/

https://mritd.com/2018/01/07/kubernetes-tls-bootstrapping-note/


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1683/