AKS 托管的 Azure Active Directory 集成

AKS 托管的 Azure Active Directory (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 AD 集成流程。

限制

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

先决条件

在开始之前,请确保满足以下先决条件:

  • Azure CLI 2.29.0 或更高版本。
  • 版本不低于 1.18.1kubectl,或者 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 群集

  1. 创建 Azure 资源组。

    az group create --name myResourceGroup --location chinaeast2
    
  2. 创建一个 AKS 群集,并使用 az aks create 命令为 Azure AD 组启用管理访问权限。

    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 服务群集用户内置角色。

  1. 获取用于访问群集的用户凭据。

    az aks get-credentials --resource-group myResourceGroup --name myManagedCluster
    
  2. 按照说明进行登录。

  3. 使用 kubectl get nodes 命令查看群集中的节点。

    kubectl get nodes
    
  4. 设置 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"
  }

要访问群集,请按照《访问已启用 Azure AD 的群集》中的步骤更新 kubeconfig。

通过 kubelogin 进行非交互式登录

有一些当前无法通过 kubectl 执行的非交互式方案,例如持续集成管道。 可以使用 kubelogin 通过非交互式服务主体凭据连接到群集。

禁用本地帐户

在部署 AKS 群集时,本地帐户在默认情况下处于启用状态。 即使是在启用 RBAC 或 Azure AD 集成时,--admin 访问权限也仍作为一个不可审核的后门选项存在。 可以使用参数 disable-local-accounts 禁用本地帐户。 为托管群集 API 添加了 properties.disableLocalAccounts 字段,以指示该功能是否已在群集上启用。

注意

  • 在启用了 Azure AD 集成的群集上,已分配到 aad-admin-group-object-ids 指定的 Azure AD 管理员组的用户仍可以使用非管理员凭据获得访问权限。 在未启用 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 isn't allowed because this cluster is set to disable local accounts.

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

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

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 isn't 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. 选择“条件访问”>“策略”>“新建策略”。 Adding a Conditional Access policy
  3. 输入策略的名称,例如 aks-policy。
  4. 在“分配”下,选择“用户和组”。 选择要将策略应用到的用户和组。 在此示例中,请选择对你的群集拥有管理员访问权限的同一个 Azure AD 组。 Selecting users or groups to apply the Conditional Access policy
  5. 在“云应用或操作”“包括”下,选择“选择应用”。 搜索“Azure Kubernetes 服务”,然后选择“Azure Kubernetes 服务 AAD 服务器”。 Selecting Azure Kubernetes Service AD Server for applying the Conditional Access policy
  6. 在“访问控制 > 授予”下,依次选择“授予访问权限”、“要求将设备标记为合规”和“需要所有已选控制”。 Selecting to only allow compliant devices for the Conditional Access policy
  7. 确认设置,将“启用策略”设置为“”,然后选择“创建”。 Enabling the Conditional Access policy

创建条件访问策略后,验证是否已成功列出该策略:

  1. 使用 az aks get-credentials 命令获取用户凭据以访问群集。

     az aks get-credentials --resource-group myResourceGroup --name myManagedCluster
    
  2. 按照说明进行登录。

  3. 使用 kubectl get nodes 命令查看群集中的节点。

    kubectl get nodes
    
  4. 在 Azure 门户中,导航到“Azure Active Directory”并选择“企业应用程序”>“活动”>“登录”。

  5. 在“条件访问列下,应会看到“成功”状态。 选择该事件,然后选择“条件访问”选项卡。将会列出你的条件访问策略。 Screenshot that shows failed sign-in entry due to Conditional Access policy.

使用 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>In a web browser, the Azure portal screen for Azure Active Directory is shown with the tenant's ID highlighted.

  3. 选择“”>“新建组”。 Shows the Azure portal Active Directory groups screen with the 'New Group' option highlighted.

  4. 检查是否已选择组类型“安全性”并指定组名称,例如 myJITGroup。 在“可将 Azure AD 角色分配到此组(预览版)”下选择“是”,然后选择“创建”。 Shows the Azure portal's new group creation screen.

  5. 在“组”页上选择刚刚创建的组,并记下“对象 ID”。 在稍后的步骤中,会将其引用为 <object-id>Shows the Azure portal screen for the just-created group, highlighting the Object Id

  6. 结合 --aad-admin-group-objects-ids--aad-tenant-id parameters 使用 az aks create 命令创建 AKS 群集与 AKS 托管 Azure AD 的集成,并包含在前面步骤中记下的值。

    az aks create -g myResourceGroup -n myManagedCluster --enable-aad --aad-admin-group-object-ids <object-id> --aad-tenant-id <tenant-id>
    
  7. 在 Azure 门户中,选择“活动”>“特权访问(预览版)”>“启用特权访问”。 The Azure portal's Privileged access (Preview) page is shown, with 'Enable privileged access' highlighted

  8. 若要授予访问权限,请选择“添加分配”。 The Azure portal's Privileged access (Preview) screen after enabling is shown. The option to 'Add assignments' is highlighted.

  9. 从“选择角色”下拉列表中,选择要为其授予群集访问权限的用户和组。 组管理员随时可以修改这些分配。 然后,选择“下一步”。 The Azure portal's Add assignments Membership screen is shown, with a sample user selected to be added as a member. The option 'Next' is highlighted.

  10. 在“分配类型”下选择“活动”,然后指定所需的持续时间。 提供理由,然后选择“分配”。 有关分配类型的详细信息,请参阅在 Privileged Identity Management 中为特权访问组分配资格(预览版)The Azure portal's Add assignments Setting screen is shown. An assignment type of 'Active' is selected and a sample justification has been given. The option 'Assign' is highlighted.

完成分配后,通过访问群集来验证是否即时访问是否运行正常:

  1. 使用 az aks get-credentials 命令获取用户凭据以访问群集。

    az aks get-credentials --resource-group myResourceGroup --name myManagedCluster
    
  2. 按照以下步骤登录。

  3. 使用 kubectl get nodes 命令查看群集中的节点。

    kubectl get nodes
    
  4. 请注意身份验证要求,并按照步骤完成身份验证。 如果成功,应会看到类似于以下示例输出的输出:

    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
    

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

  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>
    
  3. 将在命名空间级别配置的组与 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

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

后续步骤