使用 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 存取權的成員可以核准自己的要求和其他人的要求。 我們不建議在生產環境中使用此組態,但對於測試用途很有用。
建立預設群組
使用
az aks show
命令取得 AKS 叢集的資源識別碼。AKS_ID=$(az aks show \ --resource-group <resource-group-name> \ --name <cluster-name> \ --query id \ --output tsv)
使用
az group show
命令取得 AKS 叢集的資源群組識別碼。RG_ID=$(az group show \ --resource-group <resource-group-name> \ --query id \ --output tsv)
使用
az ad group create
命令建立預設群組。DEFAULT_ID=$(az ad group create \ --display-name default \ --mail-nickname default \ --query id \ --output tsv)
使用
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
建立系統管理員群組
使用
az ad group create
命令建立系統管理員群組。ADMIN_ID=$(az ad group create \ --display-name admin \ --mail-nickname admin \ --query id \ --output tsv)
使用 命令將
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 要求的特殊許可權使用者。
使用
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)
使用
az ad group member add
命令將一般使用者新增至預設群組。az ad group member add \ --group $DEFAULT_ID \ --member-id $NUSER_ID
使用
az ad user create
命令建立具特殊許可權的使用者。PUSER_ID=$(az ad user create \ --display-name p01 \ --password ${PASSWORD} \ --user-principal-name p01@${DOMAIN} \ --query id \ --output tsv)
使用
az ad group member add
命令將具特殊許可權的使用者新增至核准者群組。az ad group member add \ --group $APPROVER_ID \ --member-id $PUSER_ID
為系統管理員群組啟用 Privileged Identity Management (PIM)
- 從 Azure 入口網站 首頁,選取 [Microsoft項目標識符]。
- 從服務功能表中的 [管理] 底下,選取 [群組],然後選取系統管理員群組。
- 從服務功能表中,選取 [活動] 底下的 [Privileged Identity Management],然後選取 [啟用此群組的 PIM]。
設定系統管理員群組的核准者
從 Azure 入口網站 首頁,搜尋並選取 [Privileged Identity Management]。
從服務功能表中的 [管理] 底下,選取 [群組],然後選取系統管理員群組。
從 [服務] 功能表的 [管理] 底下,選取 [指派][新增指派>]。
在 [新增指派] 頁面的 [成員資格] 索引標籤上,選取 [成員] 作為選取的角色,默認為選取的成員,然後選取 [下一步]。
在 [ 設定] 索引標籤上,選取 [ 合格] 作為指派類型,然後選取 [ 指派]。
從服務功能表中的 [管理] 底下,選取 [設定>成員>編輯]。
在 [編輯角色設定 - 成員] 頁面上,選取 [需要核准才能啟用] 複選框,並將核准者群組新增為選取的核准者。
注意
如果您未選取 [需要核准才能啟用] 複選框,預設群組中的使用者可以自行啟動角色,以在未經核准的情況下取得 AKS 叢集的 Just-In-Time 存取權。 核准者群組中的用戶必須是群組的成員。 即使您將使用者設定為 擁有者,他們仍然無法檢閱 Just-In-Time 要求,因為群組擁有者只有群組的系統管理許可權,而不是角色指派。 您可以將使用者設定為相同群組的成員和擁有者,而不會發生衝突。
進行任何其他必要的變更,然後選取 [ 更新]。
如需 PIM 組態的詳細資訊,請參閱 設定群組的 PIM。
使用預設角色與叢集資源互動
現在,我們可以嘗試使用屬於預設群組成員的一般用戶來存取 AKS 叢集。
使用
az login
命令以一般使用者身分登入 Azure 入口網站。az login --username n01@$DOMAIN --password ${PASSWORD}
使用
az aks get-credentials
命令,取得使用者認證以存取叢集。az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
嘗試使用
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
嘗試使用
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
角色之後,您可以存取需要系統管理員許可權的叢集資源。
使用下列
kubelogin
命令移除現有的預存令牌:kubelogin remove-tokens
注意
如果您因為許可權不足而發生錯誤,請使用 命令登入以重新整理許可權
az login
。嘗試使用
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 工具的使用者,例如 kubectl
或 kubelogin
,在技術上啟用持續時間不能少於 60 分鐘。 即使持續時間設定為小於 60 分鐘,實際有效持續時間仍維持在 60-75 分鐘之間。
嘗試從 Microsoft 身分識別平台 取得令牌時kubelogin
,access_token
會refresh_token
傳回以供進一步使用。 會 access_token
向 API 提出要求,並在 refresh_token
目前到期時用來取得新的 access_token
。 access_token
一旦產生,就無法撤銷 ,但refresh_token
可以撤銷 。 refresh_token
如果撤銷 ,使用者必須重新驗證,才能取得新的 refresh_token
。 若要手動撤銷 refresh_token
,您可以使用 Revoke-AzureADUserAllRefreshToken
。
下一步
如需詳細資訊,請參閱下列文章: