Azure PowerShell - 使用客户管理的密钥进行服务器端加密 - 托管磁盘

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

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

限制

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

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

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

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

    • 从使用服务器端加密和客户托管密钥加密的磁盘创建的快照必须使用相同的客户托管密钥进行加密。
    • 使用客户管理的密钥加密的超级磁盘和高级 SSD v2 磁盘不支持用户分配的托管标识。
  • 与客户管理的密钥相关的大部分资源(磁盘加密集、VM、磁盘和快照)都必须位于同一订阅和区域中。

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

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

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

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

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

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

在有自动密钥轮换的情况下选择性设置 Azure Key Vault DiskEncryptionSet

若要使用客户管理的密钥进行 SSE,必须设置 Azure Key Vault 和 DiskEncryptionSet 资源。

  1. 请确保已安装最新的 Azure PowerShell 版本,并已使用 Connect-AzAccount -Environment AzureChinaCloud 登录到 Azure 帐户

  2. 创建 Azure Key Vault 和加密密钥的实例。

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

    $ResourceGroupName="yourResourceGroupName"
    $LocationName="chinaeast"
    $keyVaultName="yourKeyVaultName"
    $keyName="yourKeyName"
    $keyDestination="Software"
    $diskEncryptionSetName="yourDiskEncryptionSetName"
    
    $keyVault = New-AzKeyVault -Name $keyVaultName `
    -ResourceGroupName $ResourceGroupName `
    -Location $LocationName `
    -EnablePurgeProtection
    
    $key = Add-AzKeyVaultKey -VaultName $keyVaultName `
        -Name $keyName `
        -Destination $keyDestination
    
  3. 创建一个 DiskEncryptionSet 实例。 可以将 RotationToLatestKeyVersionEnabled 设置为等于 $true 以启用密钥的自动轮换。 启用自动轮换后,系统将自动更新引用该磁盘加密集的所有托管磁盘、快照和映像,以便在一小时内使用新版本密钥。

    $desConfig=New-AzDiskEncryptionSetConfig -Location $LocationName `
        -SourceVaultId $keyVault.ResourceId `
        -KeyUrl $key.Key.Kid `
        -IdentityType SystemAssigned `
        -RotationToLatestKeyVersionEnabled $false
    
    $des=New-AzDiskEncryptionSet -Name $diskEncryptionSetName `
        -ResourceGroupName $ResourceGroupName `
        -InputObject $desConfig 
    
  4. 授予对密钥保管库的 DiskEncryptionSet 资源访问权限。

    注意

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

    Set-AzKeyVaultAccessPolicy -VaultName $keyVaultName -ObjectId $des.Identity.PrincipalId -PermissionsToKeys wrapkey,unwrapkey,get
    

在不同的订阅中使用密钥保管库

或者,可以从单个订阅集中管理 Azure Key Vault,并使用 Key Vault 中存储的密钥来加密组织的其他订阅中的托管磁盘和快照。 这样,安全团队就可以对单个订阅强制实施和轻松管理可靠的安全策略。

重要

对于此配置,Key Vault 和磁盘加密集必须位于同一区域并使用同一租户。

下面的脚本是一个示例,说明如何配置磁盘加密集以使用来自不同订阅但相同区域的 Key Vault 的密钥:

$sourceSubscriptionId="<sourceSubID>"
$sourceKeyVaultName="<sourceKVName>"
$sourceKeyName="<sourceKeyName>"

$targetSubscriptionId="<targetSubID>"
$targetResourceGroupName="<targetRGName>"
$targetDiskEncryptionSetName="<targetDiskEncSetName>"
$location="<targetRegion>"

Set-AzContext -Subscription $sourceSubscriptionId

$key = Get-AzKeyVaultKey -VaultName $sourceKeyVaultName -Name $sourceKeyName

Set-AzContext -Subscription $targetSubscriptionId

$desConfig=New-AzDiskEncryptionSetConfig -Location $location `
-KeyUrl $key.Key.Kid `
-IdentityType SystemAssigned `
-RotationToLatestKeyVersionEnabled $false

$des=New-AzDiskEncryptionSet -Name $targetDiskEncryptionSetName `
-ResourceGroupName $targetResourceGroupName `
-InputObject $desConfig

示例

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

使用市场映像创建 VM,并使用客户托管密钥加密 OS 和数据磁盘

复制该脚本,将所有示例值替换为你自己的参数,然后运行该脚本。

$VMLocalAdminUser = "yourVMLocalAdminUserName"
$VMLocalAdminSecurePassword = ConvertTo-SecureString <password> -AsPlainText -Force
$LocationName = "yourRegion"
$ResourceGroupName = "yourResourceGroupName"
$ComputerName = "yourComputerName"
$VMName = "yourVMName"
$VMSize = "yourVMSize"
$diskEncryptionSetName="yourdiskEncryptionSetName"

$NetworkName = "yourNetworkName"
$NICName = "yourNICName"
$SubnetName = "yourSubnetName"
$SubnetAddressPrefix = "10.0.0.0/24"
$VnetAddressPrefix = "10.0.0.0/16"

$SingleSubnet = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $SubnetAddressPrefix
$Vnet = New-AzVirtualNetwork -Name $NetworkName -ResourceGroupName $ResourceGroupName -Location $LocationName -AddressPrefix $VnetAddressPrefix -Subnet $SingleSubnet
$NIC = New-AzNetworkInterface -Name $NICName -ResourceGroupName $ResourceGroupName -Location $LocationName -SubnetId $Vnet.Subnets[0].Id

$Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword);

$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName $ComputerName -Credential $Credential -ProvisionVMAgent -EnableAutoUpdate
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC.Id
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName 'MicrosoftWindowsServer' -Offer 'WindowsServer' -Skus '2012-R2-Datacenter' -Version latest

$diskEncryptionSet=Get-AzDiskEncryptionSet -ResourceGroupName $ResourceGroupName -Name $diskEncryptionSetName

$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name $($VMName +"_OSDisk") -DiskEncryptionSetId $diskEncryptionSet.Id -CreateOption FromImage

$VirtualMachine = Add-AzVMDataDisk -VM $VirtualMachine -Name $($VMName +"DataDisk1") -DiskSizeInGB 128 -StorageAccountType Premium_LRS -CreateOption Empty -Lun 0 -DiskEncryptionSetId $diskEncryptionSet.Id 

New-AzVM -ResourceGroupName $ResourceGroupName -Location $LocationName -VM $VirtualMachine -Verbose

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

复制该脚本,将所有示例值替换为你自己的参数,然后运行该脚本。

$vmName = "yourVMName"
$LocationName = "chinaeast"
$ResourceGroupName = "yourResourceGroupName"
$diskName = "yourDiskName"
$diskSKU = "Premium_LRS"
$diskSizeinGiB = 30
$diskLUN = 1
$diskEncryptionSetName="yourDiskEncryptionSetName"


$vm = Get-AzVM -Name $vmName -ResourceGroupName $ResourceGroupName 

$diskEncryptionSet=Get-AzDiskEncryptionSet -ResourceGroupName $ResourceGroupName -Name $diskEncryptionSetName

$vm = Add-AzVMDataDisk -VM $vm -Name $diskName -CreateOption Empty -DiskSizeInGB $diskSizeinGiB -StorageAccountType $diskSKU -Lun $diskLUN -DiskEncryptionSetId $diskEncryptionSet.Id 

Update-AzVM -ResourceGroupName $ResourceGroupName -VM $vm

加密现有托管磁盘

不得将现有磁盘附加到正在运行的 VM,以便可以使用以下脚本加密这些磁盘:

$rgName = "yourResourceGroupName"
$diskName = "yourDiskName"
$diskEncryptionSetName = "yourDiskEncryptionSetName"

$diskEncryptionSet = Get-AzDiskEncryptionSet -ResourceGroupName $rgName -Name $diskEncryptionSetName

New-AzDiskUpdateConfig -EncryptionType "EncryptionAtRestWithCustomerKey" -DiskEncryptionSetId $diskEncryptionSet.Id | Update-AzDisk -ResourceGroupName $rgName -DiskName $diskName

使用 SSE 和客户管理的密钥来加密现有的虚拟机规模集(统一业务流程模式)

此脚本只在统一业务流程模式下对规模集有效。 对于在灵活业务流程模式下的规模集,请按“加密每个 VM 现有的托管磁盘”中的说明操作。

复制该脚本,将所有示例值替换为自己的参数,然后运行该脚本:

#set variables 
$vmssname = "name of the vmss that is already created"
$diskencryptionsetname = "name of the diskencryptionset already created"
$vmssrgname = "vmss resourcegroup name"
$diskencryptionsetrgname = "diskencryptionset resourcegroup name"

#get vmss object and create diskencryptionset object attach to vmss os disk
$ssevmss = get-azvmss -ResourceGroupName $vmssrgname -VMScaleSetName $vmssname
$ssevmss.VirtualMachineProfile.StorageProfile.OsDisk.ManagedDisk.DiskEncryptionSet = New-Object -TypeName Microsoft.Azure.Management.Compute.Models.DiskEncryptionSetParameters

#get diskencryption object and retrieve the resource id
$des = Get-AzDiskEncryptionSet -ResourceGroupName $diskencryptionsetrgname -Name $diskencryptionsetname
write-host "the diskencryptionset resource id is:" $des.Id

#associate DES resource id to os disk and update vmss 
$ssevmss.VirtualMachineProfile.StorageProfile.OsDisk.ManagedDisk.DiskEncryptionSet.id = $des.Id
$ssevmss | update-azvmss

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

复制该脚本,将所有示例值替换为你自己的参数,然后运行该脚本。

重要

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

$VMLocalAdminUser = "yourLocalAdminUser"
$VMLocalAdminSecurePassword = ConvertTo-SecureString Password@123 -AsPlainText -Force
$LocationName = "chinaeast"
$ResourceGroupName = "yourResourceGroupName"
$ComputerNamePrefix = "yourComputerNamePrefix"
$VMScaleSetName = "yourVMSSName"
$VMSize = "Standard_DS3_v2"
$diskEncryptionSetName="yourDiskEncryptionSetName"

$NetworkName = "yourVNETName"
$SubnetName = "yourSubnetName"
$SubnetAddressPrefix = "10.0.0.0/24"
$VnetAddressPrefix = "10.0.0.0/16"

$SingleSubnet = New-AzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $SubnetAddressPrefix

$Vnet = New-AzVirtualNetwork -Name $NetworkName -ResourceGroupName $ResourceGroupName -Location $LocationName -AddressPrefix $VnetAddressPrefix -Subnet $SingleSubnet

$ipConfig = New-AzVmssIpConfig -Name "myIPConfig" -SubnetId $Vnet.Subnets[0].Id 

$VMSS = New-AzVmssConfig -Location $LocationName -SkuCapacity 2 -SkuName $VMSize -UpgradePolicyMode 'Automatic' -OrchestrationMode 'Uniform'

$VMSS = Add-AzVmssNetworkInterfaceConfiguration -Name "myVMSSNetworkConfig" -VirtualMachineScaleSet $VMSS -Primary $true -IpConfiguration $ipConfig

$diskEncryptionSet=Get-AzDiskEncryptionSet -ResourceGroupName $ResourceGroupName -Name $diskEncryptionSetName

# Enable encryption at rest with customer managed keys for OS disk by setting DiskEncryptionSetId property 

$VMSS = Set-AzVmssStorageProfile $VMSS -OsDiskCreateOption "FromImage" -DiskEncryptionSetId $diskEncryptionSet.Id -ImageReferenceOffer 'WindowsServer' -ImageReferenceSku '2012-R2-Datacenter' -ImageReferenceVersion latest -ImageReferencePublisher 'MicrosoftWindowsServer'

$VMSS = Set-AzVmssOsProfile $VMSS -ComputerNamePrefix $ComputerNamePrefix -AdminUsername $VMLocalAdminUser -AdminPassword $VMLocalAdminSecurePassword

# Add a data disk encrypted at rest with customer managed keys by setting DiskEncryptionSetId property 

$VMSS = Add-AzVmssDataDisk -VirtualMachineScaleSet $VMSS -CreateOption Empty -Lun 1 -DiskSizeGB 128 -StorageAccountType Premium_LRS -DiskEncryptionSetId $diskEncryptionSet.Id

$Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword);

New-AzVmss -VirtualMachineScaleSet $VMSS -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMScaleSetName

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

复制该脚本,将所有示例值替换为你自己的参数,然后运行该脚本。

$ResourceGroupName="yourResourceGroupName"
$keyVaultName="yourKeyVaultName"
$keyName="yourKeyName"
$diskEncryptionSetName="yourDiskEncryptionSetName"

$keyVault = Get-AzKeyVault -VaultName $keyVaultName -ResourceGroupName $ResourceGroupName

$keyVaultKey = Get-AzKeyVaultKey -VaultName $keyVaultName -Name $keyName

Update-AzDiskEncryptionSet -Name $diskEncryptionSetName -ResourceGroupName $ResourceGroupName -SourceVaultId $keyVault.ResourceId -KeyUrl $keyVaultKey.Id

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

$ResourceGroupName="yourResourceGroupName"
$DiskName="yourDiskName"

$disk=Get-AzDisk -ResourceGroupName $ResourceGroupName -DiskName $DiskName
$disk.Encryption.Type

重要

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

后续步骤