使用 Azure 基于角色的访问控制定义对 Azure Kubernetes 服务 (AKS) 中的 Kubernetes 配置文件的访问

可以使用 kubectl 工具来与 Kubernetes 群集交互。 Azure CLI 提供了一种简单的方法来获取访问凭据和 kubeconfig 配置文件,以便使用 kubectl 连接到 AKS 群集。 可以使用 Azure 基于角色的访问控制 (Azure RBAC) 来限制谁可以访问 kubeconfig 文件以及他们拥有的权限。

本文介绍如何分配用于限制谁可以获取 AKS 群集配置信息的 Azure 角色。

准备阶段

  • 本文假定你拥有现有的 AKS 群集。 如果需要 AKS 群集,请使用 Azure CLIAzure PowerShellAzure 门户创建一个。
  • 本文还要求运行 Azure CLI 2.0.65 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

群集角色的可用权限

当你使用 kubectl 工具与 AKS 群集交互时,一个名为 kubeconfig 的配置文件会定义群集连接信息。 此配置文件通常存储在 ~/.kube/config 中。可在此 kubeconfig 文件中定义多个群集。 可以使用 kubectl config use-context 命令在群集之间切换。

使用 az aks get-credentials 命令可以获取 AKS 群集的访问凭据,并将凭据合并到 kubeconfig 文件中。 可以使用 Azure RBAC 来控制对这些凭据的访问。 使用这些 Azure 角色可以定义谁能够检索 kubeconfig 文件,以及他们在群集中拥有的权限。

有两个 Azure 角色可以应用于 Microsoft Entra 用户或组:

  • Azure Kubernetes 服务群集管理员角色

    • 允许访问 Microsoft.ContainerService/managedClusters/listClusterAdminCredential/action API 调用。 此 API 调用列出群集管理员凭据
    • 下载 clusterAdmin 角色的 kubeconfig
  • Azure Kubernetes 服务群集用户角色

    • 允许访问 Microsoft.ContainerService/managedClusters/listClusterUserCredential/action API 调用。 此 API 调用列出群集用户凭据
    • 下载 clusterUser 角色的 kubeconfig

注意

在使用 Microsoft Entra ID 的群集上,具有 clusterUser 角色的用户有一个提示登录的空 kubeconfig 文件。 登录后,用户可以根据其 Microsoft Entra 用户或组设置进行访问。 具有 clusterAdmin 角色的用户拥有管理员访问权限。

在不使用 Microsoft Entra ID 的群集上,clusterUser 角色具有的效果与 clusterAdmin 角色相同。

将角色权限分配给用户或组

若要分配其中一个可用角色,你需要使用以下步骤获取 AKS 群集的资源 ID 和 Microsoft Entra 用户帐户或组的 ID:

  1. 使用 az aks show 命令获取 myResourceGroup 资源组中名为 myAKSCluster 的群集的群集资源 ID。 请根据需要提供自己的群集和资源组名称。
  2. 使用 az account showaz ad user show 命令获取用户 ID。
  3. 使用 az role assignment create 命令分配角色。

以下示例将 Azure Kubernetes 服务群集管理员角色分配给单个用户帐户:

# Get the resource ID of your AKS cluster
AKS_CLUSTER=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query id -o tsv)

# Get the account credentials for the logged in user
ACCOUNT_UPN=$(az account show --query user.name -o tsv)
ACCOUNT_ID=$(az ad user show --id $ACCOUNT_UPN --query objectId -o tsv)

# Assign the 'Cluster Admin' role to the user
az role assignment create \
    --assignee $ACCOUNT_ID \
    --scope $AKS_CLUSTER \
    --role "Azure Kubernetes Service Cluster Admin Role"

若要将权限分配给 Microsoft Entra 组,请使用而不是用户的对象 ID 更新在上一示例中显示的 --assignee 参数。

若要获取组的对象 ID,请使用 az ad group show 命令。 以下命令获取名为 appdev 的 Microsoft Entra 组的对象 ID:

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

重要

在某些情况下,例如对于 Microsoft Entra 来宾用户,帐户中的 user.nameuserPrincipalName 不同。

$ az account show --query user.name -o tsv
user@contoso.com

$ az ad user list --query "[?contains(otherMails,'user@contoso.com')].{UPN:userPrincipalName}" -o tsv
user_contoso.com#EXT#@contoso.partner.onmschina.cn

在这种情况下,请将 ACCOUNT_UPN 的值设置为 Microsoft Entra 用户的 userPrincipalName。 例如,如果帐户 user.nameuser@contoso.com,则此操作将如以下示例所示:

ACCOUNT_UPN=$(az ad user list --query "[?contains(otherMails,'user@contoso.com')].{UPN:userPrincipalName}" -o tsv)

获取并验证配置信息

分配 Azure 角色后,请使用 az aks get-credentials 命令获取 AKS 群集的 kubeconfig 定义。 以下示例获取 --admin 凭据,如果为用户分配了群集管理员角色,则这些凭据可正常运行:

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster --admin

然后,可以使用 kubectl config view 命令来验证群集上下文是否显示已应用管理员配置信息。

$ kubectl config view

输出应类似于以下示例输出:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://myaksclust-myresourcegroup-19da35-4839be06.hcp.chinaeast2.cx.prod.service.azk8s.cn:443
  name: myAKSCluster
contexts:
- context:
    cluster: myAKSCluster
    user: clusterAdmin_myResourceGroup_myAKSCluster
  name: myAKSCluster-admin
current-context: myAKSCluster-admin
kind: Config
preferences: {}
users:
- name: clusterAdmin_myResourceGroup_myAKSCluster
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    token: e9f2f819a4496538b02cefff94e61d35

删除角色权限

若要删除角色分配,请使用 az role assignment delete 命令。 指定在前面的步骤中获得的帐户 ID 和群集资源 ID。 如果将角色分配给组而不是用户,请为 --assignee 参数指定相应的组对象 ID 而不是帐户对象 ID。

az role assignment delete --assignee $ACCOUNT_ID --scope $AKS_CLUSTER

后续步骤

若要增强在访问 AKS 群集时的安全性,请集成 Microsoft Entra 身份验证