本文介绍如何在 Key Vault 中不提供原始密钥和机密时使用 Azure VM 备份还原加密的 Azure 虚拟机(VM)。 它还适用于想要为还原的 VM 维护密钥(密钥加密密钥)和机密(BitLocker 加密密钥)的单独副本的情况。
注意
建议使用 Azure Az PowerShell 模块与 Azure 交互。 若要开始,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az。
先决条件
在开始还原加密 VM 之前,请确保满足以下先决条件:
- 备份加密的 Azure VM - 加密的 Azure VM 使用 Azure 备份进行备份。 有关如何备份已加密 Azure VM 的详细信息,请参阅使用 PowerShell 管理 Azure VM 的备份和还原一文。
- 配置 Azure Key Vault - 确保需将密钥和机密还原到其中的 Key Vault 已存在。 请参阅文章 Azure Key Vault 入门,了解有关密钥保管库管理的详细信息。
- 还原磁盘 - 确保使用 PowerShell 步骤 触发还原磁盘以还原加密 VM 的磁盘的还原作业,以便此作业在存储帐户中生成 JSON 文件,其中包含要还原的加密 VM 的密钥和机密。
从 Azure 备份获取密钥和机密
注意
为加密 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"]
为加密 VM 设置 Azure 存储上下文,并还原包含密钥和机密详细信息的 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 文件,并用它传递给用于恢复密钥的 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)放回密钥保管库中。 如果 VM 通过 BEK 和 KEK 加密,请使用这些 cmdlet。
如果 Windows VM 通过 BEK 和 KEK 加密,请使用这些 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
如果 Linux VM 通过 BEK 和 KEK 加密,请使用这些 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)放回密钥保管库。 如果 VM 仅通过 BEK 加密,请使用这些 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 的输出并使用 secrets/ 后的文本来获取 $secretname 值,例如假设输出机密 URL 为
https://keyvaultname.vault.azure.cn/secrets/B3284AAA-DAAA-4AAA-B393-60CAA848AAAA/xx000000xx0849999f3xx30000003163
,则机密名称为 B3284AAA-DAAA-4AAA-B393-60CAA848AAAA - 标记 DiskEncryptionKeyFileName 的值与机密名称相同。
从还原磁盘创建虚拟机
如果使用 Azure VM 备份备份加密的 VM,前面的 PowerShell cmdlet 可帮助你将密钥和机密还原回密钥保管库。 完成还原后,请参阅文章使用 PowerShell 管理 Azure VM 的备份和还原,使用还原的磁盘、密钥和机密创建加密 VM。
传统方法
上述方法适用于所有恢复点。 然而,对于使用 BEK 和 KEK 加密的 VM,从恢复点获取密钥和机密信息的老方法对 2017 年 7 月 11 日之前的恢复点仍然有效。 使用 PowerShell 步骤完成加密 VM 的还原磁盘作业后,请确保在 $rp 中填写有效值。
还原密钥(传统方法)
使用下列 cmdlet 从恢复点获取密钥 (KEK) 信息,并将其提供给还原密钥 cmdlet,以将其放回 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'
还原机密(传统方法)
使用下列 cmdlet 从恢复点获取机密 (BEK) 信息,并将其提供给设置机密 cmdlet,以将其放回 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.cn: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 的输出和使用 secrets/ 后的文本来获取 $secretname 值,例如假设输出机密 URL 为
https://keyvaultname.vault.azure.cn/secrets/B3284AAA-DAAA-4AAA-B393-60CAA848AAAA/xx000000xx0849999f3xx30000003163
,则机密名称为 B3284AAA-DAAA-4AAA-B393-60CAA848AAAA - 标记 DiskEncryptionKeyFileName 的值与机密名称相同。
- 还原密钥并使用 Get-AzKeyVaultKey cmdlet 后,可从密钥保管库获取 DiskEncryptionKeyEncryptionKeyURL 的值
后续步骤
将密钥和机密还原回密钥保管库后,请参阅文章使用 PowerShell 管理 Azure VM 的备份和还原,使用还原的磁盘、密钥和机密创建加密 VM。