Linux VM 上的 Azure 磁盘加密方案
适用于:✔️ Linux VM ✔️ 灵活规模集
适用于 Linux 虚拟机 (VM) 的 Azure 磁盘加密使用 Linux 的 DM-Crypt 功能为 OS 磁盘和数据磁盘提供全磁盘加密。 此外,它还在使用 EncryptFormatAll 功能时提供临时磁盘加密。
Azure 磁盘加密与 Azure Key Vault 集成,帮助你控制和管理磁盘加密密钥与机密。 有关此服务的概述,请参阅适用于 Linux VM 的 Azure 磁盘加密。
先决条件
只能对具有支持的 VM 大小和操作系统的虚拟机应用磁盘加密。 还必须满足以下先决条件:
在所有情况下,在对磁盘进行加密之前,应该创建快照和/或备份。 备份确保在加密过程中发生任何意外故障时可以使用恢复选项。 加密之前,需要备份包含托管磁盘的 VM。 备份之后,可以通过指定 -skipVmBackup 参数,使用 Set-AzVMDiskEncryptionExtension cmdlet 来加密托管磁盘。 有关如何备份和还原已加密 VM 的详细信息,请参阅 Azure 备份一文。
限制
如果之前是结合使用 Azure 磁盘加密和 Microsoft Entra ID 来加密虚拟机,必须继续使用这种方式来加密虚拟机。 有关详细信息,请参阅结合使用 Azure 磁盘加密和 Microsoft Entra ID(以前的版本)。
加密 Linux OS 卷时,应将 VM 视为不可用。 强烈建议在加密正在进行的过程中避免 SSH 登录,以免在加密过程中出现问题,导致需要访问的任何打开文件被拦截。 若要检查进度,请使用 Get-AzVMDiskEncryptionStatus PowerShell cmdlet 或 vm encryption show CLI 命令。 对于 30GB 操作系统卷,此过程可能需要几小时才能完成,还需要额外的时间来加密数据卷。 除非使用 encrypt format all 选项,否则数据卷加密时间将与数据卷的大小和数量成比例。
在 Linux VM 上,仅支持对数据卷禁用加密。 如果 OS 卷已加密,则不支持对数据卷或 OS 卷禁用加密。
Azure 磁盘加密不支持以下 Linux 方案、功能和技术:
- 加密通过经典 VM 创建方法创建的基本层 VM。
- 在已加密 OS 驱动器的情况下,在 Linux VM 的 OS 驱动器或数据驱动器上禁用加密。
- 加密 Linux 虚拟机规模集的 OS 驱动器。
- 加密 Linux VM 上的自定义映像。
- 与本地密钥管理系统集成。
- Azure 文件(共享文件系统)。
- 网络文件系统 (NFS)。
- 动态卷。
- 临时 OS 磁盘。
- 加密共享/分布式文件系统,包括但不限于:DFS、GFS、DRDB 和 CephFS。
- 将加密的 VM 移到其他订阅或区域。
- 创建已加密 VM 的映像或快照,并使用它来部署其他 VM。
- 内核故障转储 (kdump)。
- Oracle ACFS(ASM 群集文件系统)。
- NVMe 磁盘,例如高性能计算 VM 大小或存储优化的 VM 大小。
- 具有“嵌套装入点”的 VM,即一个路径中有多个装入点(例如“/1stmountpoint/data/2stmountpoint”)。
- 包含数据驱动器的 VM 装载在 OS 文件夹之上。
- VM 上的根(OS 磁盘)逻辑卷已使用数据磁盘进行扩展。
- 重设 OS 磁盘的大小。
- 具有写入加速器磁盘的 M 系列 VM。
- 将 ADE 应用到一个 VM,此 VM 的磁盘已使用主机端加密或使用客户管理的密钥的服务器端加密 (SSE + CMK) 进行加密。 将 SSE + CMK 应用到数据磁盘或者将配置有 SSE + CMK 的数据磁盘添加到使用 ADE 加密的 VM 也是一种不支持的方案。
- 将使用 ADE 加密(或曾经使用 ADE 加密过)的 VM 迁移到主机端加密或使用客户管理的密钥的服务器端加密。
- 加密故障转移群集中的 VM。
- Azure 超级磁盘的加密。
- 高级 SSD v2 磁盘的加密。
- 对已启用“机密应具有指定的最长有效期”策略并具有拒绝效果的订阅中的 VM 进行加密。
安装工具并连接到 Azure
可以通过 Azure CLI 和 Azure PowerShell 启用和管理 Azure 磁盘加密。 为此,必须在本地安装工具并连接到 Azure 订阅。
Azure CLI 2.0 是用于管理 Azure 资源的命令行工具。 CLI 旨在提高数据查询灵活性、支持非阻塞进程形式的长时间操作,以及简化脚本编写。 可以按照安装 Azure CLI 中的步骤在本地安装它。
若要使用 Azure CLI 登录 Azure 帐户,请使用 az login 命令。
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 入门。
在现有或正在运行的 Linux VM 上启用加密
在此方案中,可以使用资源管理器模板、PowerShell cmdlet 或 CLI 命令启用加密。 如果需要虚拟机扩展的架构信息,请参阅适用于 Linux 扩展的 Azure 磁盘加密一文。
重要
启用 Azure 磁盘加密之前,必须在其外部创建基于托管磁盘的 VM 实例的快照和/或备份。 可以通过门户或 Azure 备份创建托管磁盘的快照。 备份确保在加密过程中发生任何意外故障时可以使用恢复选项。 备份后,可以通过指定 -skipVmBackup 参数,使用 Set-AzVMDiskEncryptionExtension cmdlet 来加密托管磁盘。 在未创建备份且未指定此参数的情况下,对基于托管磁盘的 VM 使用 Set-AzVMDiskEncryptionExtension 命令会失败。
加密或禁用加密可能导致 VM 重新启动。
若要禁用加密,请参阅禁用加密和删除加密扩展。
通过安装并使用 Azure CLI 命令行工具,可以在加密的 VHD 上启用磁盘加密。 可以在本地计算机上安装 PowerShell,并在任何 PowerShell 会话中使用它。 若要在 Azure 中现有或正在运行的 Linux VM 上启用加密,请使用以下 CLI 命令:
使用 az vm encryption enable 命令在 Azure 中运行的虚拟机上启用加密。
加密正在运行的 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]验证磁盘是否已加密: 若要检查 VM 的加密状态,请运行 az vm encryption show 命令。
az vm encryption show --name "MySecureVM" --resource-group "MyVirtualMachineResourceGroup"
若要禁用加密,请参阅禁用加密和删除加密扩展。
对 Linux VM 上的数据磁盘使用 EncryptFormatAll 功能
EncryptFormatAll 参数可以减少加密 Linux 数据磁盘所需的时间。 满足特定条件的分区与当前文件系统一起格式化,然后重新装载回在命令执行前的位置。 如果想要排除某个符合条件的数据磁盘,可以在运行命令之前卸载该磁盘。
在此命令运行后,先前装载的所有驱动器都会被格式化,并在现在已空的驱动器之上启动加密层。 如果你选择这种方式,附加到 VM 的临时磁盘也会得到加密。 如果重置临时磁盘,该磁盘将重新格式化,并且 Azure 磁盘加密解决方案下次有机会为 VM 重新加密该磁盘。 加密资源磁盘后,Azure Linux 代理无法管理资源磁盘和启用交换文件,但你可以手动配置交换文件。
警告
如果 VM 的数据卷上存在所需的数据,则不应使用 EncryptFormatAll。 卸载磁盘可将其从加密项中排除。 首先应该在测试 VM 上试用 EncryptFormatAll,以了解功能参数及其影响,然后再尝试在生产 VM 上使用该参数。 EncryptFormatAll 选项会格式化数据磁盘,因此磁盘上的所有数据都会丢失。 在继续之前,请验证是否已正确卸载想要排除的磁盘。
如果在更新加密设置时设置此参数,可能会导致在实际加密之前重新启动。 在这种情况下,还需要从 fstab 文件中删除不想要格式化的磁盘。 同样,在启动加密操作之前,应将想要加密并格式化的分区添加到 fstab 文件。
EncryptFormatAll 条件
该参数会遍历并加密满足以下所有条件的所有分区:
- 不是根/OS/启动分区
- 尚未加密
- 不是 BEK 卷
- 不是 RAID 卷
- 不是 LVM 卷
- 已装载
加密组成 RAID 或 LVM 卷而不是 RAID 或 LVM 卷的磁盘。
使用 az vm encryption enable 命令在 Azure 中运行的虚拟机上启用加密。
使用 EncryptFormatAll 加密正在运行的 VM:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --volume-type "data" --encrypt-format-all
结合逻辑卷管理器 (LVM) 使用 EncryptFormatAll 参数
我们建议采用 LVM-on-crypt 设置。 有关加密配置上的 LVM 的详细说明,请参阅在 ADE 加密设备上配置 LVM 和 RAID。
通过客户加密的 VHD 和加密密钥新建的 VM
在此方案中,可以使用 PowerShell cmdlet 或 CLI 命令启用加密。
参考相同 Azure 磁盘加密脚本中的说明来准备可在 Azure 中使用的预加密映像。 创建映像后,可使用下一部分中的步骤创建加密的 Azure VM。
重要
启用 Azure 磁盘加密之前,必须在其外部创建基于托管磁盘的 VM 实例的快照和/或备份。 可以从门户创建托管磁盘的快照,也可以使用 Azure 备份。 备份确保在加密过程中发生任何意外故障时可以使用恢复选项。 备份后,可以通过指定 -skipVmBackup 参数,使用 Set-AzVMDiskEncryptionExtension cmdlet 来加密托管磁盘。 在未创建备份且未指定此参数的情况下,对基于托管磁盘的 VM 使用 Set-AzVMDiskEncryptionExtension 命令会失败。
加密或禁用加密可能导致 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 -Linux -CreateOption "Attach" -DiskEncryptionKeyUrl "https://mytestvault.vault.azure.cn/secrets/Test1/514ceb769c984379a7e0230bddaaaaaa" -DiskEncryptionKeyVaultId "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myresourcegroup/providers/Microsoft.KeyVault/vaults/mytestvault"
New-AzVM -VM $VirtualMachine -ResourceGroupName "MyVirtualMachineResourceGroup"
在新添加的数据磁盘上启用加密
可以使用 az vm disk attach 或通过 Azure 门户添加新数据磁盘。 在加密之前,需要先装载新附加的数据磁盘。 必须请求加密数据驱动器,因为加密正在进行时,该驱动器不可用。
如果 VM 先前使用“All”进行加密,则 --volume-type 参数应保留为“All”。 All 包括 OS 和数据磁盘。 如果 VM 先前使用卷类型“OS”进行加密,则应将 --volume-type 参数更改为“All”,以便包含 OS 和新数据磁盘。 如果 VM 仅使用卷类型“Data”进行加密,则它可以保留为“Data”,如下所示。 添加新数据磁盘并将其附加到 VM 并不足以为加密做准备。 在启用加密之前,还必须格式化新附加的磁盘并将其正确装载在 VM 中。 在 Linux 上,磁盘必须使用永久性块设备名称装载在 /etc/fstab 中。
与 Powershell 语法相反,在启用加密时,CLI 不要求用户提供唯一的序列版本。 CLI 自动生成并使用自己唯一的序列版本值。
加密正在运行的 VM 的数据卷:
az vm encryption enable --resource-group "MyVirtualMachineResourceGroup" --name "MySecureVM" --disk-encryption-keyvault "MySecureVault" --volume-type "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 "Data"
禁用加密并删除加密扩展
你可以禁用 Azure 磁盘加密扩展,也可以删除 Azure 磁盘加密扩展。 这是两个不同的操作。
若要删除 ADE,建议先禁用加密,然后删除扩展。 如果删除加密扩展而非禁用,磁盘仍将加密。 如果在删除扩展后禁用加密,则扩展将重新安装(以执行解密操作),并且需要再次删除。
警告
如果 OS 磁盘已加密,你无法禁用加密。 (当原始加密操作指定 volumeType=ALL 或 volumeType=OS 时,OS 磁盘已加密。)
只有在加密数据磁盘但未加密 OS 磁盘时,禁用加密才有效。
禁用加密功能
可以使用 Azure PowerShell、Azure CLI 或资源管理器模板禁用加密。 禁用加密不会删除扩展(请参阅删除加密扩展)。
使用 Azure PowerShell 禁用磁盘加密: 若要禁用加密,请使用 Disable-AzVMDiskEncryption cmdlet。
Disable-AzVMDiskEncryption -ResourceGroupName "MyVirtualMachineResourceGroup" -VMName "MySecureVM" -VolumeType "data"
使用 Azure CLI 禁用加密: 若要禁用加密,请使用 az vm encryption disable 命令。
az vm encryption disable --name "MySecureVM" --resource-group "MyVirtualMachineResourceGroup" --volume-type "data"
使用资源管理器模板禁用加密:
- 单击在正在运行的 Linux VM 模板上“禁用磁盘加密中的“部署到 Azure”。
- 选择订阅、资源组、位置、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 "AzureDiskEncryptionForLinux"