在 Pod 中使用使用者名稱空間
Kubernetes v1.33 [beta]
(預設啟用:true)本頁面展示瞭如何為 Pod 配置使用者名稱空間。這允許你將容器內部執行的使用者與主機上的使用者隔離開來。
以 root 使用者身份在容器中執行的程序,可以在主機上以不同的(非 root)使用者身份執行;換句話說,該程序對使用者名稱空間內的操作擁有完全許可權,但對名稱空間外的操作沒有特權。
你可以使用此功能來減少受損容器對主機或同一節點中的其他 Pod 造成的損害。有 幾項安全漏洞 被評為高危或嚴重,在使用者名稱空間啟用時是無法利用的。預計使用者名稱空間在未來也能緩解一些漏洞。
如果不使用使用者名稱空間,以 root 身份執行的容器在發生容器逃逸時,將對節點擁有 root 許可權。如果容器被授予某些功能,這些功能在主機上也是有效的。當使用使用者名稱空間時,這些都不成立。
準備工作
你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練場之一
你的 Kubernetes 伺服器版本必須是 v1.25 或更高版本。要檢查版本,請輸入 kubectl version
。
- 節點作業系統需要是 Linux。
- 你需要在主機中執行命令。
- 你需要能夠 exec 進入 Pod。
- 你需要啟用
UserNamespacesSupport
特性門控。
注意
此前,當只支援無狀態 Pods 時,用於啟用使用者名稱空間的特性門控名為UserNamespacesStatelessPodsSupport
。只有 Kubernetes v1.25 到 v1.27 版本識別 UserNamespacesStatelessPodsSupport
。你正在使用的叢集必須包含至少一個滿足為 Pod 使用使用者名稱空間的要求的節點。
如果你的節點混合存在,並且只有部分節點為 Pod 提供使用者名稱空間支援,你還需要確保使用者名稱空間 Pod 被排程到合適的節點上。
執行使用使用者名稱空間的 Pod
透過將 .spec
的 hostUsers
欄位設定為 false
來為 Pod 啟用使用者名稱空間。例如
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
進入 Pod 並執行
readlink /proc/self/ns/user
kubectl exec -ti 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 網站指南。
在提議新增額外第三方連結的更改之前,你應該閱讀內容指南。