Important
Azure Disk Encryption は、 2028 年 9 月 15 日に廃止される予定です。 その日まで、中断することなく Azure Disk Encryption を引き続き使用できます。 2028 年 9 月 15 日に、ADE 対応ワークロードは引き続き実行されますが、暗号化されたディスクは VM の再起動後にロック解除に失敗し、サービスが中断されます。
新しい VM の ホストで暗号化 を使用するか、 コンフィデンシャル コンピューティング ワークロード用の OS ディスク暗号化を使用して機密 VM サイズ を検討します。 サービスの中断を回避するために、すべての ADE 対応 VM (バックアップを含む) を提供終了日より前にホストで暗号化に移行する必要があります。 詳細については、「 Azure Disk Encryption からホストでの暗号化への移行 」を参照してください。
適用対象: ✔️ Windows VM
この記事は、事前に暗号化された VHD の準備およびその他のタスクのためのサンプル スクリプトを提供します。
注
すべてのスクリプトは、特に明記されている場合を除き、非 AAD の最新バージョンの ADE を参照します。
Azure Disk Encryption 用の PowerShell スクリプトのサンプル
- サブスクリプション内の暗号化された VM をすべて一覧表示する
Find_1passAdeVersion_VM.ps1 PowerShell スクリプトを使用すると、サブスクリプションに存在するすべてのリソース グループ内のすべての ADE で暗号化された VM と拡張機能のバージョンを確認できます。
または、これらのコマンドレットでは、ADE で暗号化されたすべての VM が表示されます (拡張機能のバージョンは表示されません)。
$osVolEncrypted = {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).OsVolumeEncrypted}
$dataVolEncrypted= {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).DataVolumesEncrypted}
Get-AzVm | Format-Table @{Label="MachineName"; Expression={$_.Name}}, @{Label="OsVolumeEncrypted"; Expression=$osVolEncrypted}, @{Label="DataVolumesEncrypted"; Expression=$dataVolEncrypted}
サブスクリプション内のすべての暗号化された VMSS インスタンスを一覧表示する
Find_1passAdeVersion_VMSS.ps1 PowerShell スクリプトを使用すると、サブスクリプションに存在するすべてのリソース グループ内のすべての ADE で暗号化された仮想マシン スケール セット インスタンスと拡張機能バージョンを検索できます。
キー コンテナー内の VM を暗号化するために使用されるディスクの暗号化シークレットをすべて一覧表示する
Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}
Azure Disk Encryption の前提条件である PowerShell スクリプトの使用
Azure Disk Encryption の前提条件に既に精通している場合は、Azure Disk Encryption の前提条件である PowerShell スクリプトを使用できます。 この PowerShell スクリプトの使用例については、VM の暗号化のクイック スタートに関するページを参照してください。 既存のリソース グループ内の既存の VM のすべてのディスクを暗号化するために、スクリプトの 211 行目から始まるセクションのコメントを削除できます。
次の表に、PowerShell スクリプトで使用できるパラメーターを示します。
| パラメーター | 説明 | 必須かどうか |
|---|---|---|
| $resourceGroupName | キー コンテナーが属するリソース グループの名前。 スクリプトは、この名前の新しいリソース グループが存在しない場合に作成します。 | True |
| $keyVaultName | 暗号化キーを配置するキー コンテナーの名前。 この名前のボールトが存在しない場合、スクリプトは新しいボールトを作成します。 | True |
| $location | キー ボールトの場所。 暗号化するキー コンテナーと VM が同じ場所にあることを確認します。
Get-AzLocation を使用して場所の一覧を取得します。 |
True |
| $subscriptionId | 使用するAzure サブスクリプションの識別子。
Get-AzSubscriptionでサブスクリプション ID を取得します。 |
True |
| $aadAppName | シークレットをKey Vaultに書き込むMicrosoft Entra アプリケーションの名前。 スクリプトは、この名前の新しいアプリケーションが存在しない場合に作成します。 このアプリが既に存在する場合は、aadClientSecret パラメーターをスクリプトに渡します。 | False |
| $aadClientSecret | 前に作成したMicrosoft Entra アプリケーションのクライアント シークレット。 | False |
| $keyEncryptionKeyName | Key Vaultの省略可能なキー暗号化キーの名前。 この名前のキーが存在しない場合、スクリプトは新しいキーを作成します。 | False |
Resource Manager テンプレート
Microsoft Entra アプリを使用せずに VM を暗号化または暗号化解除する
Microsoft Entra アプリを使用して VM を暗号化または復号化する
- 既存または実行中の Windows VM でディスク暗号化を有効にする
- 実行中の Windows VM で暗号化を無効にする
- 事前に暗号化された VHD/ストレージ BLOB から新しい暗号化されたマネージド ディスクを作成 する - 事前に暗号化された VHD とそれに対応する暗号化設定から、新しい暗号化されたマネージド ディスクを作成します。
事前に暗号化された Windows VHD を準備する
次のセクションでは、IaaS で暗号化された VHD として展開するために、事前に暗号化されたWindows VHD Azure準備する方法について説明します。 この情報を使用して、Azure Site RecoveryまたはAzureで新しいWindows VM (VHD) を準備して起動します。 VHD を準備してアップロードする方法の詳細については、「一般化された VHD をアップロードし、それを使用してAzureに新しい VM を作成する」を参照してください。
グループ ポリシーを更新して非 TPM で OS を保護できるようにする
[ローカル コンピューター ポリシー]>>> の下にある、[BitLocker ドライブ暗号化] という BitLocker グループ ポリシー設定を構成します。 次の図に示すように、[オペレーティング システムのドライブ]>[スタートアップ時に追加の認証を要求する]>[互換性のある TPM が装備されていない BitLocker を許可する] の順に選択して、この設定を変更します。
BitLocker 機能コンポーネントのインストール
Windows Server 2012 以降の場合は、次のコマンドを使用します。
dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart
Windows Server 2008 R2 の場合は、次のコマンドを使用します。
ServerManagerCmd -install BitLockers
bdehdcfg を使用して BitLocker の OS ボリュームを準備する
OS のパーティションを圧縮して、BitLocker 用にマシンを準備するには、必要に応じて、bdehdcfg を実行します。
bdehdcfg -target c: shrink -quiet
BitLocker を使用して OS ボリュームを保護する
manage-bde コマンドを使用して、外部キー保護機能を使用してブート ボリュームの暗号化を有効にします。 また、外部ドライブまたは外部ボリューム上に外部キー (.bek ファイル) を配置します。 システム/ブート ボリュームでの暗号化は、次回のリブート後に有効になります。
manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot
注
BitLocker を使用して外部キーを取得する場合は、そのためのデータ/リソース VHD を別個に使用して VM を準備してください。
暗号化された VHD を Azure ストレージ アカウントにアップロードする
BitLocker 暗号化を有効にした後、ローカル環境で暗号化された VHD をストレージ アカウントにアップロードする必要があります。
Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]
事前に暗号化された VM 用のシークレットをキー コンテナーにアップロードする
以前にシークレットとして取得したディスク暗号化シークレットをキー コンテナーにアップロードします。 これを行うには、シークレットの設定アクセス許可とラップキーアクセス許可を、シークレットをアップロードするアカウントに付与します。
# Typically, account Id is the user principal name (in user@domain.com format)
$upn = (Get-AzureRmContext).Account.Id
Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set
# In cloud shell, the account ID is a managed service identity, so specify the username directly
# $upn = "user@domain.com"
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set
# When running as a service principal, retrieve the service principal ID from the account ID, and set access policy to that
# $acctid = (Get-AzureRmContext).Account.Id
# $spoid = (Get-AzureRmADServicePrincipal -ServicePrincipalName $acctid).Id
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -ObjectId $spoid -BypassObjectIdValidation -PermissionsToKeys wrapKey -PermissionsToSecrets set
KEK で暗号化されないディスク暗号化シークレット
キー コンテナーにシークレットを設定するには、Set-AzKeyVaultSecret を使用します。 パスフレーズが base64 文字列としてエンコードされてから、キー コンテナーにアップロードされます。 また、キー コンテナーにシークレットを作成するときには、次のタグが設定されます。
# This is the passphrase that was provided for encryption during the distribution installation
$passphrase = "contoso-password"
$tags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
$secretName = [guid]::NewGuid().ToString()
$secretValue = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($passphrase))
$secureSecretValue = ConvertTo-SecureString $secretValue -AsPlainText -Force
$secret = Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name $secretName -SecretValue $secureSecretValue -tags $tags
$secretUrl = $secret.Id
KEK で暗号化されるディスク暗号化シークレット
必要に応じて、シークレットをキー コンテナーにアップロードする前に、キー暗号化キーを使用してシークレットを暗号化できます。 ラップ API を使用して、最初にキー暗号化キーを使用してシークレットを暗号化します。 このラップ操作の出力は、base64 URL エンコードされた文字列です。これは、Set-AzKeyVaultSecret コマンドレットを使用してシークレットとしてアップロードできます。
# This is the passphrase that was provided for encryption during the distribution installation
$passphrase = "contoso-password"
Add-AzKeyVaultKey -VaultName $KeyVaultName -Name "keyencryptionkey" -Destination Software
$KeyEncryptionKey = Get-AzKeyVaultKey -VaultName $KeyVault.OriginalVault.Name -Name "keyencryptionkey"
$apiversion = "2015-06-01"
##############################
# Get Auth URI
##############################
$uri = $KeyVault.VaultUri + "/keys"
$headers = @{}
$response = try { Invoke-RestMethod -Method GET -Uri $uri -Headers $headers } catch { $_.Exception.Response }
$authHeader = $response.Headers["www-authenticate"]
$authUri = [regex]::match($authHeader, 'authorization="(.*?)"').Groups[1].Value
Write-Host "Got Auth URI successfully"
##############################
# Get Auth Token
##############################
$uri = $authUri + "/oauth2/token"
$body = "grant_type=client_credentials"
$body += "&client_id=" + $AadClientId
$body += "&client_secret=" + [Uri]::EscapeDataString($AadClientSecret)
$body += "&resource=" + [Uri]::EscapeDataString("https://vault.azure.net")
$headers = @{}
$response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body
$access_token = $response.access_token
Write-Host "Got Auth Token successfully"
##############################
# Get KEK info
##############################
$uri = $KeyEncryptionKey.Id + "?api-version=" + $apiversion
$headers = @{"Authorization" = "Bearer " + $access_token}
$response = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers
$keyid = $response.key.kid
Write-Host "Got KEK info successfully"
##############################
# Encrypt passphrase by using a KEK
##############################
$passphraseB64 = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Passphrase))
$uri = $keyid + "/encrypt?api-version=" + $apiversion
$headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
$bodyObj = @{"alg" = "RSA-OAEP"; "value" = $passphraseB64}
$body = $bodyObj | ConvertTo-Json
$response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body
$wrappedSecret = $response.value
Write-Host "Encrypted passphrase successfully"
##############################
# Store secret
##############################
$secretName = [guid]::NewGuid().ToString()
$uri = $KeyVault.VaultUri + "/secrets/" + $secretName + "?api-version=" + $apiversion
$secretAttributes = @{"enabled" = $true}
$secretTags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
$headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
$bodyObj = @{"value" = $wrappedSecret; "attributes" = $secretAttributes; "tags" = $secretTags}
$body = $bodyObj | ConvertTo-Json
$response = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -Body $body
Write-Host "Stored secret successfully"
$secretUrl = $response.id
$KeyEncryptionKeyする次の手順では、$secretUrlとを使用します。
OS ディスクをアタッチするときにシークレット URL を指定する
KEK を使用しない
OS ディスクを接続するときに、 $secretUrl渡します。 URL は、"KEK で暗号化されていないディスク暗号化シークレット" セクションで生成されます。
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $VhdUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl
KEK を使用する
OS ディスクをアタッチするときに、$KeyEncryptionKey と $secretUrl を渡します。 URL は、"KEK で暗号化されたディスク暗号化シークレット" セクションで生成されます。
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $CopiedTemplateBlobUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl `
-KeyEncryptionKeyVaultId $KeyVault.ResourceId `
-KeyEncryptionKeyURL $KeyEncryptionKey.Id