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 中驗證和授權的最佳做法。