使用 Azure 基于角色的访问控制进行 Kubernetes 授权
本文介绍如何使用 Azure RBAC 进行 Kubernetes 授权,该授权允许跨 Azure 资源、AKS 和 Kubernetes 资源进行统一管理和访问控制。 有关详细信息,请参阅用于 Kubernetes 授权的 Azure RBAC。
注意
当使用 Microsoft Entra ID 和 AKS 之间的集成身份验证时,可以将 Microsoft Entra 用户、组或服务主体用作 Kubernetes 基于角色的访问控制 (Kubernetes RBAC) 中的主体。 使用此功能时,无需单独管理 Kubernetes 的用户标识和凭据。 但仍需分别设置和管理 Azure RBAC 和 Kubernetes RBAC。
开始之前
- 需要安装和配置 Azure CLI 版本 2.24.0 或更高版本。 运行
az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。 - 你需要版本不低于
kubectl
1.18.3 的 。 - 需要先在群集上启用托管 Microsoft Entra 集成,然后才能添加用于 Kubernetes 授权的 Azure RBAC。 如果需要启用托管的 Microsoft Entra 集成,请参阅在 AKS 中使用 Microsoft Entra ID。
- 目前,如果你有 CRD 并且要创建自定义角色定义,则涵盖 CRD 的唯一方法是使用
Microsoft.ContainerService/managedClusters/*/read
。 对于剩余的对象,你可以使用特定的 API 组,例如Microsoft.ContainerService/apps/deployments/read
。 - 新角色分配可能需要最多 5 分钟完成传播并由授权服务器更新。
- Azure RBAC 用于 Kubernetes 授权要求为身份验证配置的 Microsoft Entra 租户与包含 AKS 群集的订阅的租户相同。
新建具有托管 Microsoft Entra 集成并使用 Azure RBAC 进行 Kubernetes 授权的 AKS 群集
使用
az group create
命令创建 Azure 资源组。export RESOURCE_GROUP=<resource-group-name> export LOCATION=<azure-region> az group create --name $RESOURCE_GROUP --location $LOCATION
使用
az aks create
命令创建具有托管 Microsoft Entra 集成并使用 Azure RBAC 进行 Kubernetes 授权的 AKS 群集。export CLUSTER_NAME=<cluster-name> az aks create \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME \ --enable-aad \ --enable-azure-rbac \ --generate-ssh-keys
输出应类似于以下示例输出:
"AADProfile": { "adminGroupObjectIds": null, "clientAppId": null, "enableAzureRbac": true, "managed": true, "serverAppId": null, "serverAppSecret": null, "tenantId": "****-****-****-****-****" }
在现有 AKS 群集上启用 Azure RBAC
使用带
--enable-azure-rbac
标志的az aks update
命令在现有 AKS 群集上启用用于 Kubernetes 授权的 Azure RBAC。az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-azure-rbac
从 AKS 群集禁用用于 Kubernetes 授权的 Azure RBAC
使用带
--disable-azure-rbac
标志的az aks update
命令,从现有 AKS 群集中删除用于 Kubernetes 授权的 Azure RBAC。az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --disable-azure-rbac
AKS 内置角色
AKS 提供以下内置角色:
角色 | 说明 |
---|---|
Azure Kubernetes 服务 RBAC 读取者 | 允许进行只读访问并查看命名空间中的大多数对象。 不允许查看角色或角色绑定。 此角色不允许查看 Secrets ,因为读取机密的内容就可以访问命名空间中的 ServiceAccount 凭据,这样就会允许以命名空间中任何 ServiceAccount 的身份进行 API 访问(一种特权提升形式)。 |
Azure Kubernetes 服务 RBAC 写入者 | 允许对命名空间中的大多数对象进行读/写访问。 此角色不允许查看或修改角色或角色绑定。 但是,此角色允许以命名空间中任何 ServiceAccount 的身份访问 Secrets 和运行 Pod,因此可用于获取命名空间中任何 ServiceAccount 的 API 访问级别。 |
Azure Kubernetes 服务 RBAC 管理员 | 允许要在命名空间内授予的管理员访问权限。 允许对命名空间(或群集范围)中的大多数资源进行读/写访问,包括在命名空间内创建角色和角色绑定。 此角色不允许对资源配额或命名空间本身进行写入访问。 |
Azure Kubernetes 服务 RBAC 群集管理员 | 允许超级用户访问权限(对任何资源执行任何操作)。 它提供对群集中每个资源和所有命名空间的完全控制。 |
创建用于群集访问的角色分配
使用
az aks show
命令获取 AKS 资源 ID。AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
使用
az role assignment create
命令创建角色分配。<AAD-ENTITY-ID>
可以是服务主体的用户名或客户端 ID。 以下示例创建用于 Azure Kubernetes 服务 RBAC 管理员角色的角色分配。az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
注意
可以使用
az role assignment create
命令创建 Azure Kubernetes 服务 RBAC 读者和 Azure Kubernetes 服务 RBAC 写入者角色分配,范围限定为群集中的特定命名空间,并将范围设置为所需的命名空间。az role assignment create --role "Azure Kubernetes Service RBAC Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID/namespaces/<namespace-name>
创建自定义角色定义
以下自定义角色定义示例仅允许用户读取部署,不允许任何其他操作。 有关可能操作的完整列表,请参阅 Microsoft.ContainerService 操作。
若要创建自己的自定义角色定义,请复制以下文件,将
<YOUR SUBSCRIPTION ID>
替换为自己的订阅 ID,然后将其另存为deploy-view.json
。{ "Name": "AKS Deployment Reader", "Description": "Lets you view all deployments in cluster/namespace.", "Actions": [], "NotActions": [], "DataActions": [ "Microsoft.ContainerService/managedClusters/apps/deployments/read" ], "NotDataActions": [], "assignableScopes": [ "/subscriptions/<YOUR SUBSCRIPTION ID>" ] }
使用
az role definition create
命令创建角色定义,并将--role-definition
设置为在上一步中创建的deploy-view.json
文件。az role definition create --role-definition @deploy-view.json
使用
az role assignment create
命令将角色定义分配给用户或其他标识。az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
通过 kubectl
使用 Azure RBAC 进行 Kubernetes 授权
请确保你具有 Azure Kubernetes 服务群集用户这一内置角色,然后使用
az aks get-credentials
命令获取 AKS 群集的 kubeconfig。az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
现在可以使用
kubectl
来管理群集。 例如,可以使用kubectl get nodes
列出群集中的节点。kubectl get nodes
示例输出:
NAME STATUS ROLES AGE VERSION aks-nodepool1-93451573-vmss000000 Ready agent 3h6m v1.15.11 aks-nodepool1-93451573-vmss000001 Ready agent 3h6m v1.15.11 aks-nodepool1-93451573-vmss000002 Ready agent 3h6m v1.15.11
通过 kubelogin
使用 Azure RBAC 进行 Kubernetes 授权
AKS 创建了 kubelogin
插件,以帮助实现更多方案,例如非交互式登录、旧 kubectl
版本或在不登录到新群集的情况下跨多个群集利用 SSO。
通过运行以下命令来使用
kubelogin
插件:export KUBECONFIG=/path/to/kubeconfig kubelogin convert-kubeconfig
现在可以使用
kubectl
来管理群集。 例如,可以使用kubectl get nodes
列出群集中的节点。kubectl get nodes
示例输出:
NAME STATUS ROLES AGE VERSION aks-nodepool1-93451573-vmss000000 Ready agent 3h6m v1.15.11 aks-nodepool1-93451573-vmss000001 Ready agent 3h6m v1.15.11 aks-nodepool1-93451573-vmss000002 Ready agent 3h6m v1.15.11
清理资源
删除角色分配
使用
az role assignment list
命令列出角色分配。az role assignment list --scope $AKS_ID --query [].id --output tsv
使用
az role assignment delete
命令删除角色分配。az role assignment delete --ids <LIST OF ASSIGNMENT IDS>
删除角色定义
使用
az role definition delete
命令删除自定义角色定义。az role definition delete --name "AKS Deployment Reader"
删除资源组和 AKS 群集
使用
az group delete
命令删除资源组和 AKS 群集。az group delete --name $RESOURCE_GROUP --yes --no-wait
后续步骤
若要详细了解 AKS 身份验证、授权、Kubernetes RBAC 和 Azure RBAC,请参阅: