使用 Azure CLI,通过客户管理的密钥为托管磁盘启用服务器端加密

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

Azure 磁盘存储使你能在对托管磁盘使用服务器端加密 (SSE) 时管理自己的密钥(如果你选择)。 有关使用客户管理的密钥的 SSE 以及其他托管磁盘加密类型的概念信息,请参阅磁盘加密文章的客户管理的密钥部分。

限制

目前,客户托管密钥具有以下限制:

  • 如果为具有增量快照的磁盘启用了此功能,则不能在该磁盘或其快照上禁用此功能。 要解决此问题,请将所有数据复制到完全不同的、不使用客户管理的密钥的托管磁盘。 可以使用 Azure CLIAzure PowerShell 模块执行此操作。

  • 磁盘及其关联的所有增量快照都必须具有相同的磁盘加密集。

  • 仅支持大小为 2048 位、3,072 位和 4,096 位的软件密钥,不支持其他密钥或其他大小。

  • 仅适用于超级磁盘和高级 SSD v2 磁盘:

    • 基于使用服务器端加密和客户管理的密钥加密的快照创建的磁盘必须使用同一磁盘加密集进行加密。
    • 使用客户管理的密钥加密的超级磁盘和高级 SSD v2 磁盘不支持用户分配的托管标识。
    • 目前不支持使用在其他 Microsoft Entra ID 租户中存储的 Azure 密钥保管库,通过客户管理的密钥加密超级磁盘和高级 SSD v2 磁盘。
  • 与客户管理的密钥相关的大部分资源(磁盘加密集、VM、磁盘和快照)都必须位于同一订阅和区域中。

  • Azure 密钥保管库可以在不同的订阅中使用,但必须与磁盘加密集位于同一区域中。

  • 使用客户管理的密钥加密的磁盘只能移动到另一个资源组(如果附加到的 VM 已解除分配)。

  • 无法在不同订阅间移动使用客户管理的密钥加密的磁盘、快照和映像。

  • 当前或以前使用 Azure 磁盘加密加密的托管磁盘不能使用客户管理的密钥进行加密。

  • 每个区域、每个订阅最多只能创建 5000 个磁盘加密集。

  • 有关将客户托管密钥与共享映像库结合使用的信息,请参阅预览版:使用客户托管密钥加密映像

创建资源

启用此功能后,需要设置 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=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 Key Vault 托管的 HSM

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

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

Configuration

创建托管 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,并使用客户托管密钥加密 OS 和数据磁盘

rgName=yourResourceGroupName
vmName=yourVMName
location=chinanorth2
vmSize=Standard_DS3_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 --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,以便可以使用以下脚本加密这些磁盘:

rgName=yourResourceGroupName
diskName=yourDiskName
diskEncryptionSetName=yourDiskEncryptionSetName

az disk update -n $diskName -g $rgName --encryption-type EncryptionAtRestWithCustomerKey --disk-encryption-set $diskEncryptionSetId

使用市场映像创建虚拟机规模集,并使用客户托管密钥加密 OS 和数据磁盘

rgName=yourResourceGroupName
vmssName=yourVMSSName
location=chinanorth2
vmSize=Standard_DS3_V2
image=LinuxImageURN
diskEncryptionSetName=yourDiskencryptionSetName

diskEncryptionSetId=$(az disk-encryption-set show -n $diskEncryptionSetName -g $rgName --query [id] -o tsv)
az vmss create -g $rgName -n $vmssName --image $image --upgrade-policy automatic --admin-username azureuser --generate-ssh-keys --os-disk-encryption-set $diskEncryptionSetId --data-disk-sizes-gb 64 128 --data-disk-encryption-sets $diskEncryptionSetId $diskEncryptionSetId

创建一个使用客户托管密钥的服务器端加密进行了加密的空磁盘,并将其附加到 VM

vmName=yourVMName
rgName=yourResourceGroupName
diskName=yourDiskName
diskSkuName=Premium_LRS
diskSizeinGiB=30
location=chinanorth2
diskLUN=2
diskEncryptionSetName=yourDiskEncryptionSetName


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

az disk create -n $diskName -g $rgName -l $location --encryption-type EncryptionAtRestWithCustomerKey --disk-encryption-set $diskEncryptionSetId --size-gb $diskSizeinGiB --sku $diskSkuName

diskId=$(az disk show -n $diskName -g $rgName --query [id] -o tsv)

az vm disk attach --vm-name $vmName --lun $diskLUN --ids $diskId

更改 DiskEncryptionSet 的密钥,以轮替引用 DiskEncryptionSet 的所有资源的密钥


rgName=yourResourceGroupName
keyVaultName=yourKeyVaultName
keyName=yourKeyName
diskEncryptionSetName=yourDiskEncryptionSetName


keyVaultId=$(az keyvault show --name $keyVaultName--query [id] -o tsv)

keyVaultKeyUrl=$(az keyvault key show --vault-name $keyVaultName --name $keyName --query [key.kid] -o tsv)

az disk-encryption-set update -n keyrotationdes -g keyrotationtesting --key-url $keyVaultKeyUrl --source-vault $keyVaultId

查找磁盘的服务器端加密状态

az disk show -g yourResourceGroupName -n yourDiskName --query [encryption.type] -o tsv

重要

客户管理的密钥依赖于 Azure 资源的托管标识,后者是 Microsoft Entra ID 的一项功能。 配置客户托管密钥时,实际上会自动将托管标识分配给你的资源。 如果随后在两个 Microsoft Entra 目录之间移动订阅、资源组或托管磁盘,则与托管磁盘关联的托管标识不会转移到新租户,因此客户管理的密钥可能不再有效。 有关详细信息,请参阅在 Microsoft Entra 目录之间转移订阅

后续步骤