透過已啟用 Azure Arc 的伺服器向 Azure 資源進行驗證
直接在已啟用 Azure Arc 的伺服器上執行的應用程式或進程,可以使用受控識別來存取支援Microsoft Entra ID 型驗證的其他 Azure 資源。 應用程式可以取得代表其身分識別的存取權杖 (由系統為已啟用 Azure Arc 的伺服器指派),並使用其作為「持有人」權杖,向其他服務驗證其本身。
如需受控識別的詳細描述,並了解系統指派和使用者指派身分識別之間的差異,請參閱受控識別槪觀文件。
在本文中,您將了解伺服器如何使用系統指派的受控識別來存取 Azure 金鑰保存庫。 金鑰保存庫讓您的用戶端應用程式能夠使用祕密來存取未受 Microsoft Entra ID 保護的資源。 例如,IIS 網頁伺服器所使用的 TLS/SSL 憑證可以儲存在 Azure 金鑰保存庫,並安全地將憑證部署到 Azure 外部的 Windows 或 Linux 伺服器。
安全性概觀
將伺服器上線至已啟用 Azure Arc 的伺服器以使用受控識別進行設定時,會發生數個動作(類似於 Azure VM 發生的情況):
Azure Resource Manager 收到要求,請求在已啟用 Azure Arc 的伺服器上啟用系統指派受控識別。
Azure Resource Manager 會在 Microsoft Entra ID 中建立服務主體,代表伺服器的身分識別。 服務主體會建立在此訂用帳戶信任的 Microsoft Entra 租用戶中。
Azure Resource Manager 會以服務主體用戶端識別碼和憑證來更新 Windows 或 Linux 的 Azure Instance Metadata Service (IMDS) 身分識別端點,進而在伺服器上設定身分識別。 端點是 REST 端點,只能從伺服器內使用已知且無法路由的 IP 位址存取。 此服務提供已啟用 Azure Arc 的伺服器中繼資料資訊子集,以協助管理和設定。
已啟用受控識別的伺服器環境是在已啟用 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_ENDPOINT 和 IMDS_ENDPOINT 值,並加以使用。 允許具有任何存取層級的應用程式向端點提出要求。 中繼資料回應會照常處理,並提供給電腦上的任何流程。 不過,當提出會公開令牌的要求時,我們需要用戶端提供秘密來證明他們只能存取許可權較高的用戶的數據。
必要條件
了解受控識別。
在 Windows 上,您必須是本機 Administrators 群組或混合式代理程式擴充功能應用程式群組的成員。
在 Linux 上,您必須是 himds 群組的成員。
已連線並向已啟用 Azure Arc 的伺服器註冊的伺服器。
您是訂用 帳戶或資源群組中擁有者群組 的成員(為了執行必要的資源建立和角色管理步驟)。
用來儲存和擷取認證的 Azure Key Vault,並將 Azure Arc 身分識別存取指派給 KeyVault。
- 如果您沒有建立 Key Vault,請參閱建立 Key Vault。
- 若要設定伺服器所使用的受控識別存取權,請參閱授與 Linux 的存取權或授與 Windows 的存取權。 針對步驟 5,您將輸入已啟用 Azure Arc 的伺服器名稱。 若要使用 PowerShell 完成此作業,請參閱使用 PowerShell 指派存取原則。
使用 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
}
下列回應是傳回的範例:
針對已啟用 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
下列回應是傳回的範例:
此回應包含您存取 Azure 中任何資源所需的存取權杖。 若要完成向 Azure Key Vault 進行驗證的設定,請參閱使用 Windows 存取 Key Vault 或使用Linux 存取 Key Vault。
下一步
若要深入了解 Azure Key Vault,請參閱 Key Vault 概觀。
了解如何使用 PowerShell 或使用 Azure CLI 將受控識別存取指派給資源。