如何保證Kubernetes中部署的安全?
對于在共享基礎設施上運行的容器化應用程序來說,安全是至關重要的。隨著越來越多的組織將其容器工作負載轉移到Kubernetes,K8s已經成為容器協調的首選平臺。而隨著這一趨勢,威脅和新的攻擊方式也越來越多,有必要加強所有的安全層。
在Kubernetes中,安全問題有兩個方面:集群安全和應用安全。我們已經在另一篇文章中介紹了集群安全。在這篇文章中,我們將探討如何確保Kubernetes部署和一般應用程序的安全。
0x01 基礎回顧
在這里,我只想快速回顧一下基礎知識。Pod是邏輯原子單元,在集群中運行一個或多個容器;它被其他資源包裹著,如ReplicaSet、Deployment、StatefulSets等。有各種方法來提高在Kubernetes中運行的應用程序的安全態勢。
在Kubernetes部署中,模板部分包含pod規格,它定義了這個部署要運行的工作負載。在下面的模板中,有幾個與安全有關的部分用黑體字突出顯示。

現在,讓我們仔細看一下pod規格中的這些部分。
0x02 服務賬戶
當容器內的進程與API服務器進行通信時,你應該使用服務賬戶進行驗證。如果你沒有為pod定義一個服務賬戶,那么將使用默認的賬戶。建議創建一個特定于應用程序的服務賬戶,該賬戶具有執行該功能所需的最小權限。
如果你選擇給默認的服務賬戶賦予角色,這些特權將對每個沒有在規格中定義服務賬戶的pod可用。這可能會無意中允許對其他應用程序的過度許可,因此不建議這樣做。在Kubernetes 1.6及以上版本中,你可以通過設置退出為容器中的服務賬戶自動裝載API令牌。

0x03 安全環境
安全環境定義了pod和容器中的權限和訪問控制設置。下面是幾個安全環境的重要內容。
- seLinuxOptions(安全增強型Linux):此應用提供更細化的訪問和控制策略的機制。
- runAsUser和runAsGroup:特定的UserID或GroupID(UID和GID)來運行容器進程的入口點;如果沒有指定,則各自默認為鏡像元數據中指定的用戶(在Windows容器中都不適用)。
- privileged:以特權模式運行容器,默認為假;與主機上的root(具有所有能力)相同。
- runAsNonRoot:容器必須以非root用戶的身份運行(如果Kubelet在運行時驗證的UID為0,容器將無法啟動)。
- 能力:在運行容器時添加或刪除能力;容器運行時授予能力,這是默認的。
- procMount:指定容器的proc mount類型,默認為DefaultProcMount;這使用容器運行時默認的只讀和屏蔽的路徑。
- AppArmor:與SELinux類似,可以通過配置文件限制單個程序的能力。
- seccompProfile:容器要使用的secomp選項;過濾進程的系統調用。
- readOnlyRootFilesystem:將容器中的根文件系統掛載為只讀,默認為假。
- AllowPrivilegeEscalation:決定一個進程是否可以獲得比它的父進程更多的權限;如果容器以特權運行或具有CAP_SYS_ADMIN能力,它總是為真。這個字段必須明確設置為false,因為它的默認行為可以在PSP中被改變。
0x04 圖像
源圖像通常取自各種公共資源庫;開發人員將他們的應用程序代碼放在這些基礎圖像之上。你也可以直接從流行的公共注冊中心部署OOTB應用程序。
關于圖像有三件事要記住,我們將在下面討論。
01 圖像的來源
確保你從一個受信任的注冊中心獲得圖像。攻擊者可以在公共注冊表中放置一個惡意的圖像,這反過來會導致數據泄漏或攻擊者獲得對你的集群的訪問權等問題。一些公共圖像也被發現被加密貨幣礦工所感染。
作為一個組織,你可以創建基礎鏡像的黃金鏡像,并與開發人員分享,然后他們可以從內部存儲庫中安全地使用這些鏡像。
02 無分布式和容器優化的圖像
這些鏡像是安全的,并且經過優化,可以在容器中運行,為潛在的攻擊提供了一個較小的表面積。它們只包含你的應用程序和依賴的庫,而軟件包管理器、外殼和通常在Linux操作系統上可用的程序被刪除。
03 持續的漏洞掃描
強烈建議實施持續的圖像掃描,以檢測容器圖像中的漏洞、惡意軟件和其他安全威脅(例如,未經授權連接到不信任的網絡)。有許多可用的安全解決方案,包括Kubescape。
0x05 Pod安全準入
你可能聽說過PodSecurityPolicies,它現在已經被棄用,并將在Kubernetes 1.25中被刪除。Pod Security Admission(PSA)將取代它,處理安全和其他安全相關的要求。它為pod定義了不同的隔離級別,如特權、基線和限制。PSA目前在1.23的測試階段。
這些級別在Kubernetes的Pod安全標準中有詳細描述,但下面是Kubernetes自己文檔中的摘要。

Pod Security admission與內置的Pod Security admission控制器一起工作;你需要在集群中使用-feature-gate="...,PodSecurity=true "或通過使用pod admission webhook來啟用它。它是在命名空間級別應用的,標簽如下


0x06 秘密信息使用
如果你有敏感信息(如憑證、令牌、加密密鑰和證書)在應用程序中可用,請使用Kubernetes Secrets。你可以用字面值或文件創建Secrets,然后將其掛載到pod中。不要在容器鏡像和Git存儲庫中存儲此類信息。
在使用Secrets時,最好不要使用環境變量將憑證投射到容器中,而是使用文件。
請記住,Secrets是base64編碼的值。它們沒有被加密,所以對安全對象的訪問必須受到限制,而且你應該在API服務器中寫入時啟用加密功能。
0x07 總結
Kubernetes提供了各種方法來改善你的組織的安全態勢。開發人員需要考慮這些結構,使他們的應用程序更安全。
扼要重述:
- 為每個應用程序使用服務賬戶,并將服務賬戶與最小的角色和權限要求綁定,以實現你的目標。
- 如果你的應用程序中不需要服務賬戶令牌,就不要自動安裝它。
- 使用安全上下文來實現各種技術,例如防止容器在特權模式下作為根用戶運行,使用SELinux或AppArmor配置文件等。
- 確保你的容器鏡像的來源是值得信賴的,如果可能的話,將它們存儲在私有注冊表中。
- 盡量使用容器優化的鏡像,減少表面積,以減少威脅。
- 部署一個持續的漏洞掃描解決方案,不僅在CI/CD中,而且在集群中,可以實時監測和采取行動。
- 使用Pod Security接納配置文件和模型,為你的工作負載提供不同的隔離級別。
- 使用Secrets來存儲敏感信息,并應用最小權限的RBAC來限制用戶/SA的秘密訪問。
這對于應用程序開發人員來說,可能會顯得有些力不從心。像Kubescape這樣的工具可以幫助進行風險分析,在CI/CD中執行安全標準,易于理解的RBAC可視化,自動漏洞掃描,以及更多。
Kubescape協助開發人員實現其應用程序的安全部署。