共用方式為


使用 Privileged Identity Management (PIM) 來控制對 Azure Kubernetes Service (AKS) 叢集的存取

設定不同小組的許可權時,您可能想要為指定的小組設定默認許可權,然後視需要將特殊許可權的存取權授與特定使用者。 使用 Azure Kubernetes Service (AKS) 搭配 Microsoft Entra ID 可讓您針對 Just-In-Time (JIT) 要求設定 Privileged Identity Management (PIM)。

在本文中,您將學會如何:

  • 設定預設角色,例如群組,根據 Microsoft entra 群組成員資格,存取或執行 AKS 叢集上的作業。
  • 設定存取 AKS 叢集的基本角色。
  • 自我啟動角色,以取得 AKS 叢集的 Just-In-Time 存取權。
  • 將核准者設定為核准或拒絕 Just-In-Time 存取的核准要求。

注意

Microsoft Entra Privileged Identity Management (PIM) 具有Microsoft Entra ID P2 或 Microsoft Entra ID 控管 需要進階 P2 SKU 的功能。 如需詳細資訊,請參閱 Microsoft Entra ID 控管 授權基本概念定價指南

必要條件

本文假設您有現有的 AKS 叢集,且Microsoft Entra ID 整合。 如果您沒有 AKS 叢集,請參閱 建立具有 Microsoft Entra ID 整合的 AKS 叢集。

在 Microsoft Entra 識別碼中建立示範群組

在本節中,我們會在 entra 標識符Microsoft建立三個群組:

  • 默認:此群組具有 AKS 叢集中資源的唯讀 存取權(Azure Kubernetes Service RBAC Reader)。
  • 管理員:此群組具有 AKS 叢集中資源的系統管理員 存取權 (Azure Kubernetes Service RBAC Admin)。
  • 核准者:此群組有權 核准或拒絕 Just-In-Time 存取 AKS 叢集的要求

您可以使用預設系統管理員群組,而不是建立個別的核准者群組。 不過,如果您在系統管理群組中包含核准許可權,則取得 Just-In-Time 存取權的成員可以核准自己的要求和其他人的要求。 我們不建議在生產環境中使用此組態,但對於測試用途很有用。

建立預設群組

  1. 使用 az aks show 命令取得 AKS 叢集的資源識別碼

    AKS_ID=$(az aks show \
        --resource-group <resource-group-name> \
        --name <cluster-name> \
        --query id \
        --output tsv)
    
  2. 使用 az group show 命令取得 AKS 叢集的資源群組識別碼

    RG_ID=$(az group show \
        --resource-group <resource-group-name> \
        --query id \
        --output tsv)
    
  3. 使用 az ad group create 命令建立預設群組。

    DEFAULT_ID=$(az ad group create \
        --display-name default \
        --mail-nickname default \
        --query id \
        --output tsv)
    
  4. 使用 az role assignment create 命令建立預設群組的 Azure 角色指派。

    根據您的特定需求,您可以指派預設群組三個角色:

    • Azure Kubernetes Service RBAC Reader:在 AKS 叢集的範圍內指派,並提供叢集中大部分資源的基本唯讀存取權。
    • Reader:在資源群組的範圍內指派,並提供資源群組中資源的只讀存取權。
    • Azure Kubernetes Service Cluster User Role:指派於 AKS 叢集範圍,並提供存取權以取得 AKS 叢集的 kubeconfig 內容。
    # Assign the Azure Kubernetes Service RBAC Reader role to the default group
    az role assignment create \
        --role "Azure Kubernetes Service RBAC Reader" \
        --assignee $DEFAULT_ID \
        --scope $AKS_ID
    
    # Assign the Reader role to the default group
    az role assignment create \
        --role "Reader" \
        --assignee $DEFAULT_ID \
        --scope $RG_ID
    
    # Assign the Azure Kubernetes Service Cluster User Role to the default group
    az role assignment create \
        --role "Azure Kubernetes Service Cluster User Role" \
        --assignee $DEFAULT_ID \
        --scope $AKS_ID
    

建立系統管理員群組

  1. 使用 az ad group create 命令建立系統管理員群組。

    ADMIN_ID=$(az ad group create \
        --display-name admin \
        --mail-nickname admin \
        --query id \
        --output tsv)
    
  2. 使用 命令將Azure Kubernetes Service RBAC Admin角色指派給系統管理員群組。az role assignment create

    az role assignment create \
        --role "Azure Kubernetes Service RBAC Admin" \
        --assignee $ADMIN_ID \
        --scope $AKS_ID
    

注意

如果您想要讓系統管理員群組中的使用者變更節點集區設定,例如手動調整,您必須使用下列命令在叢集節點集區上建立Contributor角色指派:

az role assignment create \
   --role "Contributor" \
   --assignee $ADMIN_ID \
   --scope $AKS_ID/nodepools/<node-pool-name>

請記住,這隻會授與相應縮小或相應放大 AKS 資源的許可權。 如果您想要允許從虛擬機擴展集資源相應縮小或相應放大,您必須在虛擬機擴展集層級建立指派。

建立核准者群組

  • 使用 az ad group create 命令建立核准者群組。

    APPROVER_ID=$(az ad group create \
        --display-name approver \
        --mail-nickname approver \
        --query id \
        --output tsv)
    

在 Microsoft Entra 識別碼中建立示範使用者

在本節中,我們會在 Microsoft Entra ID 中建立兩個使用者:只有預設角色的一使用者,以及可核准或拒絕一般使用者的 Just-In-Time 要求的特殊許可權使用者。

  1. 使用 az ad user create 命令建立一般使用者。

    DOMAIN=contoso.com
    PASSWORD=Password1
    
    NUSER_ID=$(az ad user create \
        --display-name n01 \
        --password ${PASSWORD} \
        --user-principal-name n01@${DOMAIN} \
        --query id \
        --output tsv)
    
  2. 使用 az ad group member add 命令將一般使用者新增至預設群組。

    az ad group member add \
        --group $DEFAULT_ID \
        --member-id $NUSER_ID
    
  3. 使用 az ad user create 命令建立特殊許可權的使用者。

    PUSER_ID=$(az ad user create \
        --display-name p01 \
        --password ${PASSWORD} \
        --user-principal-name p01@${DOMAIN} \
        --query id \
        --output tsv)
    
  4. 使用 az ad group member add 命令將特殊許可權的使用者新增至核准者群組。

    az ad group member add \
        --group $APPROVER_ID \
        --member-id $PUSER_ID
    

為系統管理員群組啟用 Privileged Identity Management (PIM)

  1. 從 Azure 入口網站 首頁,選取 [Microsoft項目標識符]。
  2. 從服務功能表中的 [管理] 底下,選取 [群組],然後選取系統管理員群組。
  3. 從服務功能表中,選取 [活動] 底下的 [Privileged Identity Management],然後選取 [啟用此群組的 PIM]。

設定系統管理員群組的核准者

  1. 從 Azure 入口網站 首頁,搜尋並選取 [Privileged Identity Management]。

  2. 從服務功能表中的 [管理] 底下,選取 [群組],然後選取系統管理員群組。

  3. 從 [服務] 功能表的 [管理] 底下,選取 [指派][新增指派>]。

  4. 在 [新增指派] 頁面的 [成員資格] 索引標籤上,選取 [成員] 作為選取的角色,默認為選取的成員,然後選取 [下一步]。

  5. 在 [ 設定] 索引標籤上,選取 [ 合格] 作為指派類型,然後選取 [ 指派]。

  6. 從服務功能表中的 [管理] 底下,選取 [設定>成員>編輯]。

  7. 在 [編輯角色設定 - 成員] 頁面上,選取 [需要核准才能啟用] 複選框,並將核准者群組新增為選取的核准者。

    注意

    如果您未選取 [需要核准才能啟用] 複選框,預設群組中的使用者可以自行啟動角色,以在未經核准的情況下取得 AKS 叢集的 Just-In-Time 存取權。 核准者群組中的用戶必須是群組的成員。 即使您將使用者設定為 擁有者,他們仍然無法檢閱 Just-In-Time 要求,因為群組擁有者只有群組的系統管理許可權,而不是角色指派。 您可以將使用者設定為相同群組的成員和擁有者,而不會發生衝突。

  8. 進行任何其他必要的變更,然後選取 [ 更新]。

如需 PIM 組態的詳細資訊,請參閱 設定群組的 PIM。

使用預設角色與叢集資源互動

現在,我們可以嘗試使用屬於預設群組成員的一般用戶來存取 AKS 叢集。

  1. 使用 az login 命令以一般使用者身分登入 Azure 入口網站

    az login --username n01@$DOMAIN --password ${PASSWORD}
    
  2. 使用 az aks get-credentials 命令,取得使用者認證以存取叢集。

    az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
    
  3. 嘗試使用 kubectl get 命令存取叢集 Pod。

    kubectl get pods --namespace kube-system
    

    您的輸出看起來應該類似下列範例輸出,其中顯示 命名空間中的 kube-system Pod:

    NAME                                   READY   STATUS    RESTARTS   AGE
    azure-ip-masq-agent-2rdd9              1/1     Running   0          30h
    azure-policy-767c9d9d9d-886rf          1/1     Running   0          31h
    cloud-node-manager-92t6h               1/1     Running   0          30h
    coredns-789789675-b2dhg                1/1     Running   0          31h
    coredns-autoscaler-77bbc46446-pgt92    1/1     Running   0          31h
    csi-azuredisk-node-lnzrf               3/3     Running   0          30h
    csi-azurefile-node-lhbxr               3/3     Running   0          31h
    konnectivity-agent-7645d94b-9wqct      1/1     Running   0          30h
    kube-proxy-lkx4w                       1/1     Running   0          31h
    metrics-server-5955767688-lpbjb        2/2     Running   0          30h
    
  4. 嘗試使用 kubectl get 命令存取叢集秘密。

    kubectl get secrets --namespace kube-system
    

    您的輸出看起來應該類似下列範例輸出,這會顯示錯誤訊息,因為使用者沒有存取秘密的許可權:

    Error from server (Forbidden): secrets is forbidden: User "[email protected]" cannot list resource "secrets" in API group "" in the namespace "kube-system": User does not have access to the resource in Azure. Update role assignment to allow access.
    

    角色 Azure Kubernetes Service RBAC Reader 沒有存取秘密的許可權,因此預期會發生此錯誤。

要求 Just-In-Time 存取 AKS 叢集

這次,我們可以使用在 Privileged Identity Management 中啟用群組成員資格或擁有權中的步驟,以暫時Azure Kubernetes Service RBAC Admin方式要求 Just-In-Time 存取。 若要瞭解如何將要求核准或拒絕為核准者,請參閱 核准群組成員和擁有者的啟用要求。

使用系統管理員角色與叢集資源互動

暫時新增 Azure Kubernetes Service RBAC Admin 角色之後,您可以存取需要系統管理員許可權的叢集資源。

  1. 使用下列 kubelogin 命令移除現有的預存令牌:

    kubelogin remove-tokens
    

    注意

    如果您因為許可權不足而發生錯誤,請使用 命令登入以重新整理許可權 az login

  2. 嘗試使用 kubectl get secrets 命令再次存取叢集密碼。

    kubectl get secrets --namespace kube-system
    

    您的輸出看起來應該類似下列範例輸出,其中顯示 命名空間中的 kube-system 秘密:

    NAME                     TYPE                            DATA   AGE
    bootstrap-token-sw3rck   bootstrap.kubernetes.io/token   4      35h
    konnectivity-certs       Opaque                          3      35h
    

    用戶現在可以存取秘密,因為它們具有 Azure Kubernetes Service RBAC Admin 角色。

令牌存留期考慮

由於 令牌存留期 設計,如果您將角色授與使用 CLI 工具的使用者,例如 kubectlkubelogin,在技術上啟用持續時間不能少於 60 分鐘。 即使持續時間設定為小於 60 分鐘,實際有效持續時間仍維持在 60-75 分鐘之間。

嘗試從 Microsoft 身分識別平台 取得令牌時kubeloginaccess_tokenrefresh_token傳回以供進一步使用。access_token 向 API 提出要求,並在 refresh_token 目前到期時用來取得新的 access_tokenaccess_token一旦產生,就無法撤銷 ,但refresh_token可以撤銷 。 refresh_token如果撤銷 ,使用者必須重新驗證,才能取得新的 refresh_token。 若要手動撤銷 refresh_token,您可以使用 Revoke-AzureADUserAllRefreshToken

下一步

如需詳細資訊,請參閱下列文章: