通过


如何在 Azure 虚拟机上使用 Azure 资源的托管身份进行登录

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

注释

建议使用 Azure Az PowerShell 模块与Azure交互。 请参阅 Install Azure PowerShell 入门。 若要了解如何迁移到 Az PowerShell 模块,请参阅 Migrate Azure PowerShell从 AzureRM 迁移到 Az

先决条件

  • 如果您不熟悉 Azure 资源的托管身份功能,请参阅此 概述。 如果没有Azure帐户,请在继续之前注册一个免费帐户

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

重要

  • 本文中的所有示例脚本都假定命令行客户端在启用了Azure资源的托管标识的 VM 上运行。 使用Azure门户中的 VM“连接”功能远程连接到 VM。 有关在 VM 上为Azure资源启用托管标识的详细信息,请参阅使用 Azure 门户或其中一篇变体文章(使用 PowerShell、CLI、模板或Azure SDK)为 VM 上的Azure资源配置托管标识。
  • 若要防止资源访问期间出现错误,必须在适当的范围(VM 或更高级别)至少授予 VM 的托管标识“读取者”访问权限,以允许在 VM 上执行 Azure 资源管理器 操作。 有关详细信息,请参阅 通过Azure门户为Azure资源分配托管标识

概述

Azure 资源的托管标识提供服务主体,在为 VM 启用 Azure 资源的托管标识时,会创建该对象。 可以将服务主体授予对 Azure 资源的访问权限,并使用它作为脚本或命令行客户端的身份来进行登录和资源访问。 传统上,为了根据自己的标识访问受保护的资源,脚本客户端需要:

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

在 Azure 资源上使用托管标识后,脚本客户端不再需要处理这些繁琐的操作,因为它可以使用 Azure 资源服务主体的托管标识来登录。

Azure CLI

以下脚本演示如何:

  1. 请在用于 Azure 资源的虚拟机托管标识的服务主体下登录到 Microsoft Entra ID

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

    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. 在虚拟机的托管标识(用于 Azure 资源的服务主体)下登录 Microsoft Entra ID

  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

请参阅支持 Microsoft Entra 身份验证的 Azure 服务,了解支持 Microsoft Entra ID 的资源及其已使用托管标识测试的 Azure 资源列表,其中包含各自的资源 ID。

有关错误处理的指导

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

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

如果收到其中一个错误,请返回到 Azure 门户中的 Azure 虚拟机,然后转到 标识页,并确保系统分配的设置为“是”。

后续步骤