在 Azure Stack HCI 和 Windows Server 上使用 Azure AD 和 Kubernetes RBAC Azure Kubernetes Service 來控制存取權

適用於:Azure Stack HCI 和 Windows Server 上的 AKS

Azure Stack HCI 和 Windows Server 上的 Azure Kubernetes Service (AKS),可以設定為使用 Azure Active Directory (Azure AD) 來進行使用者驗證。 在此設定中,您可以使用 Azure AD 驗證權杖來登入 AKS 叢集。 驗證之後,您可以使用內建的 Kubernetes 角色型存取控制 (Kubernetes RBAC),來管理以使用者的身分識別,或群組成員資格為基礎的命名空間和叢集資源存取權。

此文章說明如何根據 Azure AD 群組成員資格,在 AKS 叢集中使用 Kubernetes RBAC 來控制存取。 您將在 Azure AD 中建立示範群組和使用者。 接著,您將在 AKS 叢集中建立角色和 RoleBindings,以授與建立和檢視資源的適當權限。

必要條件

在您使用 Azure AD 身分識別來設定 Kubernetes RBAC 之前,需要先進行下列項目:

  • 具有 Azure Stack HCI 和 Windows Server 上 AKS 的 AKS 叢集

    您需要具有 Azure Stack HCI 和 Windows Server 上 AKS 的 AKS 叢集。 如果您需要設定叢集,您可以找到使用 Windows Admin CenterPowerShell 的指示,以部署 Azure Stack HCI 上的 AKS 和 Windows Server。

  • Azure Arc 連線

    您需要將 Azure Arc 連線至 Azure Stack HCI 上的 AKS 叢集和 Windows Server。 如需啟用 Azure Arc 的指示,請參閱將 Azure Stack HCI 上的 Azure Kubernetes Service 叢集,連線至已啟用 Azure Arc 的 Kubernetes

  • 您需具備下列命令列工具的存取權:

    • Azure CLI

      Azure 命令列介面 (Azure CLI) 是用來建立和管理 Azure 資源的一組命令。 若要檢查您是否具備 Azure CLI,請開啟命令列工具,然後輸入:az -v

      如需安裝指示,請參閱如何安裝 Azure CLI

    • Kubectl

      Kubernetes 命令列工具 kubectl,可讓您執行以 Kubernetes 叢集為目標的命令。 若要檢查您是否具備 kubectl,請開啟命令列工具,然後輸入:kubectl version --client。 請確定您的 kubectl 用戶端版本至少為 v1.24.0

      如需指示,請參閱 kubectl

    • PowerShell 和 AksHci PowerShell 模組

      PowerShell 是跨平台的工作自動化解決方案,由命令列殼層、指令碼語言,以及組態管理架構所組成。 如果您已在 Azure Stack HCI 和 Windows Server 上安裝 AKS,則可存取 AksHci PowerShell 模組。

選擇性的第一個步驟

如果您還未具備包含成員的 Azure AD 群組,則可建立群組並新增一些成員,以遵循本文中的指示。

為了示範如何使用 Azure AD 和 Kubernetes RBAC,您可以為應用程式開發人員建立 Azure AD 群組,該群組可用於顯示 Kubernetes RBAC 和 Azure AD 如何控制叢集資源的存取權。 在生產環境中,您可以在 Azure AD 租用戶內使用現有的使用者和群組。

在 Azure AD 中建立示範群組

第一步,使用 az ad group create 命令,在租用戶的 Azure AD 中為應用程式開發人員建立群組。 下列範例可讓您登入 Azure 租用戶,並建立名為 appdev 的群組:

az login
az ad group create --display-name appdev --mail-nickname appdev

將使用者新增至您的群組

透過在 Azure AD 中,為應用程式開發人員所建立的範例群組,讓我們將使用者新增至 appdev 群組。 若要測試本文結尾所述的 Kubernetes RBAC 整合,請使用此使用者帳戶來登入 AKS 叢集。

使用 az ad group member add 命令,將使用者新增至上一節所建立的 appdev 群組。 如果您已結束工作階段,則需使用 az login 來重新連線到 Azure。

$AKSDEV_ID = az ad user create --display-name <name> --password <strongpassword> --user-principal-name <name>@contoso.onmicrosoft.com
az ad group member add --group appdev --member-id $AKSDEV_ID

在 Azure AD 群組的 AKS 叢集資源上,建立自訂 Kubernetes RBAC 角色繫結

設定 AKS 叢集,允許 Azure AD 群組存取 AKS 叢集。 如果您想要新增群組和使用者以遵循本指南中的步驟,請參閱在 Azure AD 中建立示範群組

  1. 使用 Get-AksHciCredential 命令,取得叢集管理員認證。

    Get-AksHciCredential -name <name-of-your-cluster>
    
  2. 使用 kubectl create namespace 命令,在 AKS 叢集中建立命名空間。 下列範例會建立命名空間名稱 dev

    kubectl create namespace dev
    

    在 Kubernetes 中,「Roles」會定義要授與的權限,而「RoleBindings」會將權限套用至所需的使用者或群組。 這些指派可以套用至指定的命名空間或整個叢集。 如需詳細資訊,請參閱使用 Kubernetes RBAC 授權

    建立 dev 命名空間的角色。 此角色會將完整權限授與命名空間。 在實際執行環境中,您可為不同的使用者或群組指定更細微的權限。

  3. 建立名為 role-dev-namespace.yaml 的檔案,並貼上下列 YAML 資訊清單:

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: dev-user-full-access
      namespace: dev
    rules:
    - apiGroups: ["", "extensions", "apps"]
      resources: ["*"]
      verbs: ["*"]
    - apiGroups: ["batch"]
      resources:
      - jobs
      - cronjobs
      verbs: ["*"]
    
  4. 使用 kubectl apply (英文) 命令來建立 Role,並指定 YAML 資訊清單的名稱:

    kubectl apply -f role-dev-namespace.yaml
    
  5. 使用 az ad group show 命令,取得 appdev 群組的資源識別碼。 此群組會在下一個步驟中設定為 RoleBinding 的主體。

    az ad group show --group appdev --query objectId -o tsv
    

    Az ad 群組會傳回您將用來作為 groupObjectId 的值。

    38E5FA30-XXXX-4895-9A00-050712E3673A
    
  6. 建立名為 rolebinding-dev-namespace.yaml 的檔案,並貼上下列 YAML 資訊清單。 為 appdev 群組建立 RoleBinding,以使用 role-dev-namespace 角色來存取命名空間。 在最後一行,將 groupObjectId 取代為由 az ad group show 命令所產生的群組物件識別碼:

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: dev-user-access
      namespace: dev
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: dev-user-full-access
    subjects:
    - kind: Group
      namespace: dev
      name: groupObjectId
    

    提示

    如果您想要為單一使用者建立 RoleBinding,請在範例中指定 kind: User,並將 groupObjectId 取代為使用者主體名稱 (UPN)。

  7. 使用 kubectl apply 命令來建立 RoleBinding,並指定 YAML 資訊清單的檔案名稱:

    kubectl apply -f rolebinding-dev-namespace.yaml
    
    rolebinding.rbac.authorization.k8s.io/dev-user-access created
    

針對 AKS 叢集資源使用內建 Kubernetes RBAC 角色

Kubernetes 也提供內建使用者面向角色。 這些內建角色包含:

  • 進階使用者角色 (叢集管理員)
  • 想使用 ClusterRoleBindings 獲得全叢集權限的角色
  • 想在特定命名空間內使用 RoleBindings (管理員、編輯、檢視) 獲得權限的角色

若要深入瞭解內建 Kubernetes RBAC 角色,請前往 Kubernetes RBAC 使用者面向角色

使用者面向角色

預設 ClusterRole 預設 ClusterRoleBinding 描述
cluster-admin system:masters group 允許進階使用者在任何資源上執行的存取權。 在 ClusterRoleBinding 中使用時,其會完整控制叢集和所有命名空間中的每個資源。 在 RoleBinding 中使用時,其會完整控制角色繫結命名空間,以及其中的每個資源。
admin 允許管理員存取權,其用途是在命名空間中使用 RoleBindng 來獲得權限。 如果在 RoleBinding 中使用,其允許命名空間中大部分資源的讀取/寫入存取權,包括可在命名空間中建立角色和角色繫結。 此角色不允許對資源配額或命名空間本身進行寫入存取。 此角色也不允許在使用 Kubernetes v1.22+ 所建立的叢集中,對端點進行寫入存取。 如需詳細資訊,請參閱端點的寫入存取權一節。
編輯 允許命名空間中大部分物件的讀取/寫入存取權。 不允許檢視或修改角色或角色繫結。 然而,此角色允許以命名空間中的任何 ServiceAccount 身分存取秘密並執行 Pod,因此可用來取得命名空間中任何 ServiceAccount 的 API 存取層級。 此角色也不允許在使用 Kubernetes v1.22+ 所建立的叢集中,對端點進行寫入存取。 如需詳細資訊,請參閱端點的寫入存取權一節。
檢視 允許唯讀存取來查看命名空間中的大部分物件。 其不允許檢視角色或角色繫結。 此角色不允許檢視秘密,因為讀取祕密的內容可存取命名空間中的 ServiceAccount 認證,這會允許 API 以命名空間中任何 ServiceAccount 身分來進行存取 (權限提升的形式)。

搭配 Azure AD 使用內建 Kubernetes RBAC 角色

  1. 將內建 view Kubernetes RBAC 角色套用至您的 Azure AD 群組:

    kubectl create clusterrolebinding <name of your cluster role binding> --clusterrole=view --group=<Azure AD group object ID>
    
  2. 將內建 view Kubernetes RBAC 角色套用至您的每個 Azure AD 使用者:

    kubectl create clusterrolebinding <name of your cluster role binding> --clusterrole=view --user=<Azure AD user object ID>
    

透過 Azure AD 身分識別來使用叢集資源

在 AKS 叢集中建立和管理資源時測試預期的權限。 在這些範例中,您會在使用者指派的命名空間中排程和檢視 Pod。 然後,您會嘗試排程並檢視指派命名空間外部的 Pod。

  1. 使用您將其作為輸入,並傳遞至 az ad group member add 命令的 $AKSDEV_ID 使用者帳戶來登入 Azure。 執行 az connectedk8s proxy 命令以開啟 AKS 叢集的通道:

    az connectedk8s proxy -n <cluster-name> -g <resource-group>
    
  2. 建立 Proxy 通道之後,請開啟另一個工作階段,使用 dev 命名空間中的 kubectl run 命令,來排程 NGINX Pod:

    kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
    

    成功排程 NGINX 時,您會看到下列輸出:

    pod/nginx-dev created
    
  3. 現在,使用 kubectl get pods 命令在 dev 命名空間中檢視所有命名空間的 Pod。

    kubectl get pods --namespace dev
    

    成功執行 NGINX 時,您會看到下列輸出:

    $ kubectl get pods --namespace dev
    
    NAME        READY   STATUS    RESTARTS   AGE
    nginx-dev   1/1     Running   0          4m
    

在指派的命名空間之外建立和檢視叢集資源

請嘗試在 dev 命名空間外部檢視 Pod。 使用 kubectl get pods 命令與 --all-namespaces 旗標搭配使用。

kubectl get pods --all-namespaces

使用者群組成員資格沒有允許此動作的 Kubernetes 角色。 若無權限,命令將會擲回錯誤。

Error from server (Forbidden): pods is forbidden: User cannot list resource "pods" in API group "" at the cluster scope

後續步驟

如需 Azure Stack HCI 和 Windows Server 上的 AKS 安全性詳細資訊,請參閱 Azure Stack HCI 和 Windows Server 上的 AKS 安全性