搭配 Pod 使用使用者命名空間
Kubernetes v1.30 [beta]
(預設停用:false)本頁說明如何為 Pod 設定使用者命名空間。這可讓您將容器內執行的使用者與主機中的使用者隔離。
在容器中以 root 身份執行的程序可以在主機中以不同的 (非 root) 使用者身份執行;換句話說,該程序在使用者命名空間內的操作具有完整權限,但在命名空間外的操作則是非特權的。
您可以使用此功能來減少受入侵的容器可能對主機或相同節點中的其他 Pod 造成的損害。有 數個安全漏洞 被評為高或嚴重,但在使用者命名空間啟用時無法利用。預計使用者命名空間也將減輕未來的一些漏洞。
在不使用使用者命名空間的情況下,以 root 身份執行的容器,在容器逃逸的情況下,將在節點上擁有 root 權限。如果某些功能被授予容器,則這些功能在主機上也有效。當使用使用者命名空間時,這些情況都不會發生。
準備開始
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 實驗環境之一
您的 Kubernetes 伺服器必須是 v1.25 或更新版本。若要檢查版本,請輸入kubectl version
。- 節點作業系統需要是 Linux
- 您需要在主機中執行命令
- 您需要能夠執行進入 Pod
- 您需要啟用
UserNamespacesSupport
功能閘道
注意
啟用使用者命名空間的功能閘道先前名為UserNamespacesStatelessPodsSupport
,當時僅支援無狀態 Pod。只有 Kubernetes v1.25 到 v1.27 識別 UserNamespacesStatelessPodsSupport
。您使用的叢集必須至少包含一個符合 需求 以搭配 Pod 使用使用者命名空間的節點。
如果您混合使用節點,且只有部分節點提供 Pod 的使用者命名空間支援,您還需要確保使用者命名空間 Pod 排程 到合適的節點。
執行使用使用者命名空間的 Pod
Pod 的使用者命名空間是透過將 .spec
的 hostUsers
欄位設定為 false
來啟用。例如
apiVersion: v1
kind: Pod
metadata:
name: userns
spec:
hostUsers: false
containers:
- name: shell
command: ["sleep", "infinity"]
image: debian
在您的叢集上建立 Pod
kubectl apply -f https://k8s.io/examples/pods/user-namespaces-stateless.yaml
附加到容器並執行
readlink /proc/self/ns/user
kubectl attach -it userns bash
執行此指令
readlink /proc/self/ns/user
輸出類似於
user:[4026531837]
也執行
cat /proc/self/uid_map
輸出類似於
0 833617920 65536
然後,在主機中開啟 Shell 並執行相同的指令。
readlink
指令顯示程序正在其中執行的使用者命名空間。當在主機上和容器內執行時,它應該是不同的。
容器內 uid_map
檔案的最後一個數字必須是 65536,在主機上它必須是更大的數字。
如果您在使用者命名空間內執行 kubelet,您需要比較在 Pod 中執行指令的輸出與在主機中執行的輸出
readlink /proc/$pid/ns/user
將 $pid
替換為 kubelet PID。
本頁上的項目參考提供 Kubernetes 所需功能的第三方產品或專案。Kubernetes 專案作者不對這些第三方產品或專案負責。請參閱 CNCF 網站指南 以取得更多詳細資訊。
在提出新增額外第三方連結的變更之前,您應該閱讀內容指南。