Kubernetes 會依序透過驗證、授權與准入控制處理 API 請求。驗證建立身分;授權決定該身分是否能執行某項動作;准入控制則可以驗證或變更已接受的物件。這些是分開的控制項,應分別設定與稽核。
使用 OIDC 進行驗證 #
OpenID Connect(OIDC)讓 API server 驗證由外部身分提供者簽發的 bearer token。API server 會設定簽發者 URL、用戶端 ID,以及選用的使用者名稱與群組宣告對映。API server 必須能連線到簽發者,且其 TLS 憑證必須通過驗證。
身分提供者負責使用者生命週期與多因素驗證;Kubernetes 從有效 token 接收使用者名稱與群組。不要為人員使用共用的靜態 token。在 kubectl 中,使用核准的 OIDC 登入外掛程式或 exec 憑證提供者,讓短期 token 能在不將長期憑證儲存在 kubeconfig 檔案中的情況下更新。
使用 RBAC 進行授權 #
RBAC 透過 Role 與 ClusterRole 物件授予資源型別上的動詞,再透過繫結附加這些權限。Role 的範圍是命名空間;ClusterRole 可以授予叢集範圍的存取權,或在命名空間內繫結。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: deployment-reader
namespace: payments
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: developers-can-read-deployments
namespace: payments
subjects:
- kind: Group
name: payments-developers
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: deployment-reader
apiGroup: rbac.authorization.k8s.io只授予所需的最小動詞、資源、命名空間與非資源 URL。除非是受到嚴格控管的平台管理,否則避免使用 cluster-admin、萬用字元動詞與萬用字元資源。使用 kubectl auth can-i 檢查預計授予的權限。
控制資源與服務帳戶 #
ResourceQuota 限制命名空間的彙總使用量;LimitRange 提供或限制每個容器的要求與限制。單靠配額無法保證公平排程:工作負載應指定 CPU 與記憶體要求,命名空間也需要作業監控。
服務帳戶是工作負載身分。不需要時停用自動掛載 token,使用投影的短期 token,並將每個工作負載服務帳戶繫結至最小角色。絕不要讓應用程式取得預設服務帳戶的廣泛權限。准入政策、Pod Security Standards、網路政策與映像控制都能補足 RBAC;但沒有任何一項能取代 RBAC。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)