你当前正在访问 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 Vault 或 Azure Key Vault 托管 HSM。
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 来处理密钥。
为此,必须完成以下先决条件:
- 安装最新的 Azure CLI 并使用 az login 登录到 Azure 帐户。
- 创建和配置托管 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
}
}
}
后续步骤
创建并配置这些资源之后,可以使用它们来保护托管磁盘。 以下链接包含示例脚本,每个脚本都有各自的方案,可用于保护托管磁盘。