如何将 Azure 资源托管标识用于 Azure 虚拟机

Azure 资源的托管标识在 Microsoft Entra ID 中为 Azure 服务提供了一个自动托管标识。 可以使用此标识向支持 Microsoft Entra 身份验证的任何服务进行身份验证,这样就无需在代码中插入凭据了。

本文介绍如何将托管标识用于 Azure 虚拟机 (VM)。

工作原理

在内部,托管标识是特殊类型的服务主体,它们只能与 Azure 资源配合使用。 删除托管标识时,相应的服务主体也会自动删除。 此外,在创建用户分配的标识或系统分配的标识时,托管标识资源提供程序 (MSRP) 会在内部向该标识颁发证书。

代码可以使用托管标识来请求支持 Microsoft Entra 身份验证的服务的访问令牌。 Azure 负责滚动更新服务实例使用的凭据。

下图演示了托管服务标识如何与 Azure 虚拟机 (VM) 协同工作:

Diagram that shows how managed service identities are associated with Azure virtual machines, get an access token, and invoked a protected Microsoft Entra resource.

下表显示了系统分配的和用户分配的托管标识的区别:

属性 系统分配的托管标识 用户分配的托管标识
创建 作为 Azure 资源(例如 Azure 虚拟机或 Azure 应用服务)的一部分创建。 作为独立 Azure 资源创建。
生命周期 与用于创建托管标识的 Azure 资源共享生命周期。
删除父资源时,也会删除托管标识。
独立生命周期。
必须显式删除。
在 Azure 资源之间共享 无法共享。
只能与单个 Azure 资源相关联。
可以共享。
用户分配的同一个托管标识可以关联到多个 Azure 资源。
常见用例 包含在单个 Azure 资源中的工作负载。
需要独立标识的工作负荷。
例如,在单个虚拟机上运行的应用程序
在多个资源上运行的并可以共享单个标识的工作负荷。
需要在预配流程中预先对安全资源授权的工作负荷。
其资源经常回收,但权限应保持一致的工作负荷。
例如,其中的多个虚拟机需要访问同一资源的工作负荷

系统分配的托管标识

  1. Azure 资源管理器收到请求,要求在 VM 上启用系统分配托管标识。

  2. Azure 资源管理器在 Microsoft Entra ID 中创建与 VM 标识相对应的服务主体。 服务主体在此订阅信任的 Microsoft Entra 租户中创建。

  3. Azure 资源管理器使用 Azure 实例元数据服务标识终结点(适用于 WindowsLinux)来更新 VM 标识,向该终结点提供服务主体客户端 ID 和证书。

  4. VM 有了标识以后,请根据服务主体信息向 VM 授予对 Azure 资源的访问权限。 要调用 Azure 资源管理器,请使用 Azure 基于角色的访问控制 (Azure RBAC) 向 VM 服务主体分配相应的角色。 若要调用 Key Vault,请授予代码对 Key Vault 中特定机密或密钥的访问权限。

  5. 在 VM 上运行的代码可以从只能从 VM 中访问的 Azure 实例元数据服务终结点请求令牌:http://169.254.169.254/metadata/identity/oauth2/token

    • resource 参数指定了要向其发送令牌的服务。 若要向 Azure 资源管理器进行身份验证,请使用 resource=https://management.chinacloudapi.cn/
    • API 版本参数指定 IMDS 版本,请使用 api-version=2018-02-01 或更高版本。

    以下示例演示如何使用 CURL 向本地托管标识终结点发出请求,以获取 Azure 实例元数据服务的访问令牌。

    curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F' -H Metadata:true
    
  6. 调用了 Microsoft Entra ID,以便使用在步骤 3 中配置的客户端 ID 和证书请求访问令牌(在步骤 5 中指定)。 Microsoft Entra ID 返回 JSON Web 令牌 (JWT) 访问令牌。

  7. 代码在调用支持 Microsoft Entra 身份验证的服务时发送访问令牌。

用户分配的托管标识

  1. Azure 资源管理器收到请求,要求创建用户分配托管标识。

  2. Azure 资源管理器在 Microsoft Entra ID 中创建与用户分配的托管标识相对应的服务主体。 服务主体在此订阅信任的 Microsoft Entra 租户中创建。

  3. Azure 资源管理器收到在 VM 上配置用户分配的托管标识的请求,并使用用户分配的托管标识服务主体客户端 ID 和证书更新 Azure 实例元数据服务标识终结点。

  4. 创建用户分配托管标识以后,请根据服务主体信息向标识授予对 Azure 资源的访问权限。 要调用 Azure 资源管理器,请使用 Azure RBAC 向用户分配的标识的服务主体分配相应角色。 若要调用 Key Vault,请授予代码对 Key Vault 中特定机密或密钥的访问权限。

    备注

    也可在步骤 3 之前执行此步骤。

  5. 在 VM 上运行的代码可以从只能从 VM 中访问的 Azure 实例元数据服务标识终结点请求令牌:http://169.254.169.254/metadata/identity/oauth2/token

    • resource 参数指定了要向其发送令牌的服务。 若要向 Azure 资源管理器进行身份验证,请使用 resource=https://management.chinacloudapi.cn/

    • client_id 参数指定请求令牌的标识。 当单台 VM 上有多个用户分配的标识时,此值是消除歧义所必需的。 可在托管标识的“概述”中找到客户端 ID:

      Screenshot that shows how to copy the managed identity client ID.

    • API 版本参数指定 Azure 实例元数据服务版本。 请使用 api-version=2018-02-01 或指定更高的版本。

      以下示例演示如何使用 CURL 向本地托管标识终结点发出请求,以获取 Azure 实例元数据服务的访问令牌。

      curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fstorage.azure.com%2F&client_id=12345678-0000-0000-0000-000000000000' -H Metadata:true
      
  6. 调用了 Microsoft Entra ID,以便使用在步骤 3 中配置的客户端 ID 和证书请求访问令牌(在步骤 5 中指定)。 Microsoft Entra ID 返回 JSON Web 令牌 (JWT) 访问令牌。

  7. 代码在调用支持 Microsoft Entra 身份验证的服务时发送访问令牌。

后续步骤

请参阅以下快速入门,开始使用 Azure 资源托管标识功能: