Compartilhar via

在启用了Azure Arc的服务器上使用托管标识访问Azure资源

直接在启用了Azure Arc的服务器上运行的应用程序或进程可以使用托管标识访问支持基于Microsoft Entra ID身份验证的其他Azure资源。 应用程序可以获取表示其标识的 access 令牌,该标识是为启用Azure Arc的服务器分配的系统分配的,并将其用作持有者令牌来向另一个服务进行身份验证。

有关托管标识的详细说明以及系统分配标识与用户分配标识之间的区别,请参阅 托管标识概述

本文介绍如何使用系统分配的托管标识访问 Azure Key Vault。 Azure Key Vault允许客户端应用程序使用机密访问不受Microsoft Entra ID保护的资源。 例如,Azure Key Vault可以存储 IIS Web 服务器使用的 TLS/SSL 证书,并将证书安全地部署到Azure之外的Windows或 Linux 服务器。

安全概述

将服务器注册到 Azure Arc 启用的服务器并将其配置为使用托管标识时,会发生多个操作(类似于 Azure VM 的情况):

  • Azure Resource Manager收到在启用Azure Arc的服务器上启用系统分配的托管标识的请求。

  • Azure Resource Manager在Microsoft Entra ID中为服务器的身份创建服务主体。 服务主体是在订阅所信任的 Microsoft Entra 租户中创建的。

  • Azure Resource Manager通过使用服务主体客户端 ID 和证书更新 Windows 或 Linux 的 Azure 实例元数据服务(IMDS)标识终结点来配置服务器上的标识。 该终结点是只能通过使用已知不可路由 IP 地址从服务器内部访问的 REST 终结点。 此服务提供有关已启用Azure Arc服务器的元数据信息的子集,以帮助管理和配置它。

已启用托管标识的服务器的环境在启用Azure Arc的服务器上使用以下变量进行配置:

  • IMDS_ENDPOINT:已启用Azure Arc服务器的 IMDS 终结点 IP 地址http://localhost:40342

  • IDENTITY_ENDPOINT:对应于服务的托管标识的 localhost 终结点 http://localhost:40342/metadata/identity/oauth2/token

服务器上运行的代码可以从Azure实例元数据服务终结点请求令牌,仅可从服务器内部访问。

应用程序可以检索系统环境变量 IDENTITY_ENDPOINTIMDS_ENDPOINT 值,并使用这些变量来发现这些终结点。 任何访问级别的应用程序都可以向终结点发出请求。 像平常一样对元数据响应进行处理,然后将其提供给系统中的任何进程。 但是,当发出公开令牌的请求时,客户端必须提供一个机密来证明他们能够访问仅对更高特权用户可用的数据。

先决条件

开始之前,请确保您具备以下先决条件:

  • 了解 托管标识

  • 连接到启用 Azure Arc 的服务器的另一台服务器。

  • 在Windows,必须是本地 Administrators 组或 Hybrid Agent Extension Applications 组的成员。 在 Linux 上,你必须是 himds 组的成员。

  • 为了执行所需的资源创建和角色管理步骤,您必须在包含已启用 Arc 的服务器的 Azure 订阅或资源组中具有所有者角色

  • 用于存储和检索凭据的 Azure Key Vault,并为 Azure Arc 标识分配访问 Key Vault 的权限。

    • 若要配置服务器使用的托管标识的访问,请参阅适用于 Linux 的 Grant 访问grant 访问 Windows。 输入 VM 的名称时,请使用启用Azure Arc的服务器的名称。

使用 REST API 获取访问令牌

获取和使用系统分配的托管标识对Azure资源进行身份验证的方法类似于用于Azure VM 的方法。

对于启用 Azure Arc 的 Windows 服务器,请使用 PowerShell 调用 web 请求,以从特定端口的本地主机获取令牌。 使用 IP 地址或环境变量 IDENTITY_ENDPOINT指定请求。

$apiVersion = "2020-06-01"
$resource = "https://management.chinacloudapi.cn/"
$endpoint = "{0}?resource={1}&api-version={2}" -f $env:IDENTITY_ENDPOINT,$resource,$apiVersion
$secretFile = ""
try
{
    Invoke-WebRequest -Method GET -Uri $endpoint -Headers @{Metadata='True'} -UseBasicParsing
}
catch
{
    $wwwAuthHeader = $_.Exception.Response.Headers["WWW-Authenticate"]
    if ($wwwAuthHeader -match "Basic realm=.+")
    {
        $secretFile = ($wwwAuthHeader -split "Basic realm=")[1]
    }
}
Write-Host "Secret file path: " $secretFile`n
$secret = cat -Raw $secretFile
$response = Invoke-WebRequest -Method GET -Uri $endpoint -Headers @{Metadata='True'; Authorization="Basic $secret"} -UseBasicParsing
if ($response)
{
    $token = (ConvertFrom-Json -InputObject $response.Content).access_token
    Write-Host "Access token: " $token
}

其响应类似于如下示例:

使用 PowerShell 成功检索访问令牌。

对于启用了Azure Arc的 Linux 服务器,请使用 Bash 调用从特定端口上的本地主机获取令牌的 Web 请求。 使用 IP 地址或环境变量 IDENTITY_ENDPOINT指定以下请求。 若要完成此步骤,需要 SSH 客户端。

CHALLENGE_TOKEN_PATH=$(curl -s -D - -H Metadata:true "http://127.0.0.1:40342/metadata/identity/oauth2/token?api-version=2019-11-01&resource=https%3A%2F%2Fmanagement.chinacloudapi.cn" | grep Www-Authenticate | cut -d "=" -f 2 | tr -d "[:cntrl:]")
CHALLENGE_TOKEN=$(cat $CHALLENGE_TOKEN_PATH)
if [ $? -ne 0 ]; then
    echo "Could not retrieve challenge token, double check that this command is run with root privileges."
else
    curl -s -H Metadata:true -H "Authorization: Basic $CHALLENGE_TOKEN" "http://127.0.0.1:40342/metadata/identity/oauth2/token?api-version=2019-11-01&resource=https%3A%2F%2Fmanagement.chinacloudapi.cn"
fi

其响应类似于如下示例:

使用 Bash 成功检索访问令牌。

注释

前面的示例请求将资源变量设置为 https://management.chinacloudapi.cn时用于 ARM REST API 的访问令牌。 如果需要其他Azure服务的访问令牌,请将脚本中的资源变量替换为正确的资源值。 若要使用 Azure Storage 进行身份验证,请参阅 Microsoft Authentication Library (MSAL)。 要完成配置以验证 Azure Key Vault,请参阅 Access Key Vault with WindowsAccess Key Vault with Linux