你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure CLI 通过主机加密来启用端到端加密

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

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

限制

  • 在 4k 扇区大小的 Ultra Disks 和高级 SSD v2 上受支持。
  • 对于 512e 扇区大小的 Ultra Disks 和高级 SSD v2,只有这些磁盘创建于 2023 年 5 月 13 日之后时,才支持此功能。
  • 无法在当前启用过或曾经启用过 Azure 磁盘加密的虚拟机 (VM) 或虚拟机规模集上启用。
  • 无法在启用了主机加密的磁盘上启用 Azure 磁盘加密。
  • 可以在现有的虚拟机规模集上启用加密。 但是,只有启用加密后新建的 VM 才会自动加密。
  • 现有 VM 只有在经过释放和重新分配后才能加密。

支持的 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

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

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

重要

不要对区域使用混合大小写,如果这样做,则在将其他磁盘分配到 Azure 门户中的资源时可能会遇到问题。

subscriptionId=yourSubscriptionID
rgName=yourResourceGroupName
location=westcentralus
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 Key Vault 托管的 HSM

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

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

Configuration

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

subscriptionId=yourSubscriptionID
rgName=yourResourceGroupName
location=westcentralus
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=eastus
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=eastus
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 解除分配,然后才能基于主机的加密。

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=westus2
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

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

创建一个虚拟机规模集,并启用主机加密,以便使用平台管理的密钥加密 OS/数据磁盘和临时磁盘的缓存。

重要

从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的 VM 规模集将默认为灵活业务流程模式(如果未指定业务流程模式)。 有关此更改以及应执行操作的详细信息,请转到 VMSS PowerShell/CLI 客户的中断性变更 - Microsoft 社区中心

rgName=yourRGName
vmssName=yourVMSSName
location=westus2
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

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

你可以在虚拟机规模集上禁用主机加密,但这只会影响在禁用主机加密之后创建的虚拟机。 对于现有虚拟机,必须先将虚拟机解除分配,在该虚拟机上禁用主机上的加密,然后才能重新分配虚拟机。

rgName=yourRGName
vmssName=yourVMName

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

找到支持的 VM 大小

不支持“旧的 VM 大小”。 可以通过使用资源 SKU API 或 Azure PowerShell 模块来查找支持的 VM 大小的列表。 使用 CLI 找不到支持的大小。

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

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

对于 Azure PowerShell 模块,请使用 Get-AzComputeResourceSku cmdlet。

$vmSizes=Get-AzComputeResourceSku | where{$_.ResourceType -eq 'virtualMachines' -and $_.Locations.Contains('CentralUSEUAP')}

foreach($vmSize in $vmSizes)
{
    foreach($capability in $vmSize.capabilities)
    {
        if($capability.Name -eq 'EncryptionAtHostSupported' -and $capability.Value -eq 'true')
        {
            $vmSize

        }

    }
}

后续步骤

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

Azure 资源管理器模板示例