你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

AKS 托管的 Azure Active Directory 集成

AKS 托管 Azure AD 集成简化了 Azure AD 集成过程。 用户以前需要创建客户端应用和服务器应用,而且还需要由 Azure AD 租户授予目录读取权限。 在新版本中,AKS 资源提供程序为你管理客户端应用和服务器应用。

Azure AD 身份验证概述

群集管理员可以根据用户的标识或目录组成员身份来配置 Kubernetes 基于角色的访问控制 (Kubernetes RBAC)。 使用 OpenID Connect 向 AKS 群集提供 Azure AD 身份验证。 OpenID Connect 是构建在 OAuth 2.0 协议顶层的标识层。 有关 OpenID Connect 的详细信息,请参阅 Open ID Connect 文档

若要详细了解 Azure AD 集成流程,请参阅 Azure Active Directory 集成概念文档

限制

  • 无法禁用 AKS 托管的 Azure AD 集成
  • 不支持将 AKS 托管的 Azure AD 集成式群集更改为旧版 AAD
  • AKS 托管的 Azure AD 集成不支持未启用 Kubernetes RBAC 的群集

先决条件

  • Azure CLI 2.29.0 或更高版本
  • 版本不低于 1.18.1 的 Kubectl,或者 kubelogin
  • 如果使用的是 helm,则最低版本为 helm 3.3。

重要

你必须使用最低版本为 1.18.1 的 Kubectl,或者使用 kubelogin。 Kubernetes 和 kubectl 的次版本之间的差不应超过 1 个版本。 如果未使用正确的版本,你会遇到身份验证问题。

若要安装 kubectl 和 kubelogin,请使用以下命令:

sudo az aks install-cli
kubectl version --client
kubelogin --version

对于其他操作系统,请遵循这些说明

开始之前

对于你的群集,你需要一个 Azure AD 组。 此组将在群集上注册为管理员组,以授予群集管理员权限。 你可以使用现有 Azure AD 组,也可以创建一个新组。 记录你的 Azure AD 组的对象 ID。

# List existing groups in the directory
az ad group list --filter "displayname eq '<group-name>'" -o table

若要为群集管理员创建新的 Azure AD 组,请使用以下命令:

# Create an Azure AD group
az ad group create --display-name myAKSAdminGroup --mail-nickname myAKSAdminGroup

创建已启用 Azure AD 的 AKS 群集

使用以下 CLI 命令创建 AKS 群集。

创建 Azure 资源组:

# Create an Azure resource group
az group create --name myResourceGroup --location centralus

创建一个 AKS 群集,并为你的 Azure AD 组启用管理访问权限

# Create an AKS-managed Azure AD cluster
az aks create -g myResourceGroup -n myManagedCluster --enable-aad --aad-admin-group-object-ids <id> [--aad-tenant-id <id>]

成功创建 AKS 托管的 Azure AD 群集后,响应正文中会包含以下部分

"AADProfile": {
    "adminGroupObjectIds": [
      "5d24****-****-****-****-****afa27aed"
    ],
    "clientAppId": null,
    "managed": true,
    "serverAppId": null,
    "serverAppSecret": null,
    "tenantId": "72f9****-****-****-****-****d011db47"
  }

创建群集后,即可开始访问该群集。

访问已启用 Azure AD 的群集

使用 Azure AD 定义组访问群集之前,需要 Azure Kubernetes 服务群集用户内置角色。

获取用于访问群集的用户凭据:

 az aks get-credentials --resource-group myResourceGroup --name myManagedCluster

按照说明进行登录。

使用 kubectl get nodes 命令查看群集中的节点:

kubectl get nodes

NAME                       STATUS   ROLES   AGE    VERSION
aks-nodepool1-15306047-0   Ready    agent   102m   v1.15.10
aks-nodepool1-15306047-1   Ready    agent   102m   v1.15.10
aks-nodepool1-15306047-2   Ready    agent   102m   v1.15.10

配置 Azure 基于角色的访问控制 (Azure RBAC),以便为群集配置其他安全组。

排查 Azure AD 的访问权限问题

重要

下面所述的步骤会绕过正常的 Azure AD 组身份验证。 请仅在紧急情况下使用它们。

如果你被永久阻止,不能访问具有群集访问权限的有效 Azure AD 组,你仍可以获取管理员凭据以直接访问群集。

若要执行这些步骤,你需要有权访问 Azure Kubernetes 服务群集管理员内置角色。

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

在现有群集上启用 AKS 托管的 Azure AD 集成

你可以在现有的启用了 Kubernetes RBAC 的群集上启用 AKS 托管的 Azure AD 集成。 确保将管理员组设置为在群集上保留访问权限。

az aks update -g MyResourceGroup -n MyManagedCluster --enable-aad --aad-admin-group-object-ids <id-1> [--aad-tenant-id <id>]

成功激活 AKS 托管的 Azure AD 群集后,响应正文中会包含以下部分

"AADProfile": {
    "adminGroupObjectIds": [
      "5d24****-****-****-****-****afa27aed"
    ],
    "clientAppId": null,
    "managed": true,
    "serverAppId": null,
    "serverAppSecret": null,
    "tenantId": "72f9****-****-****-****-****d011db47"
  }

按照此处的步骤操作,再次下载用户凭据以访问群集。

升级到 AKS 托管的 Azure AD 集成

如果你的群集使用旧式 Azure AD 集成,则可以升级到 AKS 托管的 Azure AD 集成。

az aks update -g myResourceGroup -n myManagedCluster --enable-aad --aad-admin-group-object-ids <id> [--aad-tenant-id <id>]

成功迁移 AKS 托管的 Azure AD 群集后,响应正文中会包含以下部分

"AADProfile": {
    "adminGroupObjectIds": [
      "5d24****-****-****-****-****afa27aed"
    ],
    "clientAppId": null,
    "managed": true,
    "serverAppId": null,
    "serverAppSecret": null,
    "tenantId": "72f9****-****-****-****-****d011db47"
  }

若要更新 kubeconfig 以访问群集,请按照此处的步骤操作。

通过 kubelogin 进行非交互式登录

有一些当前无法通过 kubectl 执行的非交互式方案,例如持续集成管道。 你可以使用 kubelogin 通过非交互式服务主体登录来访问群集。

禁用本地帐户

在部署 AKS 群集时,本地帐户在默认情况下处于启用状态。 即使是在启用 RBAC 或 Azure Active Directory 集成时,--admin 访问权限仍然存在,本质上是作为一个不可审核的后门选项。 考虑到这一点,AKS 为用户提供了通过 disable-local-accounts 标志来禁用本地帐户的功能。 另外还为托管群集 API 添加了 properties.disableLocalAccounts 字段,以指示该功能是否已在群集上启用。

注意

在启用了 Azure AD 集成的群集上,属于 aad-admin-group-object-ids 指定的组的用户仍将能够通过非管理员凭据获取访问权限。 在未启用 Azure AD 集成并且 properties.disableLocalAccounts 设置为 true 的群集上,获取用户凭据的操作和获取管理员凭据的操作都会失败。

注意

在用户可能使用了本地帐户的现有 AKS 群集上禁用本地帐户用户后,管理员必须轮换群集证书,才能撤销这些用户可能有权访问的证书。 如果这是新群集,则无需任何操作。

创建没有本地帐户的新群集

若要新建没有任何本地帐户的 AKS 群集,请使用带有 disable-local-accounts 标志的 az aks create 命令:

az aks create -g <resource-group> -n <cluster-name> --enable-aad --aad-admin-group-object-ids <aad-group-id> --disable-local-accounts

在输出中,检查 properties.disableLocalAccounts 字段的设置是否为 true,以确认已禁用了本地帐户:

"properties": {
    ...
    "disableLocalAccounts": true,
    ...
}

尝试获取管理员凭据的操作会失败,并且会显示错误消息,指示该功能阻止访问:

az aks get-credentials --resource-group <resource-group> --name <cluster-name> --admin

Operation failed with status: 'Bad Request'. Details: Getting static credential is not allowed because this cluster is set to disable local accounts.

在现有群集上禁用本地帐户

若要在现有 AKS 群集上禁用本地帐户,请使用带有 disable-local-accounts 标志的 az aks update 命令:

az aks update -g <resource-group> -n <cluster-name> --enable-aad --aad-admin-group-object-ids <aad-group-id> --disable-local-accounts

在输出中,检查 properties.disableLocalAccounts 字段的设置是否为 true,以确认已禁用了本地帐户:

"properties": {
    ...
    "disableLocalAccounts": true,
    ...
}

尝试获取管理员凭据的操作会失败,并且会显示错误消息,指示该功能阻止访问:

az aks get-credentials --resource-group <resource-group> --name <cluster-name> --admin

Operation failed with status: 'Bad Request'. Details: Getting static credential is not allowed because this cluster is set to disable local accounts.

在现有群集上重新启用本地帐户

AKS 还提供了使用 enable-local 标志在现有群集上重新启用本地帐户的功能:

az aks update -g <resource-group> -n <cluster-name> --enable-aad --aad-admin-group-object-ids <aad-group-id> --enable-local

在输出中,检查 properties.disableLocalAccounts 字段的设置是否为 false,以确认已重新启用了本地帐户:

"properties": {
    ...
    "disableLocalAccounts": false,
    ...
}

尝试获取管理员凭据的操作会成功:

az aks get-credentials --resource-group <resource-group> --name <cluster-name> --admin

Merged "<cluster-name>-admin" as current context in C:\Users\<username>\.kube\config

通过 Azure AD 和 AKS 使用条件访问

将 Azure AD 与 AKS 群集集成后,还可以使用条件访问来控制对群集的访问。

注意

Azure AD 条件访问是一项 Azure AD 高级版功能。

若要创建用于 AKS 的示例条件访问策略,请完成以下步骤:

  1. 从 Azure 门户的顶部,搜索并选择“Azure Active Directory”。
  2. 在左侧的 Azure Active Directory 菜单中,选择“企业应用程序”。
  3. 在左侧的“企业应用程序”菜单中,选择“条件访问”。
  4. 在左侧的“条件访问”菜单中,选择“策略”,然后选择“新建策略”。 添加条件访问策略
  5. 为策略输入一个名称,例如“aks-policy”。
  6. 选择“用户和组”,然后在“包括”下选择“选择用户和组”。 选择要应用策略的用户和组。 对于此示例,请选择对你的群集具有管理访问权限的同一个 Azure AD 组。 选择要应用条件访问策略的用户或组
  7. 选择“云应用或操作”,然后在“包括”下选择“选择应用”。 搜索“Azure Kubernetes 服务”,然后选择“Azure Kubernetes 服务 AAD 服务器”。 选择用于应用条件访问策略的 Azure Kubernetes 服务 AD 服务器
  8. 在“访问控制” 下,选择“授予” 。 选择“授予访问权限”,然后选择“需要标记为兼容的设备”。 选择此设置将仅允许符合条件访问策略的设备
  9. 在“启用策略”下,选择“开”,然后选择“创建” 。 启用条件访问策略

获取用于访问群集的用户凭据,例如:

 az aks get-credentials --resource-group myResourceGroup --name myManagedCluster

按照说明进行登录。

使用 kubectl get nodes 命令查看群集中的节点:

kubectl get nodes

再次按照说明进行登录。 请注意,一条错误消息会指明你已成功登录,但若要访问资源,你的管理员要求请求访问的设备受 Azure AD 管理。

在 Azure 门户中,导航到 Azure Active Directory,选择“企业应用程序”,然后在“活动”下选择“登录”。请注意,顶部有一个条目,其中的“状态”为“失败”,“条件访问”为“成功”。 选择该条目,然后在“详细信息”中选择“条件访问”。 请注意,你的条件访问策略已列出。

由于条件访问策略而失败的登录条目

使用 Azure AD 和 AKS 配置即时群集访问

用于群集访问控制的另一个选项是对即时请求使用 Privileged Identity Management (PIM)。

注意

PIM 是一个需要 Premium P2 SKU 的 Azure AD Premium 功能。 有关 Azure AD SKU 的详细信息,请参阅定价指南

若要使用 AKS 托管的 Azure AD 集成将即时访问请求与 AKS 群集集成,请完成以下步骤:

  1. 从 Azure 门户的顶部,搜索并选择“Azure Active Directory”。
  2. 记下租户 ID(在本文余下的说明中称为 <tenant-id>在 Web 浏览器中显示 Azure Active Directory 的 Azure 门户屏幕,其中突出显示了租户的 ID。
  3. 在左侧的 Azure Active Directory 菜单中的“管理”下,依次选择“组”、“新建组”。 显示 Azure 门户中的 Active Directory“组”屏幕,其中突出显示了“新建组”选项。
  4. 确保已选择“安全性”组类型,输入组的名称,例如 myJITGroup。 在“可将 Azure AD 角色分配到此组(预览版)”下,选择“是”。 最后,选择“创建”。 显示 Azure 门户中创建新组的屏幕。
  5. 你将返回到“组”页。 选择新建的组,并记下“对象 ID”(在本文余下的说明中称为 <object-id>)。 显示 Azure 门户中刚刚创建的组的屏幕,其中突出显示了“对象 ID”
  6. 使用前面记下的 <tenant-id><object-id> 值通过 AKS 托管的 Azure AD 集成部署 AKS 群集:
    az aks create -g myResourceGroup -n myManagedCluster --enable-aad --aad-admin-group-object-ids <object-id> --aad-tenant-id <tenant-id>
    
  7. 返回 Azure 门户,在左侧的“活动”菜单中,依次选择“特权访问(预览版)”、“启用特权访问”。 显示 Azure 门户中的“特权访问(预览版)”页,其中突出显示了“启用特权访问”
  8. 选择“添加分配”开始授予访问权限。 显示启用后 Azure 门户的特权访问(预览)屏幕。突出显示了“添加分配”选项。
  9. 选择成员的角色,然后选择要向其授予群集访问权限的用户和组。 组管理员可随时修改这些分配。准备好继续时,选择“下一步”。 显示 Azure 门户的“添加分配成员身份”屏幕,其中选择了一个要添加为成员的示例用户。突出显示了“下一步”选项。
  10. 选择“活动”分配类型和所需的持续时间,并提供理由。 准备好继续操作时,选择“分配”。 有关分配类型的详细信息,请参阅在 Privileged Identity Management 中为特权访问组分配资格(预览版)显示 Azure 门户的“添加分配设置”屏幕。其中选择了“活动”分配类型,并提供了示例理由。突出显示了“分配”选项。

完成分配后,通过访问群集来验证是否可以正常进行即时访问。 例如:

 az aks get-credentials --resource-group myResourceGroup --name myManagedCluster

按照以下步骤登录。

使用 kubectl get nodes 命令查看群集中的节点:

kubectl get nodes

请注意身份验证要求,并按照步骤完成身份验证。 如果成功,应会看到类似于下面的输出:

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.
NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-61156405-vmss000000   Ready    agent   6m36s   v1.18.14
aks-nodepool1-61156405-vmss000001   Ready    agent   6m42s   v1.18.14
aks-nodepool1-61156405-vmss000002   Ready    agent   6m33s   v1.18.14

在命名空间级别应用即时访问

  1. 将 AKS 群集与 Azure RBAC 集成。
  2. 通过角色分配将要与即时访问集成的组与群集中的命名空间相关联。
az role assignment create --role "Azure Kubernetes Service RBAC Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID/namespaces/<namespace-name>
  1. 将刚刚在命名空间级别配置的组与 PIM 关联以完成配置。

疑难解答

如果 kubectl get nodes 返回类似于下面的错误:

Error from server (Forbidden): nodes is forbidden: User "aaaa11111-11aa-aa11-a1a1-111111aaaaa" cannot list resource "nodes" in API group "" at the cluster scope

请确保安全组的管理员为你的帐户提供了“活动”分配。

后续步骤