练习 - 对现有的 VM 磁盘进行加密

已完成

假设你正在为新的创业公司开发一款财务管理应用。 你想要确保客户的所有数据都受到保护。 因此,你决定在托管此应用的服务器上的所有操作系统和数据磁盘上实现 Azure 磁盘加密 (ADE)。 根据符合性要求,你还需要负责自己的加密密钥管理。

在本单元中,你将加密现有虚拟机 (VM) 上的磁盘,并使用自己的 Azure 密钥保管库来管理加密密钥。

准备环境

首先,在 Azure VM 中部署新 Windows VM。

部署 Windows VM

若要创建和部署新的 Windows VM,请使用右侧的 Azure PowerShell 窗口。

  1. 若要保存所选位置,请定义一个 PowerShell 变量。 请使用与资源组相同的区域。

    $location = (Get-AzResourceGroup -name <rgn>[sandbox Resource Group]</rgn>).location
    

    提示

    可以使用“复制”按钮将命令复制到剪贴板。 要粘贴,请右键单击 Cloud Shell 终端中的新行,然后选择“粘贴”,或使用 Shift+Insert 键盘快捷方式(在 macOS 上为 ⌘+V)。

  2. 接下来,再定义几个便捷变量来捕获 VM 和资源组的名称。 此处使用的是预创建的资源组。 通常,你将使用 New-AzResourceGroup 在订阅中创建新的资源组。

    $vmName = "fmdata-vm01"
    $rgName = "<rgn>[sandbox Resource Group]</rgn>"
    
  3. 若要创建新的 VM,请使用 New-AzVm

    New-AzVm `
        -ResourceGroupName $rgName `
        -Name $vmName `
        -Location $location `
        -OpenPorts 3389
    

    当 Cloud Shell 提示你时,请为 VM 输入一个用户名和密码。 此信息将用作为 VM 创建的初始帐户。

    注意

    此命令将使用一些默认值,因为我们未提供多个选项。 具体而言,它会创建一个 Windows 2016 Server 映像,并将大小设置为 Standard_DS1_v2。 请记住,如果你决定指定 VM 大小,则基本层 VM 不支持 ADE。

  4. VM 完成部署后,在变量中捕获 VM 详细信息。 可以使用此变量来浏览已创建的内容。

    $vm = Get-AzVM -Name $vmName -ResourceGroupName $rgName
    
  5. 你可以使用以下代码确认挂接到 VM 的操作系统磁盘:

    $vm.StorageProfile.OSDisk
    
    OsType                  : Windows
    EncryptionSettings      :
    Name                    : fmdata-vm01_OsDisk_1_6bcf8dcd49794aa785bad45221ec4433
    Vhd                     :
    Image                   :
    Caching                 : ReadWrite
    WriteAcceleratorEnabled :
    CreateOption            : FromImage
    DiskSizeGB              : 127
    ManagedDisk             : Microsoft.Azure.Management.Compute.Models.ManagedDiskP
                              arameters
    
  6. 检查 OS 磁盘(和任何数据磁盘)上的当前加密状态。

    Get-AzVmDiskEncryptionStatus  `
        -ResourceGroupName $rgName `
        -VMName $vmName
    

    请注意,磁盘当前未加密

    OsVolumeEncrypted          : NotEncrypted
    DataVolumesEncrypted       : NotEncrypted
    OsVolumeEncryptionSettings :
    ProgressMessage            : No Encryption extension or metadata found on the VM
    

让我们改变这点。

使用 Azure 磁盘加密来加密 VM 磁盘

我们需要保护此数据,因此让我们加密磁盘。 回顾前面的课程,我们需要执行几个步骤:

  1. 创建一个 Key Vault。

  2. 将密钥保管库设置为支持磁盘加密。

  3. 指示 Azure 使用密钥保管库中存储的密钥加密 VM 磁盘。

提示

我们将单独演练每个步骤,但在自己的订阅中执行此任务时,可以使用本模块的“摘要”部分中链接的便捷 PowerShell 脚本。

创建 Key Vault

若要创建 Azure Key Vault,需在订阅中启用该服务。 你只需要启用该服务一次。

提示

根据所用的订阅,可能需要使用 Register-AzResourceProvider cmdlet 启用 Microsoft.KeyVault 提供程序。 在 Azure 沙盒订阅中无需执行此操作。

  1. 指定新 Key Vault 的名称。 该名称必须唯一,可以包含 3 到 24 个字符,由数字、字母和短划线组成。 尝试在末尾添加一些随机数字,并替换下面的“1234”:

    $keyVaultName = "mvmdsk-kv-1234"
    
  2. 使用 New-AzKeyVault 创建 Azure 密钥保管库:

    • 请确保将其放置在与 VM 相同的资源组和位置。
    • 启用用于磁盘加密的密钥保管库。
    • 指定唯一的密钥保管库名称。
    New-AzKeyVault -VaultName $keyVaultName `
        -Location $location `
        -ResourceGroupName $rgName `
        -EnabledForDiskEncryption
    

    您会在运行该命令后收到一条警告消息,提示没有用户拥有访问权限。

    WARNING: Access policy is not set. No user or app have access permission to use this vault. This warning can occur if the vault was created by a service principal. To set access policies, use Set-AzKeyVaultAccessPolicy.
    

    这没关系,因为你只是使用该保管库来存储 VM 的加密密钥,而用户无需访问这些数据。

加密磁盘

你几乎已经准备好开始加密磁盘了。 开始之前,会出现有关创建备份的警告。

重要

如果这是一个生产系统,则需要使用 Azure 备份或通过创建快照来执行托管磁盘备份。 可以通过 Azure 门户或命令行创建快照。 在 PowerShell 中,则需要使用 New-AzSnapshot cmdlet。 由于这是一个简单的练习,并且你将在完成后丢弃这些数据,因此请跳过此步骤。

  1. 若要保存密钥保管库信息,请定义一个变量:

    $keyVault = Get-AzKeyVault `
        -VaultName $keyVaultName `
        -ResourceGroupName $rgName
    
  2. 接下来,要加密 VM 磁盘,请运行 Set-AzVmDiskEncryptionExtension cmdlet。

    • 使用 VolumeType 参数可以指定要加密的磁盘:[所有 | OS | 数据]。 默认值为 All。 只能为某些 Linux 分发版加密数据磁盘。
    • 如果没有快照,可为托管磁盘提供 SkipVmBackup 标志。
    Set-AzVmDiskEncryptionExtension `
        -ResourceGroupName $rgName `
        -VMName $vmName `
        -VolumeType All `
        -DiskEncryptionKeyVaultId $keyVault.ResourceId `
        -DiskEncryptionKeyVaultUrl $keyVault.VaultUri `
        -SkipVmBackup
    
  3. 该 cmdlet 会发出警告,提示 VM 必须脱机,且任务可能需要几分钟才能完成。 请继续操作:

    Enable AzureDiskEncryption on the VM
    This cmdlet prepares the VM and enables encryption which may reboot the machine and takes 10-15 minutes to
    finish. Please save your work on the VM before confirming. Do you want to continue?
    [Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y
    
  4. Cmdlet 运行完成后,再次检查加密状态:

    Get-AzVmDiskEncryptionStatus  -ResourceGroupName $rgName -VMName $vmName
    

    OS 磁盘现在应已加密。 对 Windows 可见的任何附加数据磁盘也将被加密。

    OsVolumeEncrypted          : Encrypted
    DataVolumesEncrypted       : NoDiskFound
    OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
    ProgressMessage            : Provisioning succeeded
    

注意

加密后添加的新磁盘不会自动加密。 可以重新运行 Set-AzVMDiskEncryptionExtension cmdlet 来加密新磁盘。 如果将磁盘添加到已加密磁盘的 VM,请务必按顺序提供新编号。 此外,不会对操作系统可见的磁盘进行加密。 磁盘必须正确分区、格式化和装载,BitLocker 扩展才能看到该磁盘。