如何在 Azure VM 上使用 Azure 资源的托管标识进行登录

Azure 资源的托管标识是 Azure Active Directory 的一项功能。 支持 Azure 资源的托管标识的每个 Azure 服务都受其自己的时间线限制。 在开始之前,请务必查看资源的托管标识的可用性状态以及已知问题

本文提供有关使用 Azure 资源服务主体的托管标识进行登录的 PowerShell 和 CLI 脚本示例,以及有关错误处理等重要主题的指导。

注意

本文使用 Azure Az PowerShell 模块,这是与 Azure 交互时推荐使用的 PowerShell 模块。 若要开始使用 Az PowerShell 模块,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

先决条件

  • 如果不熟悉 Azure 资源功能的托管标识,请参阅此概述。 如果没有 Azure 帐户,请先注册试用版,然后再继续。

如果打算使用本文中的 Azure PowerShell 或 Azure CLI 示例,请务必安装最新版本的 Azure PowerShellAzure CLI

重要

  • 本文中的所有示例脚本均假设命令行客户端在已启用 Azure 资源的托管标识的 VM 上运行。 在 Azure 门户中使用 VM 的“连接”功能远程连接到 VM。 有关在 VM 上启用 Azure 资源的托管标识的详细信息,请参阅使用 Azure 门户在 VM 上配置 Azure 资源的托管标识,或有关在不同工具(使用 PowerShell、CLI、模板或 Azure SDK)中执行此操作的文章之一。
  • 为了防止访问资源期间出错,必须在相应的范围(VM 或更高)至少为 VM 的托管标识授予“读取者”的访问权限,从而能够在 VM 上执行 Azure 资源管理器操作。 有关详细信息,请参阅使用 Azure 门户授予 Azure 资源的托管标识对资源的访问权限

概述

Azure 资源的托管标识提供一个服务主体对象,此对象是在 VM 上启用 Azure 资源的托管标识时创建的。 可向此服务主体授予对 Azure 资源的访问权限;脚本/命令行客户端可将此服务主体用作标识进行登录和资源访问。 传统上,若要使用自身的标识访问受保护资源,脚本客户端需要:

  • 注册到 Azure AD,并同意将 Azure AD 用作机密/Web 客户端应用程序
  • 使用应用的凭据(可能会嵌入在脚本中)以自身的服务主体登录

凭借 Azure 资源的托管标识,脚本客户端无需再执行任何操作,因为它可以通过 Azure 资源服务主体的托管标识进行登录。

Azure CLI

以下脚本演示如何:

  1. 通过 VM 的 Azure 资源服务主体的托管标识登录 Azure AD

  2. 调用 Azure 资源管理器并获取 VM 的服务主体 ID。 CLI 负责自动管理令牌的获取和使用。 请务必将 <VM-NAME> 替换为自己的虚拟机名称。

    az login --identity
    
    $spID=$(az resource list -n <VM-NAME> --query [*].identity.principalId --out tsv)
    echo The managed identity for Azure resources service principal ID is $spID
    

Azure PowerShell

以下脚本演示如何:

  1. 通过 VM 的 Azure 资源服务主体的托管标识登录 Azure AD

  2. 调用 Azure 资源管理器 cmdlet 获取有关 VM 的信息。 PowerShell 负责自动管理令牌的使用。

    Add-AzAccount -identity
    
    # Call Azure Resource Manager to get the service principal ID for the VM's managed identity for Azure resources. 
    $vmInfoPs = Get-AzVM -ResourceGroupName <RESOURCE-GROUP> -Name <VM-NAME>
    $spID = $vmInfoPs.Identity.PrincipalId
    echo "The managed identity for Azure resources service principal ID is $spID"
    

Azure 服务的资源 ID

有关支持 Azure AD 且已使用 Azure 资源的托管标识进行测试的资源列表及其相应资源 ID,请参阅支持 Azure AD 身份验证的 Azure 服务

有关错误处理的指导

如下所示的响应可能表示未正确配置 VM 的 Azure 资源的托管标识:

  • PowerShell:Invoke-WebRequest:无法连接到远程服务器
  • CLI:MSI:无法从 http://localhost:50342/oauth2/token 检索令牌,出现错误 HTTPConnectionPool (主机='localhost',端口=50342)

如果收到以下错误之一,请在 Azure 门户中返回到 Azure VM,转至“标识”页并确保将“系统分配”设为“是” 。

后续步骤