Windows VM 上的 Azure 磁盘加密方案
适用于:✔️ Windows VM ✔️ 灵活规模集
适用于 Windows 虚拟机 (VM) 的 Azure 磁盘加密使用 Windows 的 BitLocker 功能对 OS 磁盘和数据磁盘进行完整的磁盘加密。 此外,VolumeType 参数为 All 时,它提供临时磁盘加密。
Azure 磁盘加密与 Azure Key Vault 集成,帮助你控制和管理磁盘加密密钥与机密。 有关该服务的概述,请参阅适用于 Windows VM 的 Azure 磁盘加密。
先决条件
只能对具有支持的 VM 大小和操作系统的虚拟机应用磁盘加密。 还必须满足以下先决条件:
限制
如果之前是结合使用 Azure 磁盘加密和 Microsoft Entra ID 来加密 VM,必须继续使用这种方式来加密 VM。 有关详细信息,请参阅结合使用 Azure 磁盘加密和 Microsoft Entra ID(以前的版本)。
在对磁盘进行加密之前,应该创建快照和/或备份。 备份确保在加密过程中发生任何意外故障时可以使用恢复选项。 加密之前,需要备份包含托管磁盘的 VM。 备份之后,可以通过指定 -skipVmBackup 参数,使用 Set-AzVMDiskEncryptionExtension cmdlet 来加密托管磁盘。 有关如何备份和还原加密型 VM 的详细信息,请参阅备份和还原加密型 Azure VM。
加密或禁用加密可能导致 VM 重新启动。
Azure 磁盘加密不支持以下方案、功能和技术:
- 加密通过经典 VM 创建方法创建的基本层 VM。
- BitLocker 的所有要求和限制,例如需要 NTFS。 有关详细信息,请参阅 BitLocker 概述。
- 加密使用基于软件的 RAID 系统配置的 VM。
- 加密配置了存储空间直通 (S2D) 的 VM,或配置了 Windows 存储空间的、版本低于 2016 的 Windows Server。
- 与本地密钥管理系统集成。
- Azure 文件(共享文件系统)。
- 网络文件系统 (NFS)。
- 动态卷。
- Windows Server 容器,为每个容器创建动态卷。
- 临时 OS 磁盘。
- iSCSI 磁盘。
- 加密共享/分布式文件系统,包括但不限于 DFS、GFS、DRDB 和 CephFS。
- 将加密的 VM 移到其他订阅或区域。
- 创建已加密 VM 的映像或快照,并使用它来部署其他 VM。
- 具有写入加速器磁盘的 M 系列 VM。
- 将 ADE 应用到一个 VM,此 VM 的磁盘已使用主机端加密或使用客户管理的密钥的服务器端加密 (SSE + CMK) 进行加密。 将 SSE + CMK 应用到数据磁盘或者将配置有 SSE + CMK 的数据磁盘添加到使用 ADE 加密的 VM 也是一种不支持的方案。
- 将使用 ADE 加密(或曾经使用 ADE 加密过)的 VM 迁移到主机端加密或使用客户管理的密钥的服务器端加密。
- 加密故障转移群集中的 VM。
- Azure 超级磁盘的加密。
- 高级 SSD v2 磁盘的加密。
- 使用 DENY 效果启用了
Secrets should have the specified maximum validity period
策略的订阅中的 VM 加密。 - 使用 DENY 效果启用了
Key Vault secrets should have an expiration date
策略的订阅中的 VM 加密
安装工具并连接到 Azure
可以通过 Azure CLI 和 Azure PowerShell 启用和管理 Azure 磁盘加密。 为此,必须在本地安装工具并连接到 Azure 订阅。
Azure CLI
Azure CLI 2.0 是用于管理 Azure 资源的命令行工具。 CLI 旨在提高数据查询灵活性、支持非阻塞进程形式的长时间操作,以及简化脚本编写。 可以按照安装 Azure CLI 中的步骤在本地安装它。
若要使用 Azure CLI 登录 Azure 帐户,请使用 az login 命令。
az cloud set -n AzureChinaCloud
az login
若要选择登录到的租户,请使用:
az login --tenant <tenant>
如果有多个订阅并想要指定其中的一个,请使用 az account list 获取订阅列表,然后使用 az account set 指定订阅。
az account list
az account set --subscription "<subscription name or ID>"
有关详细信息,请参阅 Azure CLI 2.0 入门。
Azure PowerShell
Azure PowerShell az 模块提供了一组使用 Azure 资源管理器模型管理 Azure 资源的 cmdlet。 可以按照安装 Azure PowerShell 模块中的说明在本地计算机上安装它。
如果已在本地安装 PowerShell,请确保使用最新版本的 Azure PowerShell SDK 来配置 Azure 磁盘加密。 下载最新版本的 Azure PowerShell 版本。
若要使用 Azure PowerShell 登录 Azure 帐户,请使用 Connect-AzAccount -Environment AzureChinaCloud cmdlet。
Connect-AzAccount -Environment AzureChinaCloud
如果有多个订阅并要指定一个,请先运行 Get-AzSubscription cmdlet 列出订阅,再运行 Set-AzContext cmdlet:
Set-AzContext -Subscription <SubscriptionId>
运行 Get-AzContext cmdlet 将验证是否选择了正确的订阅。
若要确认已安装 Azure 磁盘加密 cmdlet,请使用 Get-command cmdlet:
Get-command *diskencryption*
有关详细信息,请参阅 Azure PowerShell 入门。
在现有或正在运行的 Windows VM 上启用加密
在此方案中,可以使用资源管理器模板、PowerShell cmdlet 或 CLI 命令启用加密。 如果需要虚拟机扩展的架构信息,请参阅适用于 Windows 扩展的 Azure 磁盘加密一文。
使用 Azure PowerShell 在现有或正在运行的 VM 上启用加密
使用 Set-AzVMDiskEncryptionExtension cmdlet 在 Azure 中运行的 IaaS 虚拟机上启用加密。
加密正在运行的 VM: 以下脚本初始化变量并运行 Set-AzVMDiskEncryptionExtension cmdlet。 先决条件是事先创建资源组、VM 和密钥保管库。 请将 MyKeyVaultResourceGroup、MyVirtualMachineResourceGroup、MySecureVM 和 MySecureVault 替换为自己的值。
$KVRGname = 'MyKeyVaultResourceGroup'; $VMRGName = 'MyVirtualMachineResourceGroup'; $vmName = 'MySecureVM'; $KeyVaultName = 'MySecureVault'; $KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname; $diskEncryptionKeyVaultUrl = $KeyVault.VaultUri; $KeyVaultResourceId = $KeyVault.ResourceId; Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGname -VMName $vmName -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId;
使用 KEK 加密正在运行的 VM:
$KVRGname = 'MyKeyVaultResourceGroup'; $VMRGName = 'MyVirtualMachineResourceGroup'; $vmName = 'MyExtraSecureVM'; $KeyVaultName = 'MySecureVault'; $keyEncryptionKeyName = 'MyKeyEncryptionKey'; $KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname; $diskEncryptionKeyVaultUrl = $KeyVault.VaultUri; $KeyVaultResourceId = $KeyVault.ResourceId; $keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName).Key.kid; Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGname -VMName $vmName -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId -KeyEncryptionKeyUrl $keyEncryptionKeyUrl -KeyEncryptionKeyVaultId $KeyVaultResourceId;
注意
disk-encryption-keyvault 参数值的语法是完整的标识符字符串:/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
key-encryption-key 参数值的语法是 KEK 的完整 URI,其格式为: https://[keyvault-name].vault.azure.cn/keys/[kekname]/[kek-unique-id]验证磁盘是否已加密: 若要检查 IaaS VM 的加密状态,请使用 Get-AzVmDiskEncryptionStatus cmdlet。
Get-AzVmDiskEncryptionStatus -ResourceGroupName 'MyVirtualMachineResourceGroup' -VMName 'MySecureVM'
若要禁用加密,请参阅禁用加密和删除加密扩展。
使用 Azure CLI 在现有或正在运行的 VM 上启用加密
使用 az vm encryption enable 命令在 Azure 中运行的 IaaS 虚拟机上启用加密。
加密正在运行的 VM:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --volume-type [All|OS|Data]
使用 KEK 加密正在运行的 VM:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --key-encryption-key "MyKEK_URI" --key-encryption-keyvault "MySecureVaultContainingTheKEK" --volume-type [All|OS|Data]
注意
disk-encryption-keyvault 参数值的语法是完整的标识符字符串:/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
key-encryption-key 参数值的语法是 KEK 的完整 URI,其格式为: https://[keyvault-name].vault.azure.cn/keys/[kekname]/[kek-unique-id]验证磁盘是否已加密: 若要检查 IaaS VM 的加密状态,请使用 az vm encryption show 命令。
az vm encryption show --name "MySecureVM" --resource-group "MyVirtualMachineResourceGroup"
若要禁用加密,请参阅禁用加密和删除加密扩展。
使用 Resource Manager 模板
可以通过使用资源管理器模板加密正在运行的 Windows VM,在 Azure 中现有或正在运行的 IaaS Windows VM 上启用磁盘加密。
在 Azure 快速入门模板中,单击“部署到 Azure”。
注意
必须对从 GitHub 存储库“azure-quickstart-templates”下载或引用的模板进行修改,以适应由世纪互联运营的 Microsoft Azure 环境。 例如,替换某些终结点(将“blob.core.windows.net”替换为“blob.core.chinacloudapi.cn”,将“cloudapp.azure.com”替换为“chinacloudapp.cn”);必要时更改某些不受支持的 VM 映像、VM 大小、SKU 以及资源提供程序的 API 版本。
选择订阅、资源组、位置、设置、法律条款和协议。 单击“购买”,在现有或正在运行的 IaaS VM 上启用加密。
下表列出了现有或正在运行的 VM 的资源管理器模板参数:
参数 | 说明 |
---|---|
vmName | 运行加密操作的 VM 的名称。 |
KeyVaultName | BitLocker 密钥应上传到的 Key Vault 的名称。 可使用 cmdlet (Get-AzKeyVault -ResourceGroupName <MyKeyVaultResourceGroupName>). Vaultname 或 Azure CLI 命令 az keyvault list --resource-group "MyKeyVaultResourceGroup" 获取该名称 |
keyVaultResourceGroup | 包含密钥保管库的资源组的名称 |
keyEncryptionKeyURL | 密钥加密密钥的 URL,格式为 https://<Key Vault 名称>.vault.azure.cn/key/<密钥名称>。 如果不想要使用 KEK,请将此字段留空。 |
volumeType | 要对其执行加密操作的卷的类型。 有效值为“OS”、“Data”和“All”。 |
forceUpdateTag | 每次操作需要强制运行时,传入一个像 GUID 这样的唯一值。 |
resizeOSDisk | 在拆分系统卷之前,是否应调整 OS 分区大小以占用整个 OS VHD。 |
location | 所有资源的位置。 |
通过客户加密的 VHD 和加密密钥新建的 IaaS VM
在此方案中,可以使用 PowerShell cmdlet 或 CLI 命令通过预加密的 VHD 和关联的加密密钥来创建新的 VM。
请按照准备预加密的 Windows VHD 中的说明操作。 创建映像后,可使用下一部分中的步骤创建加密的 Azure VM。
使用 Azure PowerShell 加密包含预加密 VHD 的 VM
可以使用 PowerShell cmdlet Set-AzVMOSDisk 在加密的 VHD 上启用磁盘加密。 以下示例显示了一些常用参数。
$VirtualMachine = New-AzVMConfig -VMName "MySecureVM" -VMSize "Standard_A1"
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name "SecureOSDisk" -VhdUri "os.vhd" Caching ReadWrite -Windows -CreateOption "Attach" -DiskEncryptionKeyUrl "https://mytestvault.vault.azure.cn/secrets/Test1/514ceb769c984379a7e0230bddaaaaaa" -DiskEncryptionKeyVaultId "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myKVresourcegroup/providers/Microsoft.KeyVault/vaults/mytestvault"
New-AzVM -VM $VirtualMachine -ResourceGroupName "MyVirtualMachineResourceGroup"
在新添加的数据磁盘上启用加密
可以使用 PowerShell 或通过 Azure 门户将新磁盘添加到 Windows VM。
注意
必须通过 Powershell 或 CLI 启用新添加的数据磁盘加密。 目前,Azure 门户不支持在新磁盘上启用加密。
使用 Azure PowerShell 在新添加的磁盘上启用加密
使用 PowerShell 加密 Windows VM 的新磁盘时,应指定新的序列版本。 序列版本必须唯一。 以下脚本生成序列版本的 GUID。 在某些情况下,Azure 磁盘加密扩展可能会自动加密新添加的数据磁盘。 新磁盘处于联机状态后,在 VM 重新启动时,通常会出现自动加密的情况。 这通常是由于之前在 VM 上运行磁盘加密时将卷类型指定为“全部”。 如果新添加的数据磁盘上发生自动加密的情况,我们建议结合新序列版本再次运行 Set-AzVmDiskEncryptionExtension cmdlet。 如果新数据磁盘已自动加密,但并不希望进行加密,请先解密所有驱动器,然后使用为卷类型指定 OS 的新序列版本重新进行加密。
加密正在运行的 VM: 以下脚本初始化变量并运行 Set-AzVMDiskEncryptionExtension cmdlet。 先决条件是事先创建资源组、VM 和密钥保管库。 请将 MyKeyVaultResourceGroup、MyVirtualMachineResourceGroup、MySecureVM 和 MySecureVault 替换为自己的值。 本示例使用“All”作为 -VolumeType 参数,其中包含 OS 卷和 Data 卷。 如果只想加密 OS 卷,请使用“OS”作为 -VolumeType 参数。
$KVRGname = 'MyKeyVaultResourceGroup'; $VMRGName = 'MyVirtualMachineResourceGroup'; $vmName = 'MySecureVM'; $KeyVaultName = 'MySecureVault'; $KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname; $diskEncryptionKeyVaultUrl = $KeyVault.VaultUri; $KeyVaultResourceId = $KeyVault.ResourceId; $sequenceVersion = [Guid]::NewGuid(); Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGname -VMName $vmName -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId -VolumeType "All" -SequenceVersion $sequenceVersion;
使用 KEK 加密正在运行的 VM: 本示例使用“All”作为 -VolumeType 参数,其中包含 OS 卷和 Data 卷。 如果只想加密 OS 卷,请使用“OS”作为 -VolumeType 参数。
$KVRGname = 'MyKeyVaultResourceGroup'; $VMRGName = 'MyVirtualMachineResourceGroup'; $vmName = 'MyExtraSecureVM'; $KeyVaultName = 'MySecureVault'; $keyEncryptionKeyName = 'MyKeyEncryptionKey'; $KeyVault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $KVRGname; $diskEncryptionKeyVaultUrl = $KeyVault.VaultUri; $KeyVaultResourceId = $KeyVault.ResourceId; $keyEncryptionKeyUrl = (Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $keyEncryptionKeyName).Key.kid; $sequenceVersion = [Guid]::NewGuid(); Set-AzVMDiskEncryptionExtension -ResourceGroupName $VMRGname -VMName $vmName -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $KeyVaultResourceId -KeyEncryptionKeyUrl $keyEncryptionKeyUrl -KeyEncryptionKeyVaultId $KeyVaultResourceId -VolumeType "All" -SequenceVersion $sequenceVersion;
注意
disk-encryption-keyvault 参数值的语法是完整的标识符字符串:/subscriptions/[subscription-id-guid]/resourceGroups/[resource-group-name]/providers/Microsoft.KeyVault/vaults/[keyvault-name]
key-encryption-key 参数值的语法是 KEK 的完整 URI,其格式为: https://[keyvault-name].vault.azure.cn/keys/[kekname]/[kek-unique-id]
使用 Azure CLI 在新添加的磁盘上启用加密
运行 Azure CLI 命令来启用加密时,命令会自动提供新的序列版本。 本示例使用“All”作为 volume-type 参数。 如果只加密 OS 磁盘,则可能需要将 volume-type 参数更改为 OS。 与 Powershell 语法相反,在启用加密时,CLI 不要求用户提供唯一的序列版本。 CLI 自动生成并使用自己唯一的序列版本值。
加密正在运行的 VM:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --volume-type "All"
使用 KEK 加密正在运行的 VM:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --key-encryption-key "MyKEK_URI" --key-encryption-keyvault "MySecureVaultContainingTheKEK" --volume-type "All"
禁用加密并删除加密扩展
你可以禁用 Azure 磁盘加密扩展,也可以删除 Azure 磁盘加密扩展。 这是两个不同的操作。
若要删除 ADE,建议先禁用加密,然后删除扩展。 如果删除加密扩展而非禁用,磁盘仍将加密。 如果在删除扩展后禁用加密,则扩展将重新安装(以执行解密操作),并且需要再次删除。
禁用加密功能
可以使用 Azure PowerShell、Azure CLI 或资源管理器模板禁用加密。 禁用加密不会删除扩展(请参阅删除加密扩展)。
警告
操作系统和数据磁盘都已加密时禁用数据磁盘加密可能会产生意外的结果。 请改为在所有磁盘上禁用加密。
禁用加密会启动 BitLocker 的后台进程来解密磁盘。 在尝试重新启用加密之前,应为完成此进程提供足够的时间。
使用 Azure PowerShell 禁用磁盘加密: 若要禁用加密,请使用 Disable-AzVMDiskEncryption cmdlet。
Disable-AzVMDiskEncryption -ResourceGroupName "MyVirtualMachineResourceGroup" -VMName "MySecureVM" -VolumeType "all"
使用 Azure CLI 禁用加密: 若要禁用加密,请使用 az vm encryption disable 命令。
az vm encryption disable --name "MySecureVM" --resource-group "MyVirtualMachineResourceGroup" --volume-type "all"
使用资源管理器模板禁用加密:
单击在正在运行的 Windows VM 上禁用磁盘加密模板中的“部署到 Azure”。
注意
必须对从 GitHub 存储库“azure-quickstart-templates”下载或引用的模板进行修改,以适应由世纪互联运营的 Microsoft Azure 环境。 例如,替换某些终结点(将“blob.core.windows.net”替换为“blob.core.chinacloudapi.cn”,将“cloudapp.azure.com”替换为“chinacloudapp.cn”);必要时更改某些不受支持的 VM 映像、VM 大小、SKU 以及资源提供程序的 API 版本。
选择订阅、资源组、位置、VM、卷类型。
单击“评审并创建”以在正在运行的 Windows VM 上禁用磁盘加密。
删除加密扩展
如果要解密磁盘并删除加密扩展,则必须在删除扩展之前禁用加密;具体请参阅禁用加密。
你可以使用 Azure PowerShell 或 Azure CLI 删除加密扩展。
使用 Azure PowerShell 禁用磁盘加密:若要移除加密,请使用 Remove-AzVMDiskEncryptionExtension cmdlet。
Remove-AzVMDiskEncryptionExtension -ResourceGroupName "MyVirtualMachineResourceGroup" -VMName "MySecureVM"
使用 Azure CLI 禁用加密:若要移除加密,请使用 az vm extension delete 命令。
az vm extension delete -g "MyVirtualMachineResourceGroup" --vm-name "MySecureVM" -n "AzureDiskEncryption"