Compartilhar via

使用 Microsoft Entra 工作负荷标识身份验证来进行自托管网关认证

适用于:开发人员 | 高级

Azure API 管理 自承载网关 需要与其关联的基于云的 API 管理实例建立连接,以便报告状态、检查和应用配置更新以及发送指标和事件。

本文介绍如何使用 Microsoft Entra 工作负荷标识使自承载网关能够对其关联的云实例进行身份验证。 通过使用工作负荷标识身份验证,无需管理机密或证书,因为身份验证是通过 Kubernetes 群集与 Microsoft Entra ID 之间的联合标识凭据进行处理的。 有关其他身份验证选项,请参阅 自承载网关身份验证选项

场景概述

自承载网关配置 API 可以检查 Azure 基于角色的访问控制(RBAC),以确定谁有权读取网关配置。 通过使用工作负荷标识,可以创建一个通过联合标识凭据与 Kubernetes 服务帐户关联的Microsoft Entra 应用。 然后,自承载网关可以使用此工作负荷标识向 API 管理实例进行身份验证,而无需机密。

工作负荷标识使用 OpenID Connect (OIDC) 使 Kubernetes 应用程序能够安全地访问 Azure 资源。

若要启用工作负荷标识身份验证,请完成以下步骤:

  1. 创建两个自定义角色以:
    • 让配置 API 访问客户的 RBAC 信息
    • 授予读取自托管网关配置的权限
  2. 授予 RBAC 对 API 管理实例的托管标识的访问权限
  3. 创建Microsoft Entra 应用并配置联合标识凭据
  4. 授予 Microsoft Entra 应用读取网关配置的权限
  5. 部署网关并进行工作负荷标识配置

先决条件

  • 开发人员或高级服务层级中的 API 管理实例。 如果需要,请完成以下快速入门: 创建 Azure API 管理实例
  • 启用了"工作负载标识"和"OIDC 发行者"的 Azure Kubernetes 服务 (AKS) 集群。
  • 实例上的 网关资源
  • 在实例上启用 系统分配的托管标识
  • 自行托管网关容器镜像版本 2.11.0 或更高版本。

备注

  • 本文重点介绍如何部署到 Azure Kubernetes 服务(AKS)。
  • 该模式适用于具有所需 OIDC 支持的其他 Kubernetes 分发。 有关详细信息,请参阅 Azure 工作负荷标识存储库

创建自定义角色

创建后续步骤中分配的以下两个 自定义角色 。 可以使用以下 JSON 模板中列出的权限通过 Azure 门户Azure CLIAzure PowerShell 或其他 Azure 工具创建自定义角色。

配置自定义角色时,请更新 AssignableScopes 属性,使用您的目录中适当的作用域值,例如部署 API 管理实例的订阅。

API 管理配置 API 访问验证程序服务角色

{
  "Description": "Can access RBAC permissions on the API Management resource to authorize requests in Configuration API.",
  "IsCustom": true,
  "Name": "API Management Configuration API Access Validator Service Role",
  "Permissions": [
    {
      "Actions": [
        "Microsoft.Authorization/*/read"
      ],
      "NotActions": [],
      "DataActions": [],
      "NotDataActions": []
    }
  ],
  "NotDataActions": [],
  "AssignableScopes": [
    "/subscriptions/{subscriptionID}"
  ]
}

API 管理网关配置读取者角色

{
  "Description": "Can read self-hosted gateway configuration from Configuration API",
  "IsCustom": true,
  "Name": "API Management Gateway Configuration Reader Role",
  "Permissions": [
    {
      "Actions": [],
      "NotActions": [],
      "DataActions": [
        "Microsoft.ApiManagement/service/gateways/getConfiguration/action"
      ],
      "NotDataActions": []
    }
  ],
  "NotDataActions": [],
  "AssignableScopes": [
    "/subscriptions/{subscriptionID}"
  ]
}

增加角色分配

分配 API 管理配置 API 访问验证器服务角色

将 API Management 配置 API 访问验证器服务角色分配给 API Management 实例的托管标识。 有关分配角色的详细步骤,请参阅通过门户分配 Azure 角色

  • 范围:在其中部署 API 管理实例的资源组或订阅
  • 角色:API 管理配置 API 访问验证程序服务角色
  • 分配对:API 管理实例的托管标识的访问权限

分配 API 管理网关配置查看者角色

步骤 1:注册 Microsoft Entra 应用并配置工作负荷标识

创建新的Microsoft Entra 应用。 有关步骤,请参阅 创建可访问资源的 Microsoft Entra 应用程序和服务主体。 Microsoft Entra 应用由自托管网关用于对 API 管理实例进行身份验证。

重要

工作负荷标识不需要创建客户端密码。 身份验证通过联合标识凭据进行处理。

请记下应用程序(客户端)ID,以便在下一部分部署自托管网关时使用。

接下来,配置联合标识凭据,以在 Microsoft Entra 应用与 Kubernetes 服务帐户之间建立信任:

  1. 在 Azure 门户中,导航到 Microsoft Entra 应用注册。
  2. 选择 “证书和机密>联合凭据>+ 添加凭据”。
  3. 选择 Kubernetes 访问 Azure 资源 场景。
  4. 配置联合凭据:
    • 集群颁发者 URL:从你的 AKS 集群中获取的 OIDC 颁发者 URL(请使用 az aks show --resource-group <resource-group> --name <cluster-name> --query "oidcIssuerProfile.issuerUrl" 获取)
    • 命名空间:部署网关的 Kubernetes 命名空间(例如 apim-gateway-wi
    • 服务帐户:Kubernetes 服务帐户的名称(例如 apim-gateway-workload-identity
    • 名称:凭据的描述性名称(例如 apim-gateway-federated-credential
  5. 选择 “添加” 以创建联合凭据。

有关详细信息,请参阅 在应用上配置联合标识凭据

步骤 2:分配 API 管理网关配置读取服务角色

将 API 管理网关配置读取者服务角色分配给应用。

  • 范围:API 管理实例(或部署应用的资源组或订阅)
  • 角色:API 管理网关配置读取者角色
  • 将访问权限分配给:Microsoft Entra 应用

部署自托管网关

使用工作负荷标识将自承载网关部署到 Kubernetes。

可以使用 Helm 图表部署具有 Microsoft Entra 身份验证的自托管网关。

helm install 命令中的以下值替换为实际值:

  • <gateway-name>:Azure API 管理实例名称
  • <gateway-url>:网关的 URL,格式 https://<gateway-name>.configuration.azure-api.cn
  • <entra-id-app-id>:已注册Microsoft Entra应用的应用程序(客户端)ID
helm install --name azure-api-management-gateway azure-apim-gateway/azure-api-management-gateway \
             --set gateway.name=='<gateway-name>' \
             --set gateway.configuration.uri='<gateway-url>' \
             --set gateway.auth.type='WorkloadIdentity' \
             --set gateway.auth.azureAd.app.id='<entra-id-app-id>'

有关先决条件和详细信息,请参阅 使用 Helm 部署 API 管理自承载网关

确认网关正在运行

  1. 运行以下命令来检查网关 Pod 是否正在运行。 Pod 名称将有所不同。

    kubectl get pods
    NAME                                           READY     STATUS    RESTARTS   AGE
    azure-api-management-gateway-59f5fb94c-s9stz   1/1       Running   0          1m
    
  2. 运行以下命令来检查网关服务是否正在运行。 你的服务名称和 IP 地址与此不同。

    kubectl get services
    NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)               AGE
    azure-api-management-gateway   ClusterIP   10.0.229.55     <none>        8080/TCP,8081/TCP     1m
    
  3. 返回到Azure门户,确认部署的网关节点报告正常状态。

小窍门

使用 kubectl logs <gateway-pod-name> 命令查看自承载网关日志的快照。