Batch で証明書を使用して Azure Key Vault に安全にアクセスする

警告

この記事で詳しく説明されているように、Batch アカウント証明書は非推奨です。 Azure Key Vault に安全にアクセスするには、ユーザー割り当てマネージド ID に対して構成された適切なアクセス許可を持つプール マネージド ID を使用して、Key Vault にアクセスするだけです。 Batch ノードで証明書をプロビジョニングする必要がある場合は、使用可能な Azure Key Vault VM 拡張機能とプール マネージド ID を組み合わせて使用して、Batch プールに証明書をインストールして管理してください。 Batch プールでマネージド ID を使用して Azure Key Vault から証明書をデプロイする方法の詳細については、「Batch プールで証明書の自動ローテーションを有効にする」を参照してください。

CloudServiceConfiguration プールでは、マネージド ID または Azure Key Vault VM 拡張機能を指定することはできません。これらのプールは非推奨です。 前述の代替手段を提供する VirtualMachineConfiguration プールに移行する必要があります。

この記事では、Azure Key Vault に格納されている資格情報に安全にアクセスできるように、証明書を Batch ノードに設定する方法について説明します。

Batch ノードから Azure Key Vault に対して認証を行うには、次のものが必要です。

  • Microsoft Entra 資格情報
  • 証明書
  • Batch アカウント
  • 少なくとも 1 つのノードを含む Batch プール

証明書を取得する

証明書がまだない場合は、PowerShell コマンドレット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 portal を使用するか、次の 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 ファイルとひとまとめにし、バッチ起動スクリプトの最初の部分としてインストーラーを呼び出すことです。 詳細については、次の例を参照してください。

$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
}

Key Vault にアクセスします

これで、Batch ノードで実行されているスクリプトの Key Vault にアクセスできるようになりました。 スクリプトから Key Vault にアクセスするには、スクリプトで証明書を使って Microsoft Entra ID に対する認証を行うだけです。 PowerShell でこれを行うには、次のコマンド例を使用します。 拇印の適切な GUID、アプリ ID (サービス プリンシパルの ID)、テナント ID (サービス プリンシパルが存在するテナント) を指定します。

Add-AzureRmAccount -ServicePrincipal -CertificateThumbprint -ApplicationId

認証されたら、通常どおり Key Vault にアクセスします。

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

これらはスクリプトで使用する資格情報です。

次のステップ