使用 ABAC 授權

基於屬性的訪問控制(ABAC)定義了一種訪問控制範例,其中透過使用結合屬性的策略授予使用者訪問許可權。

策略檔案格式

要啟用 ABAC 模式,請在啟動時指定 --authorization-policy-file=SOME_FILENAME--authorization-mode=ABAC

檔案格式是 每行一個 JSON 物件。不應有外部列表或對映,每行只有一個對映。

每行都是一個“策略物件”,其中每個此類物件都是一個具有以下屬性的對映

  • 版本屬性
    • apiVersion,字串型別;有效值為 "abac.authorization.kubernetes.io/v1beta1"。允許策略格式的版本控制和轉換。
    • kind,字串型別:有效值為 "Policy"。允許策略格式的版本控制和轉換。
  • spec 屬性設定為具有以下屬性的對映
    • 主體匹配屬性
      • user,字串型別;來自 --token-auth-file 的使用者字串。如果指定 user,它必須與已認證使用者的使用者名稱匹配。
      • group,字串型別;如果指定 group,它必須與已認證使用者的一個組匹配。system:authenticated 匹配所有已認證請求。system:unauthenticated 匹配所有未認證請求。
    • 資源匹配屬性
      • apiGroup,字串型別;一個 API 組。
        • 例如:appsnetworking.k8s.io
        • 萬用字元:* 匹配所有 API 組。
      • namespace,字串型別;一個名稱空間。
        • 例如:kube-system
        • 萬用字元:* 匹配所有資源請求。
      • resource,字串型別;一個資源型別
        • 例如:podsdeployments
        • 萬用字元:* 匹配所有資源請求。
    • 非資源匹配屬性
      • nonResourcePath,字串型別;非資源請求路徑。
        • 例如:/version/apis
        • 萬用字元
          • * 匹配所有非資源請求。
          • /foo/* 匹配 /foo/ 的所有子路徑。
    • readonly,布林型別,當為 true 時,表示資源匹配策略僅適用於 get、list 和 watch 操作,非資源匹配策略僅適用於 get 操作。

授權演算法

請求具有與策略物件的屬性相對應的屬性。

收到請求時,確定屬性。未知屬性設定為其型別的零值(例如空字串、0、false)。

設定為 "*" 的屬性將匹配相應屬性的任何值。

檢查屬性元組是否與策略檔案中的每個策略匹配。如果至少有一行匹配請求屬性,則請求被授權(但可能稍後驗證失敗)。

要允許任何已認證使用者執行操作,請編寫一個將 group 屬性設定為 "system:authenticated" 的策略。

要允許任何未認證使用者執行操作,請編寫一個將 group 屬性設定為 "system:unauthenticated" 的策略。

要允許使用者執行任何操作,請編寫一個將 apiGroup、namespace、resource 和 nonResourcePath 屬性設定為 "*" 的策略。

Kubectl

Kubectl 使用 apiserver 的 /api/apis 端點來發現已服務的資源型別,並使用位於 /openapi/v2 的 schema 資訊驗證透過建立/更新操作傳送到 API 的物件。

使用 ABAC 授權時,這些特殊資源必須透過策略中的 nonResourcePath 屬性顯式暴露(請參閱下面的示例

  • /api/api/*/apis/apis/* 用於 API 版本協商。
  • /version 用於透過 kubectl version 檢索伺服器版本。
  • /swaggerapi/* 用於建立/更新操作。

要檢查特定 kubectl 操作中涉及的 HTTP 呼叫,可以提高詳細程度

kubectl --v=8 version

示例

  1. Alice 可以對所有資源執行任何操作

    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}
    
  2. kubelet 可以讀取任何 Pod

    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "pods", "readonly": true}}
    
  3. kubelet 可以讀取和寫入事件

    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "kubelet", "namespace": "*", "resource": "events"}}
    
  4. Bob 只能讀取名稱空間 "projectCaribou" 中的 Pod

    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "bob", "namespace": "projectCaribou", "resource": "pods", "readonly": true}}
    
  5. 任何人都可以對所有非資源路徑發出只讀請求

    {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:authenticated", "readonly": true, "nonResourcePath": "*"}}
     {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group": "system:unauthenticated", "readonly": true, "nonResourcePath": "*"}}
    

完整檔案示例

關於服務帳戶的簡要說明

每個服務帳戶都有一個對應的 ABAC 使用者名稱,該服務帳戶的使用者名稱根據命名約定生成

system:serviceaccount:<namespace>:<serviceaccountname>

建立新名稱空間會導致以以下格式建立新服務帳戶

system:serviceaccount:<namespace>:default

例如,如果您想使用 ABAC 授予預設服務帳戶(在 kube-system 名稱空間中)對 API 的完全許可權,您將在策略檔案中新增此行

{"apiVersion":"abac.authorization.kubernetes.io/v1beta1","kind":"Policy","spec":{"user":"system:serviceaccount:kube-system:default","namespace":"*","resource":"*","apiGroup":"*"}}

apiserver 將需要重啟才能載入新的策略行。

最後修改於 2024 年 2 月 18 日上午 10:07 (太平洋標準時間):重新排序認證/授權頁面 (9f327512c6)