使用 Azure CLI 对虚拟机规模集中的 OS 和附加数据磁盘进行加密

Azure CLI 用于从命令行或脚本创建和管理 Azure 资源。 本快速入门展示了如何使用 Azure CLI 创建和加密虚拟机规模集。 若要详细了解如何将 Azure 磁盘加密应用于虚拟机规模集,请参阅适用于虚拟机规模集的 Azure 磁盘加密

先决条件

  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

  • 本文需要 Azure CLI 版本 2.0.31 或更高版本。

创建规模集

使用 az group create 创建资源组,才能创建规模集。 以下示例在“chinanorth2”位置创建名为“myResourceGroup”的资源组:

az group create --name myResourceGroup --location chinanorth2

现在,使用 az vmss create 创建虚拟机规模集。 以下示例创建名为 myScaleSet 的规模集,该规模集设置为在应用更改时自动更新;如果 ~/.ssh/id_rsa 中没有 SSH 密钥,此示例还会生成 SSH 密钥。 每个 VM 实例附有 32Gb 的数据磁盘,可使用 Azure 自定义脚本扩展通过 az vmss extension set 准备数据磁盘:

重要

确保选择 ADE 支持的操作系统。 ADE 支持的操作系统

# Create a scale set with attached data disk
az vmss create \
  --resource-group myResourceGroup \
  --name myScaleSet \
  --orchestration-mode Flexible \
  --image <SKU Linux Image> \
  --admin-username azureuser \
  --generate-ssh-keys \
  --data-disk-sizes-gb 32

# Prepare the data disk for use with the Custom Script Extension
az vmss extension set \
  --publisher Microsoft.Azure.Extensions \
  --version 2.0 \
  --name CustomScript \
  --resource-group myResourceGroup \
  --vmss-name myScaleSet \
  --settings '{"fileUris":["https://raw.githubusercontent.com/Azure-Samples/compute-automation-configurations/master/prepare_vm_disks.sh"],"commandToExecute":"./prepare_vm_disks.sh"}'

创建和配置所有的规模集资源和 VM 需要几分钟时间。

创建 Azure Key Vault(针对磁盘加密启用)

Azure 密钥保管库可以存储能够在应用程序和服务中安全实现的密钥、机密或密码。 使用软件保护将加密密钥存储在 Azure Key Vault 中,或者,可在已获得经过 FIPS 140 验证的标准认证的硬件安全模块 (HSM) 中导入或生成密钥。 这些加密密钥用于加密和解密附加到 VM 的虚拟磁盘。 可以控制这些加密密钥,以及审核对它们的使用。

定义自己的唯一 keyvault_name。 然后,在规模集所在的同一订阅和区域中,通过 az keyvault create 创建 KeyVault,并设置 --enabled-for-disk-encryption 访问策略。

# Provide your own unique Key Vault name
keyvault_name=myuniquekeyvaultname

# Create Key Vault
az keyvault create --resource-group myResourceGroup --name $keyvault_name --enabled-for-disk-encryption

使用现有的密钥保管库

仅当你要将现有的 Key Vault 用于磁盘加密时,才需要执行此步骤。 如果在上一部分中创建了 Key Vault,请跳过此步骤。

定义自己的唯一 keyvault_name。 然后,通过 az keyvault update 更新 KeyVault 并设置 --enabled-for-disk-encryption 访问策略。

# Provide your own unique Key Vault name
keyvault_name=myuniquekeyvaultname

# Create Key Vault
az keyvault update --name $keyvault_name --enabled-for-disk-encryption

启用加密功能

注意

如果在灵活编排模式下使用虚拟机规模集,则只有新实例才会被加密。 规模集中的现有实例需要单独加密或者删除和替换。

若要加密规模集中的 VM 实例,请先使用 az keyvault show 获取有关 Key Vault 资源 ID 的信息。 然后,通过 az vmss encryption enable 使用这些变量启动加密过程:

# Get the resource ID of the Key Vault
vaultResourceId=$(az keyvault show --resource-group myResourceGroup --name $keyvault_name --query id -o tsv)

# Enable encryption of the data disks in a scale set
az vmss encryption enable \
    --resource-group myResourceGroup \
    --name myScaleSet \
    --disk-encryption-keyvault $vaultResourceId \
    --volume-type DATA

启动加密过程可能需要一到两分钟时间。

因为之前步骤中创建的规模集上的升级策略设置为自动,所以 VM 实例将自动启动加密过程。 在升级策略设为手动的规模集上,通过 az vmss update-instances 在 VM 实例上启动加密策略。

使用 KEK 包装密钥以实现加密

加密虚拟机规模集时,还可以使用密钥加密密钥来增强安全性。

# Get the resource ID of the Key Vault
vaultResourceId=$(az keyvault show --resource-group myResourceGroup --name $keyvault_name --query id -o tsv)

# Enable encryption of the data disks in a scale set
az vmss encryption enable \
    --resource-group myResourceGroup \
    --name myScaleSet \
    --disk-encryption-keyvault $vaultResourceId \
    --key-encryption-key myKEK \
    --key-encryption-keyvault $vaultResourceId \
    --volume-type 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]

查看加密进度

若要检查磁盘加密状态,请使用 az vmss encryption show

az vmss encryption show --resource-group myResourceGroup --name myScaleSet

加密 VM 实例后,状态代码将报告 EncryptionState/encrypted,如下面的示例输出所示:

[
  {
    "disks": [
      {
        "encryptionSettings": null,
        "name": "myScaleSet_myScaleSet_0_disk2_3f39c2019b174218b98b3dfae3424e69",
        "statuses": [
          {
            "additionalProperties": {},
            "code": "EncryptionState/encrypted",
            "displayStatus": "Encryption is enabled on disk",
            "level": "Info",
            "message": null,
            "time": null
          }
        ]
      }
    ],
    "id": "/subscriptions/guid/resourceGroups/MYRESOURCEGROUP/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/virtualMachines/0",
    "resourceGroup": "MYRESOURCEGROUP"
  }
]

禁用加密功能

如果不再想要使用加密的 VM 实例磁盘,可以使用 az vmss encryption disable 禁用加密,如下所示:

az vmss encryption disable --resource-group myResourceGroup --name myScaleSet

后续步骤

  • 在本文中,你使用了 Azure CLI 来加密虚拟机规模集。 还可以使用 Azure PowerShellAzure 资源管理器模板
  • 如果希望在预配另一个扩展后应用 Azure 磁盘加密,可以使用扩展排序
  • 可查看此处,了解针对 Linux 规模集数据磁盘加密的端到端批处理文件示例。 此示例创建一个资源组(Linux 规模集),装载一个 5 GB 的数据磁盘,并对虚拟机规模集进行加密。