分享方式:


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

本文討論如果您的金鑰和密碼不存在於金鑰保存庫中,如何使用 Azure VM 備份還原已加密的 Azure VM。 如果您想要為已還原的 VM 另外維護一份金鑰 (金鑰加密金鑰) 與祕密 (BitLocker 加密金鑰),也可以使用這些步驟。

注意

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

必要條件

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

從 Azure 備份取得金鑰和祕密

注意

一旦還原加密 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-AzureKeyVaultKey -VaultName '<target_key_vault_name>' -InputFile $keyDestination

還原密碼

使用上面所產生的 JSON 檔案來取得秘密名稱和值,並將其饋送至設定祕密 Cmdlet,以將祕密 (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-AzureKeyVaultKey Cmdlet 後,便可從金鑰保存庫取得 DiskEncryptionKeyEncryptionKeyURL 的值

下一步

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