透過已啟用 Azure Arc 的伺服器向 Azure 資源進行驗證

直接在已啟用 Azure Arc 的伺服器上執行的應用程式或處理序,可以使用受控識別來存取支援 Microsoft Entra ID 型驗證的其他 Azure 資源。 應用程式可以取得代表其身分識別的存取權杖 (由系統為已啟用 Azure Arc 的伺服器指派),並使用其作為「持有人」權杖,向其他服務驗證其本身。

如需受控識別的詳細描述,並了解系統指派和使用者指派身分識別之間的差異,請參閱受控識別槪觀文件。

在本文中,我們會示範伺服器如何使用系統指派的受控識別來存取 Azure Key Vault。 作為啟動程序,金鑰保存庫可讓您的用戶端應用程式,接著使用密碼存取未受 Microsoft Entra ID 保護的資源。 例如,IIS 網頁伺服器所使用的 TLS/SSL 憑證可以儲存在 Azure Key Vault 中,並安全地將憑證部署至 Azure 外部的 Windows 或 Linux 伺服器。

安全性概觀

將伺服器上線至已啟用 Azure Arc 的伺服器時,會執行數個動作以使用受控識別進行設定,類似 Azure VM 所執行的動作:

  • Azure Resource Manager 收到要求,請求在已啟用 Azure Arc 的伺服器上啟用系統指派受控識別。

  • Azure Resource Manager 會在 Microsoft Entra ID 中建立服務主體,代表伺服器的身分識別。 服務主體會建立在此訂用帳戶信任的 Microsoft Entra 租用戶中。

  • Azure Resource Manager 會以服務主體用戶端識別碼和憑證來更新 WindowsLinux 的 Azure Instance Metadata Service (IMDS) 身分識別端點,進而在伺服器上設定身分識別。 端點是 REST 端點,只能從伺服器內使用已知且無法路由的 IP 位址存取。 此服務提供已啟用 Azure Arc 的伺服器中繼資料資訊子集,以協助管理和設定。

已啟用受控識別的伺服器環境將會在已啟用 Windows Azure Arc 的伺服器上設定下列變數:

  • IMDS_ENDPOINT:已啟用 Azure Arc 的伺服器 IMDS 端點 IP 位址 http://localhost:40342

  • IDENTITY_ENDPOINT:對應至服務受控識別 http://localhost:40342/metadata/identity/oauth2/token 的 localhost 端點。

您在伺服器上執行的程式碼可向能從伺服器內存取的 Azure Instance Metadata Service 端點要求權杖。

系統內容變數 IDENTITY_ENDPOINT 可用來依應用程式探索身分識別端點。 應用程式應該嘗試擷取 IDENTITY_ENDPOINTIMDS_ENDPOINT 值,並加以使用。 允許具有任何存取層級的應用程式向端點提出要求。 中繼資料回應會照常處理,並提供給電腦上的任何流程。 不過,當提出會公開權杖的要求時,我們需要用戶端提供秘密,來證明其能存取只供較高權限使用者使用的資料。

必要條件

  • 了解受控識別。

  • 在 Windows 上,您必須是本機 Administrators 群組或混合式代理程式擴充功能應用程式群組的成員。

  • 在 Linux 上,您必須是 himds 群組的成員。

  • 已連線並向已啟用 Azure Arc 的伺服器註冊的伺服器。

  • 您是訂用帳戶或資源群組中擁有者群組的成員,以執行必要的資源建立和角色管理步驟。

  • 用來儲存和擷取認證的 Azure Key Vault,並將 Azure Arc 身分識別存取指派給 KeyVault。

使用 REST API 取得存取權杖

取得和使用系統指派受控識別向 Azure 資源進行驗證的方法,與使用 Azure VM 執行的方式類似。

針對已啟用 Azure Arc 的 Windows 伺服器,您可以使用 PowerShell 叫用 Web 要求,以從特定連接埠的本機主機取得權杖。 使用 IP 位址或環境變數 IDENTITY_ENDPOINT 來指定要求。

$apiVersion = "2020-06-01"
$resource = "https://management.azure.com/"
$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
}

下列回應是傳回的範例:

A successful retrieval of the access token using 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.azure.com" | 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.azure.com"
fi

下列回應是傳回的範例:

A successful retrieval of the access token using Bash.

此回應包含您存取 Azure 中任何資源所需的存取權杖。 若要完成向 Azure Key Vault 進行驗證的設定,請參閱使用 Windows 存取 Key Vault使用Linux 存取 Key Vault

下一步