适用于:✔️ Windows VM
启用主机加密时,存储在 VM 主机上的数据将静态加密,且已加密的数据将流向存储服务。 有关主机加密以及其他托管磁盘加密类型的概念信息,请参阅主机加密 - VM 数据的端到端加密。
限制
- 无法在当前启用过或曾经启用过 Azure 磁盘加密的虚拟机 (VM) 或虚拟机规模集上启用。
- 无法在启用了主机加密的磁盘上启用 Azure 磁盘加密。
- 可以在现有的虚拟机规模集上启用加密。 但是,只有启用加密后新建的 VM 才会自动加密。
- 现有虚拟机必须先解除分配并重新分配,才能进行加密。
以下限制仅适用于超级磁盘和高级 SSD v2:
- 使用 512e 扇区大小的磁盘需要在 2023 年 5 月 13 日之后创建。
- 如果磁盘在此日期之前创建, 请创建磁盘快照,并使用快照创建新磁盘。
支持的 VM 大小
可以通过编程方式拉取受支持的 VM 大小的完整列表。 若要了解如何以编程方式检索它们,请参阅查找支持的 VM 大小部分。
升级 VM 大小会触发验证,用于检查新 VM 大小是否支持 EncryptionAtHost 该功能。
先决条件
必须先为订阅启用该功能,然后才能为 VM 或虚拟机规模集使用 EncryptionAtHost 属性。 使用以下步骤为订阅启用该功能:
执行以下命令,为订阅注册此功能
Register-AzProviderFeature -FeatureName "EncryptionAtHost" -ProviderNamespace "Microsoft.Compute"在试用该功能之前,请使用以下命令检查注册状态是否为“已注册”(需要几分钟的时间)。
Get-AzProviderFeature -FeatureName "EncryptionAtHost" -ProviderNamespace "Microsoft.Compute"
创建 Azure 密钥保管库 和磁盘加密集
注意
本部分仅适用于使用客户管理的密钥的配置。 如果使用平台管理的密钥,则可以跳到 使用主机加密创建和更新 VM 和虚拟机规模集。
启用该功能时,如果尚未配置 Azure 密钥保管库 和磁盘加密集,请先进行配置。
安装最新的Azure PowerShell版本,并使用 Azure 帐户
Connect-AzAccount登录。创建 Azure 密钥保管库 和加密密钥的实例。
创建 密钥保管库 实例时,必须启用清除保护。 清除保护可确保在保留期结束之前,无法永久删除已删除的密钥。 这些设置可防止由于意外删除而丢失数据。 使用 密钥保管库 加密托管磁盘时,这些设置是必需的。
$ResourceGroupName="yourResourceGroupName" $LocationName="chinaeast2" $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 Set-AzKeyVaultKeyRotationPolicy -VaultName $keyVaultName -KeyName $keyName -ExpiresIn P2Y -KeyRotationLifetimeAction @{Action="Rotate";TimeBeforeExpiry = "P18M"}创建磁盘加密集。 此脚本将 RotationToLatestKeyVersionEnabled 设置为等于 $true 以启用密钥的自动轮换。 启用自动轮换后,系统将自动更新引用该磁盘加密集的所有托管磁盘、快照和映像,以便在一小时内使用新版本密钥。
$desConfig=New-AzDiskEncryptionSetConfig -Location $LocationName ` -SourceVaultId $keyVault.ResourceId ` -KeyUrl $key.Key.Kid ` -IdentityType SystemAssigned ` -RotationToLatestKeyVersionEnabled $true $des=New-AzDiskEncryptionSet -Name $diskEncryptionSetName ` -ResourceGroupName $ResourceGroupName ` -InputObject $desConfig授予磁盘加密集对密钥保管库的访问权限。
注意
Azure 可能需要几分钟时间才能在 Microsoft Entra ID 中创建磁盘加密集的标识。 如果在运行以下命令时收到类似于“找不到 Active Directory 对象”的错误,请等待几分钟,然后重试。
Set-AzKeyVaultAccessPolicy -VaultName $keyVaultName -ObjectId $des.Identity.PrincipalId -PermissionsToKeys wrapkey,unwrapkey,get
在不同的订阅中使用密钥保管库
或者,可以从单个订阅集中管理 Azure 密钥保管库,并使用 密钥保管库 中存储的密钥来加密组织的其他订阅中的托管磁盘和快照。 这样,安全团队就可以对单个订阅强制实施和轻松管理可靠的安全策略。
重要
对于此配置,你的密钥保管库和磁盘加密集都必须位于同一区域,并使用同一租户。
下面的脚本是一个示例,说明如何配置磁盘加密集以使用来自不同订阅但相同区域的 密钥保管库 的密钥:
$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 $true
$des=New-AzDiskEncryptionSet -Name $targetDiskEncryptionSetName `
-ResourceGroupName $targetResourceGroupName `
-InputObject $desConfig
为 VM 和虚拟机规模集配置主机加密
可以使用 API 版本 securityProfile 或更高版本,通过在虚拟机或虚拟机规模集的 EncryptionAtHost 下设置 属性来启用主机加密。
"securityProfile": { "encryptionAtHost": "true" }
使用主机加密创建和更新 VM 和虚拟机规模集
使用客户管理的密钥在主机上创建启用了加密的 VM
在运行脚本之前,请指定现有的资源组和磁盘加密集,以及虚拟机管理员凭据、区域、虚拟机大小和虚拟网络的值。 该脚本创建虚拟网络和网络接口,使用New-AzVMConfig与-EncryptionAtHost,并使用New-AzVM部署 Windows 虚拟机。 磁盘加密集使用客户管理的密钥对操作系统磁盘和数据磁盘的缓存进行加密。 临时磁盘使用平台管理的密钥进行加密。
$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);
# Enable encryption at host by specifying EncryptionAtHost parameter
$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize -EncryptionAtHost
$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
# Enable encryption with a customer managed key for OS disk by setting DiskEncryptionSetId property
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name $($VMName +"_OSDisk") -DiskEncryptionSetId $diskEncryptionSet.Id -CreateOption FromImage
# Add a data disk encrypted with a customer managed key by setting DiskEncryptionSetId property
$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
在运行脚本之前,请为 VM 管理员凭据、区域、VM 大小和虚拟网络提供现有的资源组和值。 该脚本创建虚拟网络和网络接口,使用New-AzVMConfig与-EncryptionAtHost,并使用New-AzVM部署 Windows 虚拟机。 主机的加密使用平台管理的密钥加密 OS 和数据磁盘的缓存以及临时磁盘。
$VMLocalAdminUser = "yourVMLocalAdminUserName"
$VMLocalAdminSecurePassword = ConvertTo-SecureString <password> -AsPlainText -Force
$LocationName = "yourRegion"
$ResourceGroupName = "yourResourceGroupName"
$ComputerName = "yourComputerName"
$VMName = "yourVMName"
$VMSize = "yourVMSize"
$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);
# Enable encryption at host by specifying EncryptionAtHost parameter
$VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize -EncryptionAtHost
$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
$VirtualMachine = Set-AzVMOSDisk -VM $VirtualMachine -Name $($VMName +"_OSDisk") -CreateOption FromImage
$VirtualMachine = Add-AzVMDataDisk -VM $VirtualMachine -Name $($VMName +"DataDisk1") -DiskSizeInGB 128 -StorageAccountType Premium_LRS -CreateOption Empty -Lun 0
New-AzVM -ResourceGroupName $ResourceGroupName -Location $LocationName -VM $VirtualMachine
更新 VM 以在主机上启用加密
$ResourceGroupName = "yourResourceGroupName"
$VMName = "yourVMName"
$VM = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
Update-AzVM -VM $VM -ResourceGroupName $ResourceGroupName -EncryptionAtHost $true
检查 VM 的主机加密状态
$ResourceGroupName = "yourResourceGroupName"
$VMName = "yourVMName"
$VM = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
$VM.SecurityProfile.EncryptionAtHost
禁用基于主机的加密
必须先解除分配 VM,然后才能禁用主机端加密。
$ResourceGroupName = "yourResourceGroupName"
$VMName = "yourVMName"
$VM = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName
Stop-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
Update-AzVM -VM $VM -ResourceGroupName $ResourceGroupName -EncryptionAtHost $false
创建启用了主机加密并使用客户管理的密钥的虚拟机规模集
重要
从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的虚拟机规模集,如果未指定编排模式,则默认采用灵活编排模式。 有关此更改的详细信息以及你应采取哪些操作,请参阅 面向 VMSS PowerShell/CLI 用户的中断性变更 - Microsoft Community Hub
在运行脚本之前,请提供现有的资源组和磁盘加密集,以及管理员凭据、区域、虚拟机大小和虚拟网络的相关值。 该脚本创建虚拟网络,配置一个包含两个实例的灵活虚拟机规模集,并配置 New-AzVmssConfig 和 -EncryptionAtHost,然后使用 New-AzVmss 对其进行部署。 磁盘加密集使用客户管理的密钥对操作系统磁盘和数据磁盘的缓存进行加密。 临时磁盘使用平台管理的密钥进行加密。
$VMLocalAdminUser = "yourLocalAdminUser"
$VMLocalAdminSecurePassword = ConvertTo-SecureString Password@123 -AsPlainText -Force
$LocationName = "chinaeast2"
$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
# Enable encryption at host by specifying EncryptionAtHost parameter
$VMSS = New-AzVmssConfig -Location $LocationName -SkuCapacity 2 -SkuName $VMSize -OrchestrationMode "Flexible" -EncryptionAtHost
$VMSS = Add-AzVmssNetworkInterfaceConfiguration -Name "myVMSSNetworkConfig" -VirtualMachineScaleSet $VMSS -Primary $true -IpConfiguration $ipConfig
$diskEncryptionSet=Get-AzDiskEncryptionSet -ResourceGroupName $ResourceGroupName -Name $diskEncryptionSetName
# Enable encryption with a customer managed key for the 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 with a customer managed key by setting DiskEncryptionSetId property
$VMSS = Add-AzVmssDataDisk -VirtualMachineScaleSet $VMSS -CreateOption Empty -Lun 1 -DiskSizeGB 128 -StorageAccountType Premium_LRS -DiskEncryptionSetId $diskEncryptionSet.Id
New-AzVmss -VirtualMachineScaleSet $VMSS -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMScaleSetName
使用平台管理的密钥在主机上启用加密创建虚拟机规模集
重要
从 2023 年 11 月开始,使用 PowerShell 和 Azure CLI 创建的虚拟机规模集,如果未指定编排模式,则默认采用灵活编排模式。 有关此更改的详细信息以及你应采取哪些操作,请参阅 面向 VMSS PowerShell/CLI 用户的中断性变更 - Microsoft Community Hub
在运行脚本之前,请为管理员凭据、区域、VM 大小和虚拟网络提供现有的资源组和值。 该脚本创建虚拟网络,配置一个包含两个实例的灵活虚拟机规模集,并配置 New-AzVmssConfig 和 -EncryptionAtHost,然后使用 New-AzVmss 对其进行部署。 主机加密使用平台管理的密钥加密操作系统磁盘和数据磁盘的缓存,以及临时磁盘。
$VMLocalAdminUser = "yourLocalAdminUser"
$VMLocalAdminSecurePassword = ConvertTo-SecureString Password@123 -AsPlainText -Force
$LocationName = "chinaeast2"
$ResourceGroupName = "yourResourceGroupName"
$ComputerNamePrefix = "yourComputerNamePrefix"
$VMScaleSetName = "yourVMSSName"
$VMSize = "Standard_DS3_v2"
$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
# Enable encryption at host by specifying EncryptionAtHost parameter
$VMSS = New-AzVmssConfig -Location $LocationName -SkuCapacity 2 -SkuName $VMSize -OrchestrationMode "Flexible" -EncryptionAtHost
$VMSS = Add-AzVmssNetworkInterfaceConfiguration -Name "myVMSSNetworkConfig" -VirtualMachineScaleSet $VMSS -Primary $true -IpConfiguration $ipConfig
$VMSS = Set-AzVmssStorageProfile $VMSS -OsDiskCreateOption "FromImage" -ImageReferenceOffer 'WindowsServer' -ImageReferenceSku '2012-R2-Datacenter' -ImageReferenceVersion latest -ImageReferencePublisher 'MicrosoftWindowsServer'
$VMSS = Set-AzVmssOsProfile $VMSS -ComputerNamePrefix $ComputerNamePrefix -AdminUsername $VMLocalAdminUser -AdminPassword $VMLocalAdminSecurePassword
$VMSS = Add-AzVmssDataDisk -VirtualMachineScaleSet $VMSS -CreateOption Empty -Lun 1 -DiskSizeGB 128 -StorageAccountType Premium_LRS
$Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $VMLocalAdminSecurePassword);
New-AzVmss -VirtualMachineScaleSet $VMSS -ResourceGroupName $ResourceGroupName -VMScaleSetName $VMScaleSetName
更新虚拟机规模集以在主机上启用加密
$ResourceGroupName = "yourResourceGroupName"
$VMScaleSetName = "yourVMSSName"
$VMSS = Get-AzVmss -ResourceGroupName $ResourceGroupName -Name $VMScaleSetName
Update-AzVmss -VirtualMachineScaleSet $VMSS -Name $VMScaleSetName -ResourceGroupName $ResourceGroupName -EncryptionAtHost $true
检查虚拟机规模集的主机级加密状态
$ResourceGroupName = "yourResourceGroupName"
$VMScaleSetName = "yourVMSSName"
$VMSS = Get-AzVmss -ResourceGroupName $ResourceGroupName -Name $VMScaleSetName
$VMSS.VirtualMachineProfile.SecurityProfile.EncryptionAtHost
更新虚拟机规模集以禁用主机端加密
你可以对虚拟机规模集禁用主机加密,但此更改仅会影响在你禁用主机加密后创建的虚拟机。 对于现有虚拟机,必须先将虚拟机解除分配,在该虚拟机上禁用主机上的加密,然后才能重新分配虚拟机。
$ResourceGroupName = "yourResourceGroupName"
$VMScaleSetName = "yourVMSSName"
$VMSS = Get-AzVmss -ResourceGroupName $ResourceGroupName -Name $VMScaleSetName
Update-AzVmss -VirtualMachineScaleSet $VMSS -Name $VMScaleSetName -ResourceGroupName $ResourceGroupName -EncryptionAtHost $false
找到支持的 VM 大小
不支持某些较旧的 VM 大小。 可以通过以下任一方法查找支持的 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"
}
]
}
或者,调用 Get-AzComputeResourceSku PowerShell cmdlet。
Get-AzComputeResourceSku -Location "chinanorth2" |
Where-Object { $_.ResourceType -eq 'virtualMachines' -and $_.capabilities.where({ $_.Name -eq 'EncryptionAtHostSupported' }, 'First').Value -eq 'True' } |
Select-Object -ExpandProperty Name
后续步骤
创建并配置这些资源之后,可以使用它们来保护托管磁盘。 以下链接包含示例脚本,每个脚本都有各自的方案,可用于保护托管磁盘。