在 Azure Kubernetes Service 中搭配 Microsoft Entra ID 使用 Kubernetes 角色型存取控制
Azure Kubernetes Service (AKS) 可以設定為使用 Microsoft Entra ID 進行使用者驗證。 在此設定中,您會使用 Microsoft Entra 驗證權杖登入 AKS 叢集。 驗證之後,您可以使用內建的 Kubernetes 角色型存取控制 (Kubernetes RBAC),來管理以使用者的身分識別,或群組成員資格為基礎的命名空間和叢集資源存取權。
本文章說明如何:
- 根據 Microsoft Entra 群組成員資格,在 AKS 叢集中使用 Kubernetes RBAC 來控制存取。
- 在 Microsoft Entra ID 中建立範例群組和使用者。
- 在 AKS 叢集中建立角色和 RoleBindings,以授與建立和檢視資源的適當權限。
開始之前
- 您已經擁有啟用了 Microsoft Entra 整合的現有 AKS 叢集。 如果您需要具有此設定的 AKS 叢集,請參閱整合 Microsoft Entra ID 與 AKS。
- Kubernetes RBAC 預設會在 AKS 叢集建立期間啟用。 若要使用 Microsoft Entra 整合和 Kubernetes RBAC 升級叢集,在現有的 AKS 叢集上啟用 Microsoft Entra 整合。
- 請確定已安裝並設定 Azure CLI 2.0.61 版或更新版本。 執行
az --version
以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。 - 如果使用 Terraform,請安裝 Terraform 2.99.0 版或更新版本。
使用 Azure 入口網站或 Azure CLI 來確認已啟用 Microsoft Entra 與 Kubernetes RBAC 的整合。
若要使用 Azure 入口網站進行驗證:
- 登入 Azure 入口網站 並流覽至您的 AKS 叢集資源。
- 在服務功能表中的 [設定] 底下,選取 [叢集組態]。
- 在 [驗證與授權] 區段底下,確認已選取 [使用 Kubernetes RBAC 的 Microsoft Entra 驗證] 選項。
在 Microsoft Entra 識別碼中建立示範群組
在本文中,我們將建立兩個使用者角色,以顯示 Kubernetes RBAC 和 Microsoft Entra ID 如何控制叢集資源的存取。 使用下列兩個範例角色:
- 應用程式開發人員
- 名為 aksdev 的使用者,屬於 appdev 群組的一部分。
- 網站可靠性工程師
- 名為 akssre 的使用者,屬於 opssre 群組的一部分。
在生產環境中,您可以使用 Microsoft Entra 租使用者中的現有使用者和群組。
首先,使用
az aks show
命令取得 AKS 叢集的資源識別碼。 然後,將資源標識碼指派給名為 AKS_ID 的變數,以便在其他命令中參考。AKS_ID=$(az aks show \ --resource-group myResourceGroup \ --name myAKSCluster \ --query id -o tsv)
使用
az ad group create
命令,為應用程式開發人員在 Microsoft Entra ID 中建立第一個範例群組。 下列範例會建立名稱為 appdev 的資源群組:APPDEV_ID=$(az ad group create --display-name appdev --mail-nickname appdev --query id -o tsv)
使用
az role assignment create
命令,為 appdev 群組建立 Azure 角色指派。 此指派可讓群組的任何成員透過授與 Azure Kubernetes Service 叢集使用者角色,來使用kubectl
與 AKS 叢集互動。az role assignment create \ --assignee $APPDEV_ID \ --role "Azure Kubernetes Service Cluster User Role" \ --scope $AKS_ID
提示
如果您收到 Principal 35bfec9328bd4d8d9b54dea6dac57b82 doesn't exist in the directory a5443dcd-cd0e-494d-a387-3039b419f0d5.
之類的錯誤,請等候幾秒鐘,讓 Microsoft Entra 群組對象標識碼傳播到目錄,然後再試一次 az role assignment create
命令。
為名為 opssre 的 SRE 建立第二個範例群組。
OPSSRE_ID=$(az ad group create --display-name opssre --mail-nickname opssre --query id -o tsv)
建立 Azure 角色指派,以授與群組成員 Azure Kubernetes Service 叢集使用者角色。
az role assignment create \ --assignee $OPSSRE_ID \ --role "Azure Kubernetes Service Cluster User Role" \ --scope $AKS_ID
在 Microsoft Entra 識別碼中建立示範使用者
既然我們已為應用程式開發人員和 SRE 在 Microsoft Entra ID 中建立兩個範例群組,我們將建立兩個範例使用者。 若要在本文結尾測試 Kubernetes RBAC 整合,您將使用這些帳戶登入 AKS 叢集。
為應用程式開發人員設定用戶主體名稱和密碼
為應用程式開發人員設定使用者主體名稱 (UPN) 和密碼。 UPN 必須包含租用戶的已驗證功能變數名稱,例如 aksdev@contoso.com
。
下列命令會提示您輸入 UPN,並將它設定為 AAD_DEV_UPN,以便在稍後的命令中使用:
echo "Please enter the UPN for application developers: " && read AAD_DEV_UPN
下列命令會提示您輸入密碼,並將它設定為 AAD_DEV_PW,以供稍後的命令使用:
echo "Please enter the secure password for application developers: " && read AAD_DEV_PW
建立使用者帳戶
- 使用
az ad user create
命令,在 Microsoft Entra ID 中建立第一個使用者帳戶。 下列範例會使用 AAD_DEV_UPN 和 AAD_DEV_PW 中的值,建立名稱為 AKS Dev 和 UPN 而且有安全密碼的使用者:
AKSDEV_ID=$(az ad user create \
--display-name "AKS Dev" \
--user-principal-name $AAD_DEV_UPN \
--password $AAD_DEV_PW \
--query id -o tsv)
- 使用
az ad group member add
命令,將使用者新增至在上一節中建立的 appdev 群組。
az ad group member add --group appdev --member-id $AKSDEV_ID
- 設定 SRE 的 UPN 和密碼。 UPN 必須包含租用戶的已驗證功能變數名稱,例如
akssre@contoso.com
。 下列命令會提示您輸入UPN,並將它設定為 AAD_SRE_UPN,以供稍後的命令使用:
echo "Please enter the UPN for SREs: " && read AAD_SRE_UPN
- 下列命令會提示您輸入密碼,並將它設定為 AAD_SRE_PW,以供稍後的命令使用:
echo "Please enter the secure password for SREs: " && read AAD_SRE_PW
- 建立第二個使用者帳戶。 下列範例會使用 AAD_SRE_UPN 和 AAD_SRE_PW 中的值,建立名稱為 AKS SRE 和 UPN 而且有安全密碼的使用者:
# Create a user for the SRE role
AKSSRE_ID=$(az ad user create \
--display-name "AKS SRE" \
--user-principal-name $AAD_SRE_UPN \
--password $AAD_SRE_PW \
--query id -o tsv)
# Add the user to the opssre Azure AD group
az ad group member add --group opssre --member-id $AKSSRE_ID
為應用程式開發建立 AKS 叢集資源
我們已建立 Microsoft Entra 群組、使用者和 Azure 角色指派。 現在,我們將設定 AKS 叢集,以允許這些不同的群組存取特定資源。
- 使用
az aks get-credentials
命令取得叢集管理員認證。 在下列其中一節中,您會取得一般使用者叢集認證,以查看 Microsoft Entra 驗證流程的運作情形。
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --admin
- 使用
kubectl create namespace
命令在 AKS 叢集中建立命名空間。 下列範例會建立命名空間名稱 dev:
kubectl create namespace dev
注意
在 Kubernetes 中,「Roles」會定義要授與的權限,而「RoleBindings」會將角色套用至需要的使用者或群組。 這些指派可以套用至指定的命名空間或在整個叢集中套用。 如需詳細資訊,請參閱使用 Kubernetes RBAC 授權。
如果您授與 Kubernetes RBAC 繫結的使用者位於相同的 Microsoft Entra 租用戶中,請根據 userPrincipalName (UPN) 指派權限。 如果使用者在不同的 Microsoft Entra 租用戶中,請改為查詢並使用 objectId 屬性。
- 建立 dev 命名空間的角色,以授與命名空間的完整權限。 在生產環境中,您可以為不同的使用者或群組指定更細微的權限。 建立名為
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: ["*"]
- 使用
kubectl apply
命令建立角色,並指定 YAML 指令清單的檔名。
kubectl apply -f role-dev-namespace.yaml
- 使用
az ad group show
命令取得 appdev 群組的資源識別符。 此群組會在下一個步驟中設定為 RoleBinding 的主體。
az ad group show --group appdev --query id -o tsv
- 為 appdev 群組建立 RoleBinding,以使用先前建立的角色進行命名空間存取。 建立名為
rolebinding-dev-namespace.yaml
的檔案,並貼上下列 YAML 資訊清單。 在最後一行,將 groupObjectId 取代為上一個命令的群組對象標識碼輸出。
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,並將 groupObjectld 取代為使用者主體名稱 (UPN)。
- 使用
kubectl apply
命令建立 RoleBinding,並指定 YAML 指令清單的檔名:
kubectl apply -f rolebinding-dev-namespace.yaml
為 SRE 建立 AKS 叢集資源
現在,我們將重複上述步驟,為 SRE 建立命名空間、角色和 RoleBinding。
- 使用
kubectl create namespace
命令,為 sre 建立命名空間。
kubectl create namespace sre
- 建立名為
role-sre-namespace.yaml
的檔案,並貼上下列 YAML 資訊清單:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: sre-user-full-access
namespace: sre
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["batch"]
resources:
- jobs
- cronjobs
verbs: ["*"]
- 使用
kubectl apply
命令建立角色,並指定 YAML 指令清單的檔名。
kubectl apply -f role-sre-namespace.yaml
- 使用 az ad group show 命令取得 opssre 群組的資源識別碼。
az ad group show --group opssre --query id -o tsv
- 為 opssre 群組建立 RoleBinding,藉以使用先前建立的 Role 來存取命名空間。 建立名為
rolebinding-sre-namespace.yaml
的檔案,並貼上下列 YAML 資訊清單。 在最後一行,將 groupObjectId 取代為上一個命令的群組對象標識碼輸出。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: sre-user-access
namespace: sre
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: sre-user-full-access
subjects:
- kind: Group
namespace: sre
name: groupObjectId
- 使用
kubectl apply
命令建立 RoleBinding,並指定 YAML 指令清單的檔名。
kubectl apply -f rolebinding-sre-namespace.yaml
使用 Microsoft Entra 身分識別與叢集資源互動
現在,我們將測試當您在 AKS 叢集中建立和管理資源時,預期的權限可運作。 在這些範例中,我們將排程和檢視使用者指派命名空間中的 Pod,並嘗試排程和檢視指派命名空間以外的 Pod。
- 使用
az aks get-credentials
命令重設 kubeconfig 內容。 在上一節中,您會使用叢集管理員認證來設定內容。 系統管理員使用者會略過 Microsoft Entra 登入提示。 如果沒有--admin
參數,就會套用使用者內容,要求使用 Microsoft Entra ID 驗證所有要求。
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing
- 使用 dev 命名空間中的
kubectl run
命令,排程基本 NGINX Pod。
kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
- 輸入在文章開頭建立的您自己的
appdev@contoso.com
帳戶認證,作為登入提示。 成功登入之後,系統會快取帳戶權杖以供日後kubectl
命令使用。 NGINX 已成功排程,如下列範例輸出所示:
$ kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code B24ZD6FP8 to authenticate.
pod/nginx-dev created
- 使用
kubectl get pods
命令來檢視 dev 命名空間中的 Pod。
kubectl get pods --namespace dev
- 確定 NGINX Pod 的狀態為執行中。 輸出看起來會類似下列輸出:
$ 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 Role,如下列範例輸出所示:
Error from server (Forbidden): pods is forbidden: User "aksdev@contoso.com" cannot list resource "pods" in API group "" at the cluster scope
同樣地,請嘗試在不同的命名空間中排程 Pod,例如 sre 命名空間。 使用者的群組成員資格與 Kubernetes Role 和 RoleBinding 不一致,以授與這些權限,如下列範例輸出所示:
$ kubectl run nginx-dev --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre
Error from server (Forbidden): pods is forbidden: User "aksdev@contoso.com" cannot create resource "pods" in API group "" in the namespace "sre"
測試 AKS 叢集資源的 SRE 存取
若要確認 Microsoft Entra 群組成員資格和 Kubernetes RBAC 在不同使用者和群組之間正常運作,請在以 opssre 使用者身分登入時,嘗試先前的命令。
- 使用
az aks get-credentials
命令來重設 kubeconfig 內容,以清除先前快取 aksdev 使用者的驗證權杖。
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --overwrite-existing
- 嘗試在指派的 sre 命名空間中排程和檢視 Pod。 出現提示時,請使用在文章開頭建立的您自己的
opssre@contoso.com
認證登入。
kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre
kubectl get pods --namespace sre
如下列範例輸出所示,您可以成功建立和檢視 Pod:
$ kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace sre
3. To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code BM4RHP3FD to authenticate.
pod/nginx-sre created
$ kubectl get pods --namespace sre
NAME READY STATUS RESTARTS AGE
nginx-sre 1/1 Running 0
- 嘗試在指派的 SRE 命名空間之外檢視或排程 Pod。
kubectl get pods --all-namespaces
kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
這些 kubectl
命令失敗,如下列範例輸出所示。 使用者的群組成員資格和 Kubernetes Role 和 RoleBindings 不會授與其他命名空間中建立或管理員資源的權限。
$ kubectl get pods --all-namespaces
Error from server (Forbidden): pods is forbidden: User "akssre@contoso.com" cannot list pods at the cluster scope
$ kubectl run nginx-sre --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine --namespace dev
Error from server (Forbidden): pods is forbidden: User "akssre@contoso.com" cannot create pods in the namespace "dev"
清除資源
在本文中,您已在 AKS 叢集中建立資源,並在 Microsoft Entra ID 中建立使用者和群組。 若要清除所有資源,請執行下列命令:
# Get the admin kubeconfig context to delete the necessary cluster resources.
az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --admin
# Delete the dev and sre namespaces. This also deletes the pods, Roles, and RoleBindings.
kubectl delete namespace dev
kubectl delete namespace sre
# Delete the Azure AD user accounts for aksdev and akssre.
az ad user delete --upn-or-object-id $AKSDEV_ID
az ad user delete --upn-or-object-id $AKSSRE_ID
# Delete the Azure AD groups for appdev and opssre. This also deletes the Azure role assignments.
az ad group delete --group appdev
az ad group delete --group opssre
下一步
如需如何保護 Kubernetes 叢集的詳細資訊,請參閱 AKS 的存取和身分識別選項。
如需身分識別和資源控制的最佳做法,請參閱 AKS 中驗證和授權的最佳做法。