Compartilhar via

Azure Container Apps中的托管标识

通过Microsoft Entra ID的托管标识,您的容器应用可以访问由Microsoft Entra 保护的其他资源。 有关 Microsoft Entra ID 中的托管标识的详细信息,请参阅 Azure 资源的托管标识

可为容器应用授予两种类型的标识:

  • 当容器应用被删除时,系统分配的标识会与容器应用一起被删除。 一个应用只能具有一个系统分配的标识。
  • 用户分配的标识是一个独立的 Azure 资源,可以分配给您的容器应用程序和其他资源。 一个容器应用可以有多个用户分配的标识。 用户分配的标识存在,直到删除它们。

为什么使用托管标识?

可以使用正在运行的容器应用中的托管标识向支持 Microsoft Entra 身份验证的任何 service 进行身份验证

使用托管标识:

  • 应用通过托管身份识别连接到资源。 无需在容器应用中管理凭据。
  • 可以使用基于角色的访问控制向托管标识授予特定权限。
  • 可自动创建和管理系统分配的标识。 删除您的容器应用程序时,它们也会被删除。
  • 可以添加和删除用户分配的标识,并将其分配到多个资源。 这些标识与容器应用的生命周期不相关。
  • 可以使用托管标识进行身份验证,而无需用户名和密码来从专用 Azure Container Registry 拉取容器以供容器应用使用。
  • 可以使用托管标识通过 Dapr 组件为已启用 Dapr 的应用程序创建连接

常见用例

系统分配的标识最适合用于具有以下特征的工作负载:

  • 包含在单个资源中
  • 需要独立的身份

用户分配的标识非常适合用于具有以下特征的工作负载:

  • 在多个资源上运行并可共享单个标识
  • 需要预先获取对安全资源的授权

限制

init 容器 在仅消费环境和专用工作负载配置文件环境中无法访问托管标识

配置托管标识

可通过以下方式配置托管身份:

  • Azure 门户
  • Azure CLI (命令行界面)
  • 您的 Azure Resource Manager(ARM)模板

在正在运行的容器应用中添加、删除或修改托管标识时,该应用不会自动重启,且不会创建新的修订版。

注意事项

将托管标识添加到在 2022 年 4 月 11 日之前部署的容器应用时,必须创建新的修订版。

添加系统分配的标识

  1. 转到 Azure 门户中的您的容器应用。

  2. 设置组中,选择标识

  3. 在“System assigned”选项卡中,将“状态”切换为“开启”。

  4. 选择“保存” 。

系统分配身份的屏幕截图。

添加用户分配的标识

为容器应用配置用户分配的标识需要先创建该标识,然后将其资源标识符添加到该容器应用的配置。 可以通过Azure portal或Azure CLI创建用户分配的标识。 有关创建和管理用户分配的标识的信息,请参阅 Manage 用户分配的托管标识

首先,需要创建用户分配的标识资源。

  1. 根据 Manage user-assigned managed identities 中的步骤创建一个用户分配的托管标识资源。

  2. 转到你的Azure门户中的容器应用。

  3. 设置组中,选择标识

  4. 在“用户分配”选项卡中,选择“添加”。

  5. 搜索并选择你之前创建的身份。

  6. 选择 添加

用户分配标识的截屏。

配置目标资源

对于某些资源,您需要为应用程序的托管身份配置角色分配,以来授予访问权限。 否则,尽管您对该标识使用了有效令牌,但从您的应用程序到服务(如 Azure Key Vault 和 Azure SQL Database)的调用仍会被拒绝。 若要详细了解Azure基于角色的access control(Azure RBAC),请参阅 什么是 RBAC?。 若要详细了解哪些资源支持 Microsoft Entra 令牌,请参阅支持 Microsoft Entra 身份验证的 Azure 服务

重要

用于管理的标识的后端服务会为每个资源 URI 维护缓存大约 24 小时。 如果更新特定目标资源的访问策略并立即检索该资源的令牌,则可能会继续获取权限已过期的缓存令牌,直到该令牌过期。 不支持强制刷新令牌。

在应用代码中连接到Azure服务

使用托管标识,应用可以获取令牌,从而访问由 Microsoft Entra ID 认证的 Azure 资源,例如 Azure SQL 数据库、Azure 密钥保管库和 Azure 存储。 这些令牌代表访问资源的应用程序,而不是应用程序的任何特定用户。

容器应用提供内部可访问的 REST 终结点用于检索令牌。 REST 终结点可从具有标准 HTTP GET请求的应用内使用,可以使用首选语言的通用 HTTP 客户端发送该请求。 对于 .NET、JavaScript、Java 和 Python,Azure标识客户端库提供对此 REST 终结点的抽象。 可以通过向特定于服务的客户端添加凭据对象来连接到其他Azure服务。

注意事项

使用Azure标识客户端库时,需要显式指定用户分配的托管标识客户端 ID。

注意事项

在使用 Entity Framework Core 连接到 Azure SQL 数据源时,请考虑使用 Microsoft.Data.SqlClient,此客户端提供专用于托管标识连接的特殊连接字符串。

对于 .NET 应用程序,使用托管标识的最简单方法是通过 Azure 标识客户端库 for .NET。 有关详细信息,请参阅以下资源:

链接的示例使用 DefaultAzureCredential。 此对象在大多数情况下有效,因为同一模式适用于Azure(使用托管标识)和本地计算机上(没有托管标识)。

将托管标识用于缩放规则

可以在规模规则中使用托管标识来对支持托管标识的 Azure 服务进行身份验证。 要在缩放规则中使用托管标识,请在缩放规则中使用 identity 属性,而不是 auth 属性。 identity 属性的可接受值要么是用户分配标识的 Azure 资源 ID,要么是system使用系统分配的标识。

以下 ARM 模板示例演示如何将托管标识与Azure Queue Storage缩放规则配合使用:

队列存储帐户使用 accountName 属性来标识存储帐户,而 identity 属性指定要使用的托管标识。 无需使用 auth 属性。

"scale": {
    "minReplicas": 1,
    "maxReplicas": 10,
    "rules": [{
        "name": "myQueueRule",
        "azureQueue": {
            "accountName": "mystorageaccount",
            "queueName": "myqueue",
            "queueLength": 2,
            "identity": "<IDENTITY1_RESOURCE_ID>"
        }
    }]
}

若要详细了解如何将托管标识与缩放规则配合使用,请参阅在 Azure Container Apps

控制托管标识可用性

容器应用允许指定 Init 容器和主容器。 默认情况下,消耗型工作负荷配置文件环境中的主容器和初始化容器都可以使用托管标识来访问其他 Azure 服务。 在仅限消费的环境和专用工作负载配置文件环境中,只有主容器可以使用托管身份验证。 托管标识的访问令牌可用于在容器应用中配置的每个托管标识。 但是,在某些情况下,只有 init 容器或主容器需要用于托管标识的访问令牌。 在某些情况下,您可能会仅使用托管标识来访问 Azure 容器注册表以拉取容器镜像,而您的应用程序本身不需要访问 Azure 容器注册表。

从 API 版本 2024-02-02-preview 开始,您可以在初始化阶段和主阶段控制哪些托管标识可供容器应用使用,以遵循最小特权安全原则。 可以使用以下选项:

  • Init:仅适用于 Init 容器。 如果要执行一些需要托管标识的初始化工作,但不再需要主容器中的托管标识,请使用此选项。 此选项目前仅在工作负载概要文件使用环境中受支持
  • Main:仅适用于主容器。 如果 Init 容器不需要托管标识,请使用此选项。
  • All:适用于所有容器。 此值为默认设置。
  • None:不适用于任何容器。 如果你的托管标识仅用于 ACR 映像拉取、缩放规则或Key Vault机密,并且无需对容器中运行的代码可用,请使用此功能。

以下 ARM 模板示例演示如何在工作负载配置文件消耗环境中配置容器应用,该环境具有以下特性:

  • 将容器应用的系统分配标识仅限于主容器。
  • 将用户分配的特定标识仅限于 Init 容器。
  • 使用特定的用户分配标识进行 Azure Container Registry 中的镜像拉取,且不允许容器中的代码使用该托管身份访问注册表。 在此示例中,容器本身不需要访问注册表。

此方法限制了恶意行为者在获得对容器的未经授权访问时可以访问的资源。

{
    "location": "chinanorth3",
    "identity":{
    "type": "SystemAssigned, UserAssigned",
        "userAssignedIdentities": {
            "<IDENTITY1_RESOURCE_ID>":{},
            "<ACR_IMAGEPULL_IDENTITY_RESOURCE_ID>":{}
         }
     },
    "properties": {
        "workloadProfileName":"Consumption",
        "environmentId": "<CONTAINER_APPS_ENVIRONMENT_ID>",
        "configuration": {
            "registries": [
            {
                "server": "myregistry.azurecr.cn",
                "identity": "ACR_IMAGEPULL_IDENTITY_RESOURCE_ID"
            }],
            "identitySettings":[
            {
                "identity": "ACR_IMAGEPULL_IDENTITY_RESOURCE_ID",
                "lifecycle": "None"
            },
            {
                "identity": "<IDENTITY1_RESOURCE_ID>",
                "lifecycle": "Init"
            },
            {
                "identity": "system",
                "lifecycle": "Main"
            }]
        },
        "template": {
            "containers":[
                {
                    "image":"myregistry.azurecr.cn/main:1.0",
                    "name":"app-main"
                }
            ],
            "initContainers":[
                {
                    "image":"myregistry.azurecr.cn/init:1.0",
                    "name":"app-init",
                }
            ]
        }
    }
}

查看托管标识

可以使用以下Azure CLI命令显示系统分配的托管标识和用户分配的托管标识。 输出会显示分配给容器应用的所有托管标识的类型、租户 ID 和主体 ID。

az containerapp identity show --name <APP_NAME> --resource-group <GROUP_NAME>

删除托管标识

删除系统分配的标识时,它将从 Microsoft Entra ID 中被删除。 删除容器应用资源本身时,系统分配的标识也会自动从Microsoft Entra ID中删除。 从容器应用中删除用户分配的托管标识不会将其从Microsoft Entra ID中删除。

  1. 在应用页面的左侧导航中,向下滚动到“设置”组。

  2. 选择“Identity”。 然后,根据标识类型执行以下步骤:

    • 系统分配的身份:在“系统分配”选项卡中,将“状态”设置为“关闭”。 选择“保存” 。
    • 用户分配的身份:选择“用户分配”选项卡,选中该身份的复选框,然后选择“删除”。 请选择“是”以确认。