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 的群集
  • 不支持更改与 AKS 托管的 Azure AD 集成关联的 Azure AD 租户

必备条件

  • Azure CLI 2.11.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 chinaeast2

创建一个 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 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"
  }

如果要访问群集,请按照此处的步骤进行操作。

通过 kubelogin 进行非交互式登录

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

通过 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/deviceloginchina 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

故障排除

如果 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

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

后续步骤