使用 Azure PowerShell 啟用採用主機端加密的端對端加密

適用於:✔️ Windows VM

當您啟用主機上的加密時,儲存在 VM 主機上的資料會在待用時加密,並將流量加密至儲存體服務。 如需主機上的加密的概念資訊,以及其他受控磁碟加密類型,請參閱主機上的加密 - VM 資料的端對端加密。

限制

  • 無法在目前或曾啟用 Azure 磁碟加密的虛擬機器 (VM) 或虛擬機器擴展集上啟用。
  • Azure 磁碟加密無法在已啟用主機加密的磁碟上啟用。
  • 您可以在現有的虛擬機器擴展集上啟用加密。 不過,只有在啟用加密之後建立的新 VM 才會自動加密。
  • 現有的 VM 必須解除配置和重新配置,才能加密。

下列限制僅適用於 Ultra 磁碟和進階 SSD v2:

  • 使用 512e 扇區大小的磁碟必須在 2023/5/13 之後建立。
    • 如果您的磁碟是在此日期之前建立的,請 建立磁碟的快照集,並使用快照集建立新的磁碟。

支援的 VM 大小

可透過程式設計方式來提取支援 VM 大小的完整清單。 若要了解如何以程式設計方式進行擷取,請參閱 尋找支援的 VM 大小一節。 升級虛擬機大小會觸發驗證,檢查新的虛擬機大小是否支援此功能 EncryptionAtHost 。

必要條件

你必須先啟用訂閱的此功能,才能在虛擬機或虛擬機擴充套件中使用該 EncryptionAtHost 屬性。 使用下列步驟來為訂用帳戶啟用功能:

  1. 執行下列命令來為訂閱註冊該功能

     Register-AzProviderFeature -FeatureName "EncryptionAtHost" -ProviderNamespace "Microsoft.Compute" 
    
  2. 請先使用下列命令檢查註冊狀態是否為 [已註冊] (需要幾分鐘的時間),然後再試用功能。

     Get-AzProviderFeature -FeatureName "EncryptionAtHost" -ProviderNamespace "Microsoft.Compute"  
    

建立 Azure Key Vault 和磁碟加密設定

注意

本節僅適用於使用客戶自控金鑰的設定。 如果您使用平台管理的金鑰,則可直接跳至 建立及更新啟用主機端加密的虛擬機與虛擬機擴展集。

啟用此功能後,如果還沒有的話,請設定 Azure Key Vault 和磁碟加密。

  1. 安裝最新的 Azure PowerShell 版本,並用 Connect-AzAccount. 登入你的 Azure 帳號。

  2. 建立 Azure Key Vault 的執行個體和加密金鑰。

    建立 金鑰保存庫 執行個體時,您必須啟用 [清除保護]。 清除保護可確保已刪除的金鑰在保留期限結束之前,無法永久刪除。 這些設定可防止您因為意外刪除而遺失資料。 使用 金鑰保存庫 來加密受控磁碟時,必須使用這些設定。

    $ResourceGroupName="yourResourceGroupName"
    $LocationName="westcentralus"
    $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"}
    
  3. 建立磁碟加密集合。 此腳本會將 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
    
  4. 授權磁碟加密組存取金鑰庫。

    注意

    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

為虛擬機器和虛擬機器縮放集設定主機端加密

你可以使用 API 版本 securityProfile 或更新版本,針對虛擬機器或虛擬機器擴展集,在 EncryptionAtHost 下設定 屬性,以啟用主機端加密。

"securityProfile": { "encryptionAtHost": "true" }

建立並更新虛擬機與虛擬機縮放集,並在主機上加加密

建立已啟用主機加密且使用客戶自控金鑰的 Azure 虛擬機器

執行腳本前,請提供現有的資源群組與磁碟加密組,以及虛擬機管理員憑證、區域、虛擬機大小與虛擬網路的數值。 腳本會建立虛擬網路和網路介面、使用 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

建立已啟用主機加密且使用平台自控金鑰的 Azure 虛擬機器

執行腳本前,先提供現有的資源群組,以及虛擬機管理員的憑證、區域、虛擬機大小和虛擬網路的數值。 腳本會建立虛擬網路和網路介面、使用 New-AzVMConfig 搭配 -EncryptionAtHost,並使用 New-AzVM 部署 Windows 虛擬機器。 主機端加密會使用由平台管理的金鑰,加密作業系統和資料磁碟的快取以及暫存磁碟。

$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 社群中心

執行腳本前,請提供現有的資源群組與磁碟加密組合,以及管理員憑證、區域、虛擬機大小及虛擬網路的數值。 該指令碼會建立虛擬網路,設定包含兩個執行個體的彈性虛擬機器擴展集,並使用 New-AzVmssConfig 和 -EncryptionAtHost 進行設定,再使用 New-AzVmss 進行部署。 磁碟加密設定會使用客戶管理金鑰來加密作業系統磁碟和資料磁碟的快取。 臨時磁碟會用平台管理的金鑰加密。

$VMLocalAdminUser = "yourLocalAdminUser"
$VMLocalAdminSecurePassword = ConvertTo-SecureString Password@123 -AsPlainText -Force
$LocationName = "westcentralus"
$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 社群中心

執行腳本前,先提供現有的資源群組,以及管理員憑證、區域、虛擬機大小和虛擬網路的數值。 該指令碼會建立虛擬網路,設定包含兩個執行個體的彈性虛擬機器擴展集,並使用 New-AzVmssConfig 和 -EncryptionAtHost 進行設定,再使用 New-AzVmss 進行部署。 主機端加密會使用平台管理的金鑰,加密作業系統與資料磁碟的快取,以及暫存磁碟。

$VMLocalAdminUser = "yourLocalAdminUser"
$VMLocalAdminSecurePassword = ConvertTo-SecureString Password@123 -AsPlainText -Force
$LocationName = "westcentralus"
$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

更新虛擬機等級設定,使其在主機上關閉加密

你可以在虛擬機等級集中關閉主機加密,但這個變更只影響在你關閉主機加密後建立的虛擬機。 對於現有的 VM,您必須解除配置 VM、在該個別 VM 上停用主機上的加密,然後重新配置 VM。

$ResourceGroupName = "yourResourceGroupName"
$VMScaleSetName = "yourVMSSName"

$VMSS = Get-AzVmss -ResourceGroupName $ResourceGroupName -Name $VMScaleSetName

Update-AzVmss -VirtualMachineScaleSet $VMSS -Name $VMScaleSetName -ResourceGroupName $ResourceGroupName -EncryptionAtHost $false

尋找支援的 VM 大小

某些較舊的虛擬機器大小規格不受支援。 您可以藉由下列其中一個方式尋找支援的 VM 大小清單:

呼叫資源 SKU API,並檢查 EncryptionAtHostSupported 功能是否設定為 True。

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

或者,呼叫 Get-AzComputeResourceSku PowerShell Cmdlet。

Get-AzComputeResourceSku -Location "centralus" |
    Where-Object { $_.ResourceType -eq 'virtualMachines' -and $_.capabilities.where({ $_.Name -eq 'EncryptionAtHostSupported' }, 'First').Value -eq 'True' } |
    Select-Object -ExpandProperty Name

下一步

現在您已建立並設定這些資源,接下來即可使用這些資源來保護受控磁碟。 下列連結包含範例指令碼,每個指令碼都有個別的案例,可用來保護受控磁碟。

Azure Resource Manager 範本範例