共用方式為


使用 Azure 備份還原已加密 VM 的金鑰保存庫金鑰與密碼

本文說明如何在金鑰保存庫中無法使用原始金鑰和秘密時,使用 Azure VM 備份來還原加密的 Azure 虛擬機器 (VM)。 其也適用於要為還原的虛擬機器維護金鑰 (金鑰加密金鑰) 和祕密 (BitLocker 加密金鑰) 之單獨副本的情況。

附註

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 若要開始使用,請參閱安裝 Azure PowerShell。 若要了解如何遷移至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

先決條件

開始還原加密的 VM 之前,請確定符合下列必要條件:

  • 備份加密的 VM - 加密的 Azure VM 會使用 Azure 備份進行備份。 如需如何備份已加密 Azure VM 的詳細資料,請參閱使用 PowerShell 管理 Azure VM 的備份和還原一文。
  • 設定 Azure 金鑰保存庫 – 先確定金鑰保存庫已存在,才能將金鑰和密碼還原至該金鑰保存庫。 如需金鑰保存庫管理的相關詳細資料,請參閱開始使用 Azure Key Vault 一文。
  • 還原磁碟 - 請確定您使用 PowerShell 步驟 觸發還原作業,以還原加密 VM 的磁碟,讓此作業在您的儲存體帳戶中產生 JSON 檔案,其中包含要還原加密 VM 的金鑰和秘密。

從 Azure 備份取得金鑰和祕密

附註

還原加密虛擬機器的磁碟後,請確定:

查詢工作詳細資料的已還原磁碟內容。

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

設定 Azure 儲存體內容並還原 JSON 組態檔,其中包含加密 VM 之金鑰和秘密的詳細資料。

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 檔案,並將其饋送以還原金鑰 Cmdlet,以將金鑰 (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 檔案來取得秘密名稱和值,並將其饋送至設定秘密 Cmdlet,以將秘密 - BitLocker 加密金鑰 (BEK) 放回金鑰保存庫中。 如果使用 BEK 和 KEK 加密您的 VM,請使用這些 Cmdlet。

如果使用 BEK 和 KEK 加密您的 Windows VM,請使用這些 Cmdlet。

$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

如果使用 BEK 和 KEK 加密您的 Linux VM,請使用這些 Cmdlet。

$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 檔案來取得秘密名稱和值,並將其饋送至設定秘密 Cmdlet,以將秘密 (BEK) 放回金鑰保存庫中。 如果僅使用 BEK 加密您的 VM,請使用這些 Cmdlet。

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

附註

  • 您可以透過參考 $encryptionObject.OsDiskKeyAndSecretDetails.SecretUrl 的輸出,並使用祕密之後的文字來取得 $secretname 的值。例如,輸出秘密 URL 是 https://keyvaultname.vault.azure.net/secrets/B3284AAA-DAAA-4AAA-B393-60CAA848AAAA/xx000000xx0849999f3xx30000003163,且祕密名稱是 B3284AAA-DAAA-4AAA-B393-60CAA848AAAA
  • 標籤 DiskEncryptionKeyFileName 的值與祕密名稱相同。

從已還原的磁碟建立虛擬機器

如果您使用 Azure VM 備份備份加密的 VM,上述 PowerShell Cmdlet 可協助您將金鑰和秘密還原回金鑰保存庫。 在還原金鑰與祕密之後,請參閱使用 PowerShell 管理 Azure VM 的備份和還原一文,從已還原的磁碟、金鑰和祕密建立加密的 VM。

舊版方法

上述方法適用於所有復原點。 不過,從復原點取得金鑰和密碼資訊的較舊方法,對於 2017 年 7 月 11 日以前使用 BEK 和 KEK 加密之 VM 的復原點仍有效。 一旦使用 PowerShell 步驟完成加密 VM 的還原磁碟作業後,確保 $rp 填入有效的值。

還原金鑰 (舊版方法)

使用下列 Cmdlet 從復原點取得金鑰 (KEK) 資訊,並將其饋送至還原金鑰 Cmdlet 以放回金鑰保存庫中。

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

還原祕密 (舊版方法)

使用下列 Cmdlet 從復原點取得祕密 (BEK) 資訊,並將其饋送至設定祕密 Cmdlet 以放回金鑰保存庫中。

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

附註

  • 您可以透過參考 $rp1.KeyAndSecretDetails.SecretUrl 的輸出,並使用祕密之後的文字來取得 $secretname 的值。例如,輸出秘密 URL 是 https://keyvaultname.vault.azure.net/secrets/B3284AAA-DAAA-4AAA-B393-60CAA848AAAA/xx000000xx0849999f3xx30000003163,而祕密名稱是 B3284AAA-DAAA-4AAA-B393-60CAA848AAAA
  • DiskEncryptionKeyFileName 標記的值與祕密名稱相同。
  • 還原回金鑰並使用 Get-AzKeyVaultKey (部分內容可能是機器或 AI 翻譯) Cmdlet 後,便可從金鑰保存庫取得 DiskEncryptionKeyEncryptionKeyURL 的值

後續步驟

將金鑰與祕密還原回金鑰保存庫後,請參閱使用 PowerShell 管理 Azure VM 的備份和還原一文,從已還原的磁碟、金鑰和祕密建立已加密的 VM。