使用证书通过 Batch 安全地访问 Azure Key Vault

警告

本文中详细介绍的 Batch 帐户证书已弃用。 若要安全地访问 Azure Key Vault,只需在访问自己的密钥保管库时将池托管标识与为用户分配的托管标识配置的适当访问权限配合使用即可。 如果需要在 Batch 节点上预配证书,请将可用的 Azure Key Vault VM 扩展与池托管标识配合使用,在 Batch 池上安装和管理证书。 若要详细了解如何在 Batch 池中借助托管标识从 Azure Key Vault 部署证书,请参阅在 Batch 池中启用自动证书轮换

CloudServiceConfiguration 池不提供指定托管标识或 Azure Key Vault VM 扩展的功能,并且这些池已弃用。 应该迁移到提供上述替代选项的 VirtualMachineConfiguration 池。

本文将介绍如何设置具有证书的 Batch 节点,以安全地访问存储在 Azure Key Vault 中的凭据。

若要从 Batch 节点向 Azure Key Vault 进行身份验证,需要:

  • Microsoft Entra 凭据
  • 一个证书
  • 一个 Batch 帐户
  • 具有至少一个节点的 Batch 池

获得证书

如果你还没有证书,请使用 PowerShell cmdlet New-SelfSignedCertificate 创建一个新的自签名证书。

创建服务主体

将对 Key Vault 的访问权限授予用户或服务主体。 若要以编程方式访问 Key Vault,请将服务主体与上一步中创建的证书一起使用。 服务主体必须与 Key Vault 位于同一 Microsoft Entra 租户中。

$now = [System.DateTime]::Parse("2020-02-10")
# Set this to the expiration date of the certificate
$expirationDate = [System.DateTime]::Parse("2021-02-10")
# Point the script at the cer file you created $cerCertificateFilePath = 'c:\temp\batchcertificate.cer'
$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cer.Import($cerCertificateFilePath)
# Load the certificate into memory
$credValue = [System.Convert]::ToBase64String($cer.GetRawCertData())
# Create a new AAD application that uses this certificate
$newADApplication = New-AzureRmADApplication -DisplayName "Batch Key Vault Access" -HomePage "https://batch.mydomain.com" -IdentifierUris "https://batch.mydomain.com" -certValue $credValue -StartDate $now -EndDate $expirationDate
# Create new AAD service principal that uses this application
$newAzureAdPrincipal = New-AzureRmADServicePrincipal -ApplicationId $newADApplication.ApplicationId

应用程序的 URL 并不重要,因为我们只是将其用于访问 Key Vault。

授予 Key Vault 的权限

在上一步中创建的服务主体需要权限才能从 Key Vault 检索机密。 可以通过 Azure 门户或以下 PowerShell 命令授予权限。

Set-AzureRmKeyVaultAccessPolicy -VaultName 'BatchVault' -ServicePrincipalName '"https://batch.mydomain.com' -PermissionsToSecrets 'Get'

将证书分配给 Batch 帐户

创建 Batch 池,然后转到该池中的“证书”选项卡,并分配所创建的证书。 证书现在位于所有 Batch 节点上。

接下来,将该证书分配到 Batch 帐户。 将证书分配到帐户之后,Batch 就可以将其分配到池,然后分配到节点。 执行此操作最简单的方法是,转到门户中的 Batch 帐户,导航到“证书”,然后选择“添加”。 上传先前生成的 .pfx 文件,并提供密码。 完成后,相应的证书将添加到列表,你可以验证指纹。

现在,在创建 Batch 池时,可以导航到池中的“证书”,并将创建的证书分配到该池。 执行此操作时,请确保选择存储位置 LocalMachine。 证书将加载到池中的所有 Batch 节点上。

安装 Azure PowerShell

如果计划在节点上使用 PowerShell 脚本访问 Key Vault,则需要安装 Azure PowerShell 库。 如果节点安装了 Windows Management Framework (WMF) 5,则可使用 install-module 命令下载该库。 如果你使用的节点未安装 WMF 5,最简单的安装方法是将 Azure PowerShell .msi 文件与 Batch 文件捆绑在一起,然后在 Batch 启动脚本的第一部分中调用该安装程序。 有关详细信息,请参阅此示例:

$psModuleCheck=Get-Module -ListAvailable -Name Azure -Refresh
if($psModuleCheck.count -eq 0) {
    $psInstallerPath = Join-Path $downloadPath "azure-powershell.3.4.0.msi" Start-Process msiexec.exe -ArgumentList /i, $psInstallerPath, /quiet -wait
}

访问密钥保管库

现在可以通过在 Batch 节点上运行的脚本访问 Key Vault 了。 若要从脚本访问 Key Vault,对脚本来说,你只需使用证书向 Microsoft Entra ID 进行身份验证即可。 若要在 PowerShell 中执行此操作,请使用以下示例命令。 为“指纹”、“应用 ID”(服务主体的 ID)和“租户 ID”(服务主体所在的租户)指定相应的 GUID。

Connect-AzAccount -Environment AzureChinaCloud -ServicePrincipal -CertificateThumbprint -ApplicationId

经过身份验证后,可以像往常一样访问 KeyVault。

$adminPassword=Get-AzureKeyVaultSecret -VaultName BatchVault -Name batchAdminPass

这些是要在脚本中使用的凭据。

后续步骤