次の方法で共有


Azure Backup を使用して暗号化された VM の Key Vault のキーとシークレットを復元

この記事では、元のキーとシークレットが Key Vault で使用できない場合に、Azure VM Backup を使用して暗号化された Azure Virtual Machines (VM) を復元する方法について説明します。 また、復元された VM のキー (キー暗号化キー) とシークレット (BitLocker 暗号化キー) の個別のコピーを保持するシナリオにも適用できます。

Note

Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を始めるには、「Azure PowerShell をインストールする」を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

前提条件

暗号化された VM の復元を開始する前に、次の前提条件が満たされていることを確認してください。

  • 暗号化された VM のバックアップ - 暗号化された Azure VM は、Azure Backup を使用してバックアップされます。 暗号化された Azure VM のバックアップ方法について詳しくは、PowerShell を使用して Azure VM のバックアップおよび復元を管理する方法に関する記事をご覧ください。
  • Azure Key Vault の構成 – キーとシークレットの復元先の Key Vault が既に存在しています。 Key Vault の管理について詳しくは、「Azure Key Vault について」をご覧ください。
  • ディスクの復元 - PowerShell の手順 を使用して、暗号化された VM のディスクを復元するための復元ジョブをトリガーし、このジョブによって、復元する暗号化された VM のキーとシークレットを含む JSON ファイルがストレージ アカウントに生成されるようにします。

Azure Backup からのキーとシークレットの取得

Note

暗号化された VM のディスクが復元されたら、次のことを確認します。

  • $detailsディスクの復元に関するセクションの PowerShell の手順で説明されているように、ディスクの復元ジョブの詳細が設定されます
  • キーとシークレットが Key Vault に復元された後にのみ、復元されたディスクから VM が作成されます。

復元されたディスクのプロパティに対し、ジョブの詳細を照会します。

$properties = $details.properties
$storageAccountName = $properties["Target Storage Account Name"]
$containerName = $properties["Config Blob Container Name"]
$encryptedBlobName = $properties["Encryption Info Blob Name"]

Azure ストレージ コンテキストを設定し、暗号化された VM のキーとシークレットの詳細を含む JSON 構成ファイルを復元します。

Set-AzCurrentStorageAccount -Name $storageaccountname -ResourceGroupName '<rg-name>'
$destination_path = 'C:\vmencryption_config.json'
Get-AzStorageBlobContent -Blob $encryptedBlobName -Container $containerName -Destination $destination_path
$encryptionObject = Get-Content -Path $destination_path  | ConvertFrom-Json

キーの復元

上記の宛先パスで JSON ファイルが生成されたら、JSON からキー BLOB ファイルを生成し、キー コマンドレットを復元してキー (KEK) をキー コンテナーに戻すようにフィードします。

$keyDestination = 'C:\keyDetails.blob'
[io.file]::WriteAllBytes($keyDestination, [System.Convert]::FromBase64String($encryptionObject.OsDiskKeyAndSecretDetails.KeyBackupData))
Restore-AzKeyVaultKey -VaultName '<target_key_vault_name>' -InputFile $keyDestination

シークレットの復元

生成された JSON ファイルを使用してシークレットの名前と値を取得し、それをフィードしてシークレットコマンドレットを設定し、シークレット - BitLocker 暗号化キー (BEK) をキー コンテナーに戻します。  VM が BEK と KEK を使用して暗号化される場合は、次のコマンドレットを使用します。

Windows VM が BEK と KEK を使用して暗号化される場合は、次のコマンドレットを使用します。

$secretdata = $encryptionObject.OsDiskKeyAndSecretDetails.SecretData
$Secret = ConvertTo-SecureString -String $secretdata -AsPlainText -Force
$secretname = 'B3284AAA-DAAA-4AAA-B393-60CAA848AAAA'
$Tags = @{'DiskEncryptionKeyEncryptionAlgorithm' = 'RSA-OAEP';'DiskEncryptionKeyFileName' = 'B3284AAA-DAAA-4AAA-B393-60CAA848AAAA.BEK';'DiskEncryptionKeyEncryptionKeyURL' = $encryptionObject.OsDiskKeyAndSecretDetails.KeyUrl;'MachineName' = 'vm-name'}
Set-AzKeyVaultSecret -VaultName '<target_key_vault_name>' -Name $secretname -SecretValue $Secret -ContentType  'Wrapped BEK' -Tags $Tags

Linux VM が BEK と KEK を使用して暗号化される場合は、次のコマンドレットを使用します。

$secretdata = $encryptionObject.OsDiskKeyAndSecretDetails.SecretData
$Secret = ConvertTo-SecureString -String $secretdata -AsPlainText -Force
$secretname = 'B3284AAA-DAAA-4AAA-B393-60CAA848AAAA'
$Tags = @{'DiskEncryptionKeyEncryptionAlgorithm' = 'RSA-OAEP';'DiskEncryptionKeyFileName' = 'LinuxPassPhraseFileName';'DiskEncryptionKeyEncryptionKeyURL' = <Key_url_of_newly_restored_key>;'MachineName' = 'vm-name'}
Set-AzKeyVaultSecret -VaultName '<target_key_vault_name>' -Name $secretname -SecretValue $Secret -ContentType  'Wrapped BEK' -Tags $Tags

生成された JSON ファイルを使用してシークレットの名前と値を取得し、それをフィードしてシークレット (BEK) をキー コンテナーに戻すシークレット コマンドレットを設定します。  VM が BEK のみを使用して暗号化される場合は、次のコマンドレットを使用します。

$secretDestination = 'C:\secret.blob'
[io.file]::WriteAllBytes($secretDestination, [System.Convert]::FromBase64String($encryptionObject.OsDiskKeyAndSecretDetails.KeyVaultSecretBackupData))
Restore-AzKeyVaultSecret -VaultName '<target_key_vault_name>' -InputFile $secretDestination -Verbose

Note

  • $encryptionObject.OsDiskKeyAndSecretDetails.SecretUrl の出力を参照し、secrets/ の後に続くテキスト (例: output secret URL is https://keyvaultname.vault.azure.net/secrets/B3284AAA-DAAA-4AAA-B393-60CAA848AAAA/xx000000xx0849999f3xx30000003163 and secret name is B3284AAA-DAAA-4AAA-B393-60CAA848AAAA) を使って、$secretname の値を取得できます
  • タグ DiskEncryptionKeyFileName の値は、シークレット名と同じです。

復元されたディスクからの仮想マシンの作成

Azure VM Backup を使用して暗号化された VM をバックアップする場合、上記の PowerShell コマンドレットを使用すると、キーとシークレットをキー コンテナーに復元できます。 これらを復元した後で、復元したディスク、キー、およびシークレットから暗号化された VM を作成するには、PowerShell を使用した Azure VM のバックアップと復元の管理に関する記事をご覧ください。

従来の手法

上記のアプローチは、すべての復旧ポイントに対して機能します。 ただし、BEK と KEK を使用して暗号化された VM の場合、2017 年 7 月 11 日より前の復旧ポイントでは、復旧ポイントからキーとシークレットを取得する従来の手法も有効です。 PowerShell ステップを使って、暗号化された VM のディスクの復元 ジョブが完了したら、$rp に有効な値が設定されていることを確認してください。

キーの復元 (従来の手法)

以下のコマンドレットを使用して復旧ポイントからキー (KEK) 情報を取得し、この情報をフィードしてキーのコマンドレットを復元し、Key Vault に戻します。

$rp1 = Get-AzRecoveryServicesBackupRecoveryPoint -RecoveryPointId $rp[0].RecoveryPointId -Item $backupItem -KeyFileDownloadLocation 'C:\Users\downloads'
Restore-AzureKeyVaultKey -VaultName '<target_key_vault_name>' -InputFile 'C:\Users\downloads'

シークレットの復元 (従来の手法)

以下のコマンドレットを使用して復旧ポイントからシークレット (BEK) 情報を取得し、この情報をフィードしてシークレットのコマンドレットを設定し、Key Vault に戻します。

$secretname = 'B3284AAA-DAAA-4AAA-B393-60CAA848AAAA'
$secretdata = $rp1.KeyAndSecretDetails.SecretData
$Secret = ConvertTo-SecureString -String $secretdata -AsPlainText -Force
$Tags = @{'DiskEncryptionKeyEncryptionAlgorithm' = 'RSA-OAEP';'DiskEncryptionKeyFileName' = 'B3284AAA-DAAA-4AAA-B393-60CAA848AAAA.BEK';'DiskEncryptionKeyEncryptionKeyURL' = 'https://mykeyvault.vault.azure.net:443/keys/KeyName/84daaac999949999030bf99aaa5a9f9';'MachineName' = 'vm-name'}
Set-AzKeyVaultSecret -VaultName '<target_key_vault_name>' -Name $secretname -SecretValue $secret -Tags $Tags -SecretValue $Secret -ContentType  'Wrapped BEK'

Note

  • $rp1.KeyAndSecretDetails.SecretUrl の出力を参照し、secrets/ の後に続くテキスト (例: output secret URL is https://keyvaultname.vault.azure.net/secrets/B3284AAA-DAAA-4AAA-B393-60CAA848AAAA/xx000000xx0849999f3xx30000003163 and secret name is B3284AAA-DAAA-4AAA-B393-60CAA848AAAA) を使って、$secretname の値を取得できます。
  • タグ DiskEncryptionKeyFileName の名前は、シークレットの名前と同じです。
  • DiskEncryptionKeyEncryptionKeyURL の値は、キーを復元した後で、Get-AzKeyVaultKey コマンドレットを使用して、Key Vault から取得できます

次のステップ

キーとシークレットをキー コンテナーに復元した後で、復元したディスク、キー、シークレットから暗号化された VM を作成するには、PowerShell を使用して Azure VM のバックアップおよび復元を管理する方法に関する記事をご覧ください。