Windows VM 上的 Azure 磁盘加密方案

适用于 Windows 虚拟机 (VM) 的 Azure 磁盘加密使用 Windows 的 BitLocker 功能对 OS 磁盘和数据磁盘进行完整的磁盘加密。 此外,VolumeType 参数为 All 时,它提供临时磁盘加密。

Azure 磁盘加密与 Azure Key Vault 集成,帮助你控制和管理磁盘加密密钥与机密。 有关该服务的概述,请参阅适用于 Windows VM 的 Azure 磁盘加密

只能对具有支持的 VM 大小和操作系统的虚拟机应用磁盘加密。 还必须满足以下先决条件:

重要

安装工具并连接到 Azure

可以通过 Azure CLIAzure 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'
    
  • 禁用磁盘加密: 若要禁用加密,请使用 Disable-AzVMDiskEncryption cmdlet。 当 OS 和数据磁盘都已加密时,无法按预期在 Windows VM 上禁用数据磁盘加密。 请改为在所有磁盘上禁用加密。

    Disable-AzVMDiskEncryption -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"
    
  • 禁用加密: 若要禁用加密,请使用 az vm encryption disable 命令。 当 OS 和数据磁盘都已加密时,无法按预期在 Windows VM 上禁用数据磁盘加密。 请改为在所有磁盘上禁用加密。

    az vm encryption disable --name "MySecureVM" --resource-group "MyVirtualMachineResourceGroup" --volume-type [ALL, DATA, OS]
    

使用 Resource Manager 模板

可以通过使用资源管理器模板加密正在运行的 Windows VM,在 Azure 中现有或正在运行的 IaaS Windows VM 上启用磁盘加密。

  1. 在 Azure 快速入门模板中,单击“部署到 Azure”。

    “部署到 Azure”

    备注

    必须修改从 GitHub 存储库“azure-quickstart-templates”下载或参考的模板,以适应 Azure 中国云环境。 例如,替换某些终结点(将“blob.core.windows.net”替换为“blob.core.chinacloudapi.cn”,将“cloudapp.azure.com”替换为“chinacloudapp.cn”);必要时更改某些不受支持的 VM 映像、VM 大小、SKU 以及资源提供程序的 API 版本。

  2. 选择订阅、资源组、位置、设置、法律条款和协议。 单击“购买”,在现有或正在运行的 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 要对其执行加密操作的卷的类型。 有效值为 OSDataAll
    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。

使用 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 PowerShell、Azure CLI 或资源管理器模板禁用加密。 当 OS 和数据磁盘都已加密时,无法按预期在 Windows VM 上禁用数据磁盘加密。 请改为在所有磁盘上禁用加密。

  • 使用 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"
    

不支持的方案

Azure 磁盘加密不支持以下方案、功能和技术:

  • 加密通过经典 VM 创建方法创建的基本层 VM。
  • 加密使用基于软件的 RAID 系统配置的 VM。
  • 加密配置了存储空间直通 (S2D) 的 VM,或配置了 Windows 存储空间的、版本低于 2016 的 Windows Server。
  • 与本地密钥管理系统集成。
  • Azure 文件(共享文件系统)。
  • 网络文件系统 (NFS)。
  • 动态卷。
  • Windows Server 容器,为每个容器创建动态卷。
  • 临时 OS 磁盘。
  • 加密共享/分布式文件系统,包括但不限于 DFS、GFS、DRDB 和 CephFS。
  • 将加密的 VM 移到其他订阅或区域。
  • 创建已加密 VM 的映像或快照,并使用它来部署其他 VM。
  • 具有写入加速器磁盘的 M 系列 VM。
  • 将 ADE 应用到一个 VM,此 VM 使用服务器端加密和客户管理的密钥 (SSE + CMK) 加密磁盘。 将 SSE+CMK 应用于使用 ADE 加密的 VM 上的数据磁盘,这种方案也不受支持。
  • 将使用 ADE 加密的 VM,或者曾经使用 ADE 加密的 VM 迁移到使用客户管理的密钥的服务器端加密
  • 加密故障转移群集中的 VM。

后续步骤