本文說明如何在金鑰保存庫中無法使用原始金鑰和秘密時,使用 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 備份取得金鑰和祕密
附註
還原加密虛擬機器的磁碟後,請確定:
- $details會填入還原磁碟作業詳細數據,如還原磁碟一節中的 PowerShell 步驟中所述
- 僅在將金鑰和秘密還原至金鑰保存庫之後,才應該從還原的硬碟建立 VM。
查詢工作詳細資料的已還原磁碟內容。
$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。