使用 Azure CLI 启用主机级别加密的端到端加密

适用对象:✔️ Linux VM ✔️ 灵活规模集

启用主机加密时,存储在 VM 主机上的数据将静态加密,且已加密的数据将流向存储服务。 有关主机加密和其他托管磁盘加密类型的概念性信息,请参阅主机加密 - VM 数据的端到端加密

Restrictions

  • 无法在当前启用过或曾经启用过 Azure 磁盘加密的虚拟机 (VM) 或虚拟机规模集上启用。
  • 无法在启用了主机加密的磁盘上启用 Azure 磁盘加密。
  • 可以在现有的虚拟机规模集上启用加密。 但是,只有启用加密后新建的 VM 才会自动加密。
  • 现有 VM 只有在经过释放和重新分配后才能加密。

以下限制仅适用于超级磁盘和高级 SSD v2:

  • 使用 512e 扇区大小的磁盘需要在 2023 年 5 月 13 日之后创建。
    • 如果磁盘在此日期之前创建, 请创建磁盘快照,并使用快照创建新磁盘。

支持的 VM 大小

可以通过编程方式拉取受支持的 VM 大小的完整列表。 若要了解如何以编程方式检索它们,请参阅“ 查找支持的 VM 大小 ”部分。 升级 VM 大小会导致验证,以检查新 VM 大小是否支持 EncryptionAtHost 功能。

先决条件

必须先为订阅启用该功能,然后才能对 VM/VMSS 使用 EncryptionAtHost 属性。 使用以下步骤为订阅启用该功能:

  • 执行以下命令,为订阅注册此功能
az feature register --namespace Microsoft.Compute --name EncryptionAtHost
  • 在试用该功能之前,请使用以下命令检查注册状态是否已 注册 (需要几分钟)。
az feature show --namespace Microsoft.Compute --name EncryptionAtHost

创建资源

注释

本部分仅适用于具有客户管理的密钥的配置。 如果使用平台管理的密钥,可以跳到 “示例脚本 ”部分。

启用该功能后,需要设置 DiskEncryptionSet 和 Azure Key VaultAzure Key Vault 托管 HSM

Azure Key Vault

  • 使用 az login 安装最新的 Azure CLI 并登录到 Azure 帐户。
  • 创建 Azure Key Vault 和加密密钥。

创建 Key Vault 时,必须启用清除保护。 清除保护可确保在保留期失效之前,无法永久删除已删除的密钥。 这些设置可防止由于意外删除而丢失数据。 使用 Key Vault 加密托管磁盘时,这些设置是必需的。

重要

不要使用驼峰命名法来表示区域,如果这样做,在 Azure 门户中给资源分配额外磁盘时可能会遇到问题。

subscriptionId=yourSubscriptionID
rgName=yourResourceGroupName
location=chinaeast
keyVaultName=yourKeyVaultName
keyName=yourKeyName
diskEncryptionSetName=yourDiskEncryptionSetName
diskName=yourDiskName

az account set --subscription $subscriptionId

az group create --resource-group $rgName --location $location

az keyvault create -n $keyVaultName \
-g $rgName \
-l $location \
--enable-purge-protection true 

az keyvault key create --vault-name $keyVaultName \
-n $keyName \
--protection software
  • 创建 DiskEncryptionSet。 可以将 enable-auto-key-rotation 设置为 true 以启用密钥的自动轮换。 启用自动轮换时,系统会自动更新所有托管磁盘、快照和映像,以引用磁盘加密集的密钥新版本,并在一小时内完成。
keyVaultKeyUrl=$(az keyvault key show --vault-name $keyVaultName --name $keyName --query [key.kid] -o tsv)

az disk-encryption-set create -n $diskEncryptionSetName \
-l $location \
-g $rgName \
--key-url $keyVaultKeyUrl \
--enable-auto-key-rotation false
  • 授予 DiskEncryptionSet 资源对密钥保管库的访问权限。

注释

Azure 可能需要几分钟时间才能在 Microsoft Entra ID 中创建您的 DISKENCRYPTIONSET 的身份。 如果在运行以下命令时收到“找不到 Active Directory 对象”之类的错误,请等待几分钟,然后重试。

desIdentity=$(az disk-encryption-set show -n $diskEncryptionSetName -g $rgName --query [identity.principalId] -o tsv)

az keyvault set-policy -n $keyVaultName \
-g $rgName \
--object-id $desIdentity \
--key-permissions wrapkey unwrapkey get

Azure 密钥保管库托管 HSM

或者,可以使用托管 HSM 来处理密钥。

为此,必须完成以下先决条件:

配置

创建托管 HSM 并添加权限后,启用清除保护并创建加密密钥。

subscriptionId=yourSubscriptionID
rgName=yourResourceGroupName
location=chinaeast
keyVaultName=yourKeyVaultName
keyName=yourKeyName
diskEncryptionSetName=yourDiskEncryptionSetName
diskName=yourDiskName
    
az account set --subscription $subscriptionId
    
az keyvault update-hsm --subscription $subscriptionId -g $rgName --hsm-name $keyVaultName --enable-purge-protection true
    
az keyvault key create --hsm-name  $keyVaultName --name $keyName --ops wrapKey unwrapKey --kty RSA-HSM --size 2048

然后,创建 DiskEncryptionSet。

keyVaultKeyUrl=$(az keyvault key show --vault-name $keyVaultName --name $keyName --query [key.kid] -o tsv)
    
az disk-encryption-set create -n $diskEncryptionSetName \
-l $location \
-g $rgName \
--key-url $keyVaultKeyUrl \
--enable-auto-key-rotation false

最后,授予 DiskEncryptionSet 对托管 HSM 的访问权限。

desIdentity=$(az disk-encryption-set show -n $diskEncryptionSetName -g $rgName --query [identity.principalId] -o tsv)
    
az keyvault role assignment create --hsm-name $keyVaultName --role "Managed HSM Crypto Service Encryption User" --assignee $desIdentity --scope /keys

示例脚本

使用客户管理的密钥在主机上创建启用了加密的 VM

使用之前创建的 DiskEncryptionSet 的资源 URI 创建包含托管磁盘的 VM,以使用客户管理的密钥加密 OS 和数据磁盘的缓存。 临时磁盘使用平台管理的密钥进行加密。

rgName=yourRGName
vmName=yourVMName
location=chinanorth2
vmSize=Standard_DS2_v2
image=LinuxImageURN
diskEncryptionSetName=yourDiskEncryptionSetName

diskEncryptionSetId=$(az disk-encryption-set show -n $diskEncryptionSetName -g $rgName --query [id] -o tsv)

az vm create -g $rgName \
-n $vmName \
-l $location \
--encryption-at-host \
--image $image \
--size $vmSize \
--generate-ssh-keys \
--os-disk-encryption-set $diskEncryptionSetId \
--data-disk-sizes-gb 128 128 \
--data-disk-encryption-sets $diskEncryptionSetId $diskEncryptionSetId

使用平台管理的密钥在主机上创建启用了加密的 VM

创建启用了主机加密的 VM,以使用平台管理的密钥加密 OS/数据磁盘和临时磁盘的缓存。

rgName=yourRGName
vmName=yourVMName
location=chinanorth2
vmSize=Standard_DS2_v2
image=LinuxImageURN

az vm create -g $rgName \
-n $vmName \
-l $location \
--encryption-at-host \
--image $image \
--size $vmSize \
--generate-ssh-keys \
--data-disk-sizes-gb 128 128 \

更新 VM 以在主机上启用加密

rgName=yourRGName
vmName=yourVMName

az vm update -n $vmName \
-g $rgName \
--set securityProfile.encryptionAtHost=true

检查 VM 主机加密的状态

rgName=yourRGName
vmName=yourVMName

az vm show -n $vmName \
-g $rgName \
--query [securityProfile.encryptionAtHost] -o tsv

更新 VM 以在主机上禁用加密

要在主机上禁用加密,您必须先停止 VM 的分配。

rgName=yourRGName
vmName=yourVMName

az vm update -n $vmName \
-g $rgName \
--set securityProfile.encryptionAtHost=false

使用客户管理的密钥在主机上创建启用了加密的虚拟机规模集

使用之前创建的 DiskEncryptionSet 的资源 URI 创建包含托管磁盘的虚拟机规模集,以使用客户管理的密钥加密 OS 和数据磁盘的缓存。 临时磁盘使用平台管理的密钥进行加密。

重要

从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的 VM 规模集将默认为灵活业务流程模式(如果未指定业务流程模式)。 若要详细了解此更改以及需要采取的措施,请访问针对 VMSS PowerShell/CLI 客户的重大变更 - Microsoft 社区中心

rgName=yourRGName
vmssName=yourVMSSName
location=chinanorth2
vmSize=Standard_DS3_V2
image=Ubuntu2204
diskEncryptionSetName=yourDiskEncryptionSetName

diskEncryptionSetId=$(az disk-encryption-set show -n $diskEncryptionSetName -g $rgName --query [id] -o tsv)

az vmss create -g $rgName \
-n $vmssName \
--encryption-at-host \
--image $image \
--orchestration-mode flexible \
--admin-username azureuser \
--generate-ssh-keys \
--os-disk-encryption-set $diskEncryptionSetId \
--data-disk-sizes-gb 64 128 \
--data-disk-encryption-sets $diskEncryptionSetId $diskEncryptionSetId

使用平台管理的密钥在主机上启用加密创建虚拟机规模集

创建一个启用了主机加密的虚拟机规模集, 使用平台管理的密钥 对操作系统/数据磁盘的缓存和临时磁盘进行加密。

重要

从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的 VM 规模集将默认为灵活业务流程模式(如果未指定业务流程模式)。 若要详细了解此更改以及需要采取的措施,请访问针对 VMSS PowerShell/CLI 客户的重大变更 - Microsoft 社区中心

rgName=yourRGName
vmssName=yourVMSSName
location=chinanorth2
vmSize=Standard_DS3_V2
image=Ubuntu2204

az vmss create -g $rgName \
-n $vmssName \
--encryption-at-host \
--image $image \
--orchestration-mode flexible \
--admin-username azureuser \
--generate-ssh-keys \
--data-disk-sizes-gb 64 128 \

更新虚拟机规模集以在主机上启用加密

rgName=yourRGName
vmssName=yourVMName

az vmss update -n $vmssName \
-g $rgName \
--set virtualMachineProfile.securityProfile.encryptionAtHost=true

检查虚拟机规模集主机加密的状态

rgName=yourRGName
vmssName=yourVMName

az vmss show -n $vmssName \
-g $rgName \
--query [virtualMachineProfile.securityProfile.encryptionAtHost] -o tsv

更新虚拟机规模集以在主机上禁用加密

您可以在虚拟机规模集的主机上禁用加密,但这仅会影响在主机禁用加密后创建的 VM。 对于现有 VM,必须解除分配 VM, 在单个 VM 上的主机上禁用加密,然后重新分配 VM。

rgName=yourRGName
vmssName=yourVMName

az vmss update -n $vmssName \
-g $rgName \
--set virtualMachineProfile.securityProfile.encryptionAtHost=false

查找支持的 VM 大小

不支持“旧的 VM 大小”。 可以使用资源 SKU API 或 Azure CLI 找到支持的 VM 大小列表。

调用 资源 SKU API 时,请检查 EncryptionAtHostSupported 该功能是否设置为 True

    {
        "resourceType": "virtualMachines",
        "name": "Standard_DS1_v2",
        "tier": "Standard",
        "size": "DS1_v2",
        "family": "standardDSv2Family",
        "locations": [
        "chinanorth2"
        ],
        "capabilities": [
        {
            "name": "EncryptionAtHostSupported",
            "value": "True"
        }
        ]
    }

对于 Azure CLI,请使用 az vm image list-skus 命令。

location=chinanorth2

az vm list-skus --location $location --all \
--resource-type virtualMachines \
--query "[?capabilities[?name=='EncryptionAtHostSupported' && value=='True']].{VMName:name, EncryptionAtHost:capabilities[?name=='EncryptionAtHostSupported'].value | [0]}" \
--output table

后续步骤

创建并配置了这些资源后,可以使用它们来保护托管磁盘。 以下链接包含示例脚本,每个脚本都有相应的方案,可用于保护托管磁盘。

Azure 资源管理器模板示例