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

使用 Privileged Identity Management (PIM) 控制对 Azure Kubernetes 服务 (AKS) 群集的访问

为不同的团队设置权限时,可能希望为指定的团队设置默认权限,然后在需要时向特定用户授予特权访问权限。 将 Azure Kubernetes 服务 (AKS) 与 Microsoft Entra ID 配合使用,可以针对实时 (JIT) 请求设置 Privileged Identity Management (PIM)。

在本文中,学习如何:

  • 根据 Microsoft Entra 组成员身份为示例组设置默认角色,以便他们能够访问 AKS 集群并对其执行操作。
  • 配置访问 AKS 群集的基本角色。
  • 自行激活角色,以获取对 AKS 群集的实时访问权限。
  • 设置审批者,以批准或拒绝实时访问的审批请求。

注意

Microsoft Entra Privileged Identity Management (PIM) 具有 Microsoft Entra ID P2 或 Microsoft Entra ID Governance 功能,需要 Premium P2 SKU。 有关详细信息,请参阅 Microsoft Entra ID Governance 许可基础知识定价指南

先决条件

本文假设你有一个集成了 Microsoft Entra ID 的现有 AKS 群集。 如果没有,请参阅创建集成了 Microsoft Entra ID 的 AKS 群集

在 Microsoft Entra ID 中创建演示组

在本部分中,我们将在 Microsoft Entra ID 中创建三个组:

  • 默认:此组对 AKS 群集中的资源具有只读访问权限 (Azure Kubernetes Service RBAC Reader)
  • 管理员:此组对 AKS 群集中的资源具有管理员访问权限 (Azure Kubernetes Service RBAC Admin)
  • 审批者:此组拥有批准或拒绝对 AKS 群集进行实时访问的请求的权限

可以只使用默认组和管理员组,而无需创建单独的审批者组。 但是,如果将审批权限包含在管理员组中,那么获取实时访问权限的成员就可以批准自己和其他人的请求。 我们不建议在生产环境中使用此配置,但它在测试时很有用。

创建默认组

  1. 使用 az aks show 命令获取 AKS 群集的资源 ID

    AKS_ID=$(az aks show \
        --resource-group <resource-group-name> \
        --name <cluster-name> \
        --query id \
        --output tsv)
    
  2. 使用 az group show 命令获取 AKS 群集的资源组 ID

    RG_ID=$(az group show \
        --resource-group <resource-group-name> \
        --query id \
        --output tsv)
    
  3. 使用 az ad group create 命令创建默认组

    DEFAULT_ID=$(az ad group create \
        --display-name default \
        --mail-nickname default \
        --query id \
        --output tsv)
    
  4. 使用 az role assignment create 命令为默认组创建 Azure 角色分配

    根据具体要求,可以向默认组分配三种角色

    • Azure Kubernetes Service RBAC Reader:在 AKS 群集范围内分配,提供对群集中大多数资源的基本只读访问权限。
    • Reader:在资源组范围内分配,提供对资源组中资源的只读访问权限。
    • Azure Kubernetes Service Cluster User Role:在 AKS 群集范围内分配,提供获取 AKS 群集 kubeconfig 上下文的权限。
    # Assign the Azure Kubernetes Service RBAC Reader role to the default group
    az role assignment create \
        --role "Azure Kubernetes Service RBAC Reader" \
        --assignee $DEFAULT_ID \
        --scope $AKS_ID
    
    # Assign the Reader role to the default group
    az role assignment create \
        --role "Reader" \
        --assignee $DEFAULT_ID \
        --scope $RG_ID
    
    # Assign the Azure Kubernetes Service Cluster User Role to the default group
    az role assignment create \
        --role "Azure Kubernetes Service Cluster User Role" \
        --assignee $DEFAULT_ID \
        --scope $AKS_ID
    

创建管理员组

  1. 使用 az ad group create 命令创建管理员组

    ADMIN_ID=$(az ad group create \
        --display-name admin \
        --mail-nickname admin \
        --query id \
        --output tsv)
    
  2. 使用 az role assignment create 命令将 Azure Kubernetes Service RBAC Admin 角色分配给管理员组

    az role assignment create \
        --role "Azure Kubernetes Service RBAC Admin" \
        --assignee $ADMIN_ID \
        --scope $AKS_ID
    

注意

如果想要让管理员组中的用户更改节点池设置(例如手动缩放),则需要使用以下命令在群集节点池上创建 Contributor 角色分配

az role assignment create \
   --role "Contributor" \
   --assignee $ADMIN_ID \
   --scope $AKS_ID/nodepools/<node-pool-name>

请记住,这仅授予对 AKS 资源进行横向缩减或扩展的权限。 若要允许对虚拟机规模集资源进行横向缩减或扩展,则需要在虚拟机规模集级别创建分配。

创建审批者组

  • 使用 az ad group create 命令创建审批者组

    APPROVER_ID=$(az ad group create \
        --display-name approver \
        --mail-nickname approver \
        --query id \
        --output tsv)
    

在 Microsoft Entra ID 中创建演示用户

在本部分中,我们将在 Microsoft Entra ID 中创建两个用户:一个仅具有默认角色的普通用户,以及一个可以批准或拒绝来自普通用户的实时请求的特权用户

  1. 使用 az ad user create 命令创建普通用户

    DOMAIN=contoso.com
    PASSWORD=Password1
    
    NUSER_ID=$(az ad user create \
        --display-name n01 \
        --password ${PASSWORD} \
        --user-principal-name n01@${DOMAIN} \
        --query id \
        --output tsv)
    
  2. 使用 az ad group member add 命令将普通用户添加到默认组

    az ad group member add \
        --group $DEFAULT_ID \
        --member-id $NUSER_ID
    
  3. 使用 az ad user create 命令创建特权用户

    PUSER_ID=$(az ad user create \
        --display-name p01 \
        --password ${PASSWORD} \
        --user-principal-name p01@${DOMAIN} \
        --query id \
        --output tsv)
    
  4. 使用 az ad group member add 命令将特权用户添加到审批者组

    az ad group member add \
        --group $APPROVER_ID \
        --member-id $PUSER_ID
    

为管理员组启用 Privileged Identity Management (PIM)

  1. Azure 门户主页中,选择“Microsoft Entra ID”
  2. 在服务菜单中的“管理”下,选择“组”,然后选择“管理员”组
  3. 在服务菜单中的“活动”下,选择“Privileged Identity Management”,然后选择“为该组启用 PIM”

为管理员组设置审批者

  1. Azure 门户主页中,搜索并选择“Privileged Identity Management”

  2. 在服务菜单中的“管理”下,选择“组”,然后选择“管理员”组

  3. 在服务菜单中的“管理”下,选择“分配”>“添加分配”

  4. 在“添加分配”页的“成员身份”选项卡上,选择“成员”作为选定角色,选择“默认”作为选定成员,然后选择“下一步”

  5. 在“设置”选项卡上,选择“合格”作为分配类型,然后选择“分配”

  6. 在服务菜单中的“管理”下,选择“设置”>“成员”>“编辑”

  7. 在“编辑角色设置 - 成员”页中,选中“需要批准才能激活”复选框,并将审批者组添加为选定审批者

    注意

    如果未选中“需要批准才能激活”复选框,则默认组中的用户可以自行激活角色,无需审批即可获取对 AKS 群集的实时访问权限。 审批者组中的用户必须是该组的成员。 即使将用户设置为所有者,他们仍然无法审查实时请求,因为组所有者只拥有对组的管理权限,而没有角色分配的权限。 可以将用户设置为同一个组的成员和所有者,且不会发生冲突

  8. 进行其他必要的更改,然后选择“更新”

有关 PIM 配置的详细信息,请参阅为组配置 PIM

使用默认角色与群集资源交互

现在,我们可以尝试使用普通用户访问 AKS 群集,该用户是默认组的成员

  1. 使用 az login 命令以普通用户身份登录到 Azure 门户

    az login --username n01@$DOMAIN --password ${PASSWORD}
    
  2. 使用 az aks get-credentials 命令获取用户凭据以访问群集。

    az aks get-credentials --resource-group <resource-group-name> --name <cluster-name>
    
  3. 尝试使用 kubectl get 命令访问群集 Pod。

    kubectl get pods --namespace kube-system
    

    输出应类似于以下示例输出,其中显示了 kube-system 命名空间中的 Pod:

    NAME                                   READY   STATUS    RESTARTS   AGE
    azure-ip-masq-agent-2rdd9              1/1     Running   0          30h
    azure-policy-767c9d9d9d-886rf          1/1     Running   0          31h
    cloud-node-manager-92t6h               1/1     Running   0          30h
    coredns-789789675-b2dhg                1/1     Running   0          31h
    coredns-autoscaler-77bbc46446-pgt92    1/1     Running   0          31h
    csi-azuredisk-node-lnzrf               3/3     Running   0          30h
    csi-azurefile-node-lhbxr               3/3     Running   0          31h
    konnectivity-agent-7645d94b-9wqct      1/1     Running   0          30h
    kube-proxy-lkx4w                       1/1     Running   0          31h
    metrics-server-5955767688-lpbjb        2/2     Running   0          30h
    
  4. 尝试使用 kubectl get 命令访问群集机密。

    kubectl get secrets --namespace kube-system
    

    输出应类似于以下示例输出,其中显示了一条错误消息,因为用户无权访问机密:

    Error from server (Forbidden): secrets is forbidden: User "[email protected]" cannot list resource "secrets" in API group "" in the namespace "kube-system": User does not have access to the resource in Azure. Update role assignment to allow access.
    

    Azure Kubernetes Service RBAC Reader 角色无权访问机密,因此出现此错误是预料之中的。

请求对 AKS 群集的实时访问权限

这一次,我们可以按照在 Privileged Identity Management 中激活组成员身份或所有权中的步骤,以临时 Azure Kubernetes Service RBAC Admin 身份请求实时访问权限。 若要了解作为审批者如何批准或拒绝请求,请参阅审批组成员和所有者的激活请求

使用管理员角色与群集资源交互

在临时添加 Azure Kubernetes Service RBAC Admin 角色后,可以访问需要管理员权限的群集资源。

  1. 使用以下 kubelogin 命令删除现有的存储令牌:

    kubelogin remove-tokens
    

    注意

    如果由于权限不足而出现错误,请使用 az login 命令登录以刷新权限。

  2. 尝试使用 kubectl get secrets 命令再次访问群集机密。

    kubectl get secrets --namespace kube-system
    

    输出应类似于以下示例输出,其中显示了 kube-system 命名空间中的机密:

    NAME                     TYPE                            DATA   AGE
    bootstrap-token-sw3rck   bootstrap.kubernetes.io/token   4      35h
    konnectivity-certs       Opaque                          3      35h
    

    用户现在就可以访问机密了,因为他们具有 Azure Kubernetes Service RBAC Admin 角色。

令牌生存期注意事项

由于令牌生存期设计,如果将角色授予使用 CLI 工具的用户(如 kubectlkubelogin),则激活持续时间在技术上不能少于 60 分钟。 即使将持续时间设置为少于 60 分钟,实际有效持续时间也仍会保持在 60-75 分钟之间。

kubelogin 尝试从 Microsoft 标识平台获取令牌时,会返回 access_tokenrefresh_token 以供进一步使用。 access_token 用于向 API 发出请求,而 refresh_token 用于在当前 access_token 过期时获取新的。 access_token 生成后无法撤销,但 refresh_token 可以撤销。 如果 refresh_token 被撤销,用户必须重新进行身份验证才能获取新的 refresh_token。 若要手动撤销 refresh_token,可以使用 Revoke-AzureADUserAllRefreshToken

后续步骤

有关详细信息,请参阅以下文章: