Kubernetes API 的訪問控制

翻譯自官方文檔

用戶使用 kubectl 或 REST 請求訪問 API、客戶端庫。人類用戶和service account 二者可以授權訪問 API。當請求到達API,它經過若干步驟。
image

傳輸安全

典型的 Kubernetes 集羣中,API Server 位於6443端口。API Server 出示證書。此證書通常是自簽名的,所以用戶機器上的$USER/.kube/config通常包含API Server證書的根證書,在指定的時候用這個根證書來替代系統的默認根證書。這個證書通常在你創建集羣的時候自動寫入$USER/.kube/config。如果集羣有多個用戶,那麼創建者需要將證書分享給他們。

認證

當TLS連接建立以後,HTTP請求進入認證步驟。如上圖中的第1步。集羣的創建腳本或集羣管理員配置API Server運行一個或多個認證模塊。這些模塊在這裏詳述

認證步驟的輸入是整個HTTP請求,然而,通常只檢查頭部和/或客戶端證書。

認證模塊包括客戶端證書、密碼、明文Token、自助Token和JWT Token(service account使用)。

可以指定多個認證模塊,此時每一個模塊按順序嘗試認證,直到其中之一通過認證。

如果請求不能通過認證,它被HTTP狀態碼401拒絕。否則,用戶被認證爲一個指定的username,用戶名可用於後續步驟中進行決策。有些認證者也提供用戶組認證。

儘管Kubernetes使用username來進行訪問控制決策和將請求記錄進日誌,但它沒有用戶對象,也沒有在其對象存儲中存儲用戶名或其他有關用戶的信息。

授權

請求通過認證以後必須被授權。如上圖中的第2步。

請求必須包含請求者的用戶名,請求的動作和動作影響的對象。如果有已存在的策略聲明這個用戶有權完成請求的動作,請求就被授權了。

例如,如果Bob擁有以下策略,那麼他只能讀取projectCaribou命名空間的pod信息:

{
    "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
    "kind": "Policy",
    "spec": {
        "user": "bob",
        "namespace": "projectCaribou",
        "resource": "pods",
        "readonly": true
    }
}

如果Bob做了如下請求,這個請求時被授權允許的:

{
  "apiVersion": "authorization.k8s.io/v1beta1",
  "kind": "SubjectAccessReview",
  "spec": {
    "resourceAttributes": {
      "namespace": "projectCaribou",
      "verb": "get",
      "group": "unicorn.example.org",
      "resource": "pods"
    }
  }
}

如果Bob請求寫入該命名空間的對象,他的授權被拒絕。如果他請求讀取其他命名空間的資源也被拒絕。

Kubernetes要求使用REST屬性與現有的組織(根證書裏的O)或雲提供商訪問控制系統交互。使用REST格式很重要,因爲這些控制系統可能與Kubernetes API以外的其他API交互。

Kubernetes支持多種授權模塊如ABAC模式、RBAC模式和Webhook模式。管理員創建集羣的時候配置API Server採用的授權模塊。如果配置了多個,Kubernetes會檢查每一個,任何一個模塊授權了請求,請求就可以進行。如果所有模塊都拒絕了請求,納悶請求就被禁止了。(HTTP狀態碼403)

更多關於Kubernetes授權,詳見授權概述

准入控制

准入控制模塊是可以修改或者拒絕請求的軟件模塊。除了授權模塊可用的屬性,准入控制模塊可以訪問正在被創建或更新的對象。它們作用於正在創建,刪除,更新或連接(代理)的對象,但不讀取。

可以配置多個准入控制器,按序逐個調用。

如圖中第3步所示。

不同於認證和授權模塊,如果被任何一個准入控制模塊拒絕了,那麼請求就立即被拒絕。

除了拒絕對象外,准入控制器還可以爲字段設置複雜的默認值。

可用的准入控制模塊在這裏描述。

請求通過所有準入控制器後,將使用相應API對象的驗證例程對其進行驗證,然後寫入對象存儲(圖中第4步)。

API Server 的IP和端口

API Server 實際上可以服務於兩個端口:

  1. 本地端口:
    • 用於測試和bootstrap,以及其他主節點的組件與API server 通信
    • 非TLS
    • 默認端口是8080,--insecure-port參數修改
    • 默認IP是 localhost,--insecure-bind-address參數修改
    • 請求繞過認證和授權模塊
    • 請求被准入控制模塊處理
    • 受需要訪問主機的保護
  2. 安全端口
    • 儘可能使用
    • 使用TLS。–tls-cert-file 參數和 --tls-private-key-file 參數設置證書
    • 默認端口6443,–secure-port參數修改
    • 默認IP是第一個非localhost的網卡的IP,–bind-address修改
    • 請求被認證和授權模塊處理
    • 請求被准入控制模塊處理
    • 認證和授權模塊運行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章