控制 Kubernetes API 的存取權
本頁面概述如何控制 Kubernetes API 的存取權。
使用者使用 kubectl
、用戶端程式庫或發出 REST 請求來存取 Kubernetes API。人類使用者和 Kubernetes 服務帳戶都可以被授權存取 API。當請求到達 API 時,它會經過幾個階段,如下圖所示
傳輸安全
預設情況下,Kubernetes API 伺服器在第一個非 localhost 網路介面的 6443 埠上監聽,並受到 TLS 保護。在典型的生產 Kubernetes 叢集中,API 在 443 埠上提供服務。可以使用 --secure-port
變更埠號,並使用 --bind-address
旗標變更監聽 IP 位址。
API 伺服器會呈現憑證。此憑證可以使用私有憑證授權單位 (CA) 簽署,或基於連結到一般公認 CA 的公開金鑰基礎架構。可以使用 --tls-cert-file
和 --tls-private-key-file
旗標設定憑證和對應的私有金鑰。
如果您的叢集使用私有憑證授權單位,您需要在用戶端上的 ~/.kube/config
中設定該 CA 憑證的副本,以便您可以信任連線並確信它沒有被攔截。
您的用戶端可以在此階段呈現 TLS 用戶端憑證。
身份驗證
一旦建立 TLS 連線,HTTP 請求就會移至身份驗證步驟。這在圖表中顯示為步驟 1。叢集建立腳本或叢集管理員會設定 API 伺服器以執行一個或多個身份驗證器模組。身份驗證器在 身份驗證 中有更詳細的描述。
身份驗證步驟的輸入是整個 HTTP 請求;但是,它通常會檢查標頭和/或用戶端憑證。
身份驗證模組包括用戶端憑證、密碼和純文字權杖、啟動引導權杖,以及 JSON Web 權杖(用於服務帳戶)。
可以指定多個身份驗證模組,在這種情況下,會依序嘗試每個模組,直到其中一個成功。
如果請求無法通過身份驗證,則會以 HTTP 狀態碼 401 拒絕。否則,使用者會通過身份驗證為特定的 username
,並且使用者名稱可用於後續步驟以用於其決策中。某些身份驗證器也會提供使用者的群組成員資格,而其他身份驗證器則不會。
雖然 Kubernetes 使用使用者名稱進行存取控制決策和請求記錄,但它沒有 User
物件,也不會在其 API 中儲存使用者名稱或其他有關使用者的資訊。
授權
在請求通過身份驗證為來自特定使用者之後,必須授權該請求。這在圖表中顯示為步驟 2。
請求必須包含請求者的使用者名稱、請求的動作以及受動作影響的物件。如果現有策略宣告使用者有權限完成請求的動作,則該請求會被授權。
例如,如果 Bob 具有以下策略,則他只能讀取命名空間 projectCaribou
中的 Pod
{
"apiVersion": "abac.authorization.kubernetes.io/v1beta1",
"kind": "Policy",
"spec": {
"user": "bob",
"namespace": "projectCaribou",
"resource": "pods",
"readonly": true
}
}
如果 Bob 發出以下請求,則該請求會獲得授權,因為他被允許讀取 projectCaribou
命名空間中的物件
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"namespace": "projectCaribou",
"verb": "get",
"group": "unicorn.example.org",
"resource": "pods"
}
}
}
如果 Bob 發出寫入(create
或 update
)projectCaribou
命名空間中物件的請求,他的授權將被拒絕。如果 Bob 發出讀取(get
)不同命名空間(例如 projectFish
)中物件的請求,那麼他的授權也將被拒絕。
Kubernetes 授權要求您使用常見的 REST 屬性與現有的組織級或雲端供應商級存取控制系統互動。使用 REST 格式非常重要,因為這些控制系統可能會與 Kubernetes API 以外的其他 API 互動。
Kubernetes 支援多個授權模組,例如 ABAC 模式、RBAC 模式和 Webhook 模式。當管理員建立叢集時,他們會配置應在 API 伺服器中使用的授權模組。如果配置了多個授權模組,Kubernetes 會檢查每個模組,如果任何模組授權請求,則請求可以繼續進行。如果所有模組都拒絕請求,則該請求將被拒絕(HTTP 狀態碼 403)。
若要瞭解有關 Kubernetes 授權的更多資訊,包括使用支援的授權模組建立策略的詳細資訊,請參閱授權。
許可控制
許可控制模組是軟體模組,可以修改或拒絕請求。除了授權模組可用的屬性外,許可控制模組還可以存取正在建立或修改的物件內容。
許可控制器作用於建立、修改、刪除或連線到(代理)物件的請求。許可控制器不作用於僅讀取物件的請求。當配置多個許可控制器時,它們會依序被呼叫。
這在圖表中顯示為步驟 3。
與身份驗證和授權模組不同,如果任何許可控制器模組拒絕,則請求會立即被拒絕。
除了拒絕物件外,許可控制器還可以為欄位設定複雜的預設值。
可用的許可控制模組在許可控制器中進行了描述。
一旦請求通過所有許可控制器,它將使用相應 API 物件的驗證常式進行驗證,然後寫入物件儲存區(如步驟 4 所示)。
稽核
Kubernetes 稽核提供了一組與安全性相關且按時間順序排列的記錄,記錄了叢集中操作的順序。叢集會稽核使用者、使用 Kubernetes API 的應用程式以及控制平面本身產生的活動。
如需更多資訊,請參閱稽核。
下一步
閱讀更多關於身份驗證、授權和 API 存取控制的文件
您可以瞭解
- Pod 如何使用 密鑰 來取得 API 憑證。