Azure资源的托管标识如何与Azure虚拟机配合使用

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

在本文中,你将了解托管标识如何与 Azure 虚拟机 (VM) 协同工作。

工作原理

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

代码可以利用托管身份请求支持Microsoft Entra身份验证的服务的访问令牌。 Azure负责轮换服务实例所使用的凭据。

下图显示了托管服务身份如何与 Azure 虚拟机(VM)协同工作:

图表显示托管服务标识如何与Azure虚拟机相关联、获取访问令牌并调用受保护的Microsoft Entra资源。

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

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

系统分配的托管标识

  1. Azure Resource Manager收到在 VM 上启用系统分配的托管标识的请求。

  2. Azure资源管理器在Microsoft Entra ID中为VM的标识创建了服务主体(service principal)。 服务主体是在订阅的受信任Microsoft Entra租户中创建的。

  3. Azure Resource Manager使用Azure实例元数据服务标识终结点(适用于 WindowsLinux)更新 VM 标识,并提供服务主体客户端 ID 和证书。

  4. VM 具有标识后,使用服务主体信息向 VM 授予对Azure资源的访问权限。 若要调用Azure Resource Manager,请使用Azure Role-Based Access Control(Azure RBAC)将适当的角色分配给 VM 服务主体。 若要调用Key Vault,请授予代码对Key Vault中特定机密或密钥的访问权限。

  5. VM 上运行的代码可以从 Azure 实例元数据服务接口请求令牌,该接口仅限于在 VM 内部访问:http://169.254.169.254/metadata/identity/oauth2/token

    • resource 参数指定了要向其发送令牌的服务。 若要对Azure Resource Manager进行身份验证,请使用 resource=https://management.chinacloudapi.cn/
    • API 版本参数指定 IMDS 版本。 使用 API 版本 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 Resource Manager收到创建用户分配的托管标识的请求。

  2. Azure Resource Manager在Microsoft Entra ID中为用户分配的托管身份创建服务主体。 服务主体是在订阅的受信任 Microsoft Entra 租户中创建的。

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

  4. 创建用户分配的托管身份后,使用服务主体信息授予对Azure资源的访问权限。 若要调用Azure Resource Manager,请使用 Azure RBAC 将适当的角色分配给用户分配标识的服务主体。 若要调用Key Vault,请授予代码对Key Vault中特定机密或密钥的访问权限。

    备注

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

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

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

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

      截图显示如何复制托管身份客户端 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=00001111-aaaa-2222-bbbb-3333cccc4444' -H Metadata:true
      
  6. 调用 Microsoft Entra ID,通过使用在步骤 3 中配置的客户端 ID 和证书,来请求访问令牌(如步骤 5 中指定的)。 Microsoft Entra ID返回 JSON Web 令牌(JWT)访问令牌。

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

后续步骤

通过以下快速入门指南开始使用 Azure 资源的托管身份功能: