Azure PowerShel — включение управляемых клиентом ключей с помощью шифрования на стороне сервера для управляемых дисков

Применимо к: ✔️ Виртуальные машины Windows ✔️ Гибкие масштабируемые наборы ✔️ Универсальные масштабируемые наборы

Хранилище дисков Azure позволяет управлять собственными ключами при использовании шифрования на стороне сервера (SSE) для управляемых дисков, если возникнет такая необходимость. Общие концепции, связанные с SSE с использованием ключей, управляемых клиентом, и к другими типами шифрования управляемых дисков, см. в разделе Ключи, управляемые клиентом статьи о шифровании дисков.

Ограничения

В настоящее время ключи, управляемые клиентом, имеют следующие ограничения.

  • Если эта функция включена для диска с добавочными моментальными снимками, его нельзя отключить на этом диске или его моментальных снимках. Чтобы обойти эту проблему, скопируйте все данные на совершенно другой управляемый диск, который не использует ключи, управляемые клиентом. Это можно сделать с помощью Azure CLI или модуля Azure PowerShell.
  • Поддерживаются только ключи RSA для программного обеспечения и HSM с размерами 2048 бит, 3072 бит и 4096 бит. Другие ключи или размеры не поддерживаются.
    • Для ключей HSM требуется уровень Premium Azure Key Vault.
  • Только для дисков категории "Ультра" и SSD уровня "Премиум" версии 2:
    • Моментальные снимки дисков, зашифрованных с помощью шифрования на стороне сервера и ключей, управляемых клиентом, должны быть зашифрованы с помощью тех же управляемых клиентом ключей.
    • Управляемые удостоверения, назначаемые пользователем, не поддерживаются для дисков SSD категории "Ультра" и SSD уровня "Премиум" версии 2, зашифрованных с помощью ключей, управляемых клиентом.
    • В настоящее время не поддерживается в Azure для государственных организаций или Azure China.
  • Большинство ресурсов, связанных с ключами, управляемыми клиентом (наборы шифрования дисков, виртуальные машины, диски и моментальные снимки), должны находиться в одной подписке и регионе.
    • Хранилища ключей Azure могут использоваться из другой подписки, но должны находиться в том же регионе, что и набор шифрования дисков. В качестве предварительной версии можно использовать Azure Key Vault из разных клиентов Microsoft Entra.
  • Диски, зашифрованные с помощью ключей, управляемых клиентом, могут перемещаться только в другую группу ресурсов, если к ней подключена виртуальная машина.
  • Диски, моментальные снимки и изображения, зашифрованные с помощью ключей, управляемых клиентом, нельзя перемещать между подписками.
  • Управляемые диски в настоящее время или ранее зашифрованные с помощью Шифрование дисков Azure не могут быть зашифрованы с помощью ключей, управляемых клиентом.
  • Может создавать только до 5000 наборов шифрования дисков в каждом регионе на подписку.
  • Сведения об использовании ключей, управляемых клиентом, с общими коллекциями образов см. в статье "Предварительная версия: использование управляемых клиентом ключей для шифрования изображений".

Настройка Azure Key Vault и DiskEncryptionSet с автоматической сменой ключей (необязательно)

Чтобы использовать ключи, управляемые клиентом, с SSE, нужно настроить Azure Key Vault и ресурс DiskEncryptionSet.

  1. Убедитесь, что у вас установлена последняя версия Azure PowerShell и вы вошли в учетную запись Azure с помощью командлета Connect-AzAccount.

  2. Создайте экземпляр Azure Key Vault и ключ шифрования.

    При создании экземпляра Key Vault необходимо включить защиту от очистки. Защита от удаления гарантирует, что удаленный ключ нельзя удалить навсегда до истечения срока хранения. Эти параметры защищают от потери данных из-за случайного удаления. Эти параметры являются обязательными при использовании 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 
    
  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 доступ к хранилищу ключей.

    Примечание.

    Для создания удостоверения DiskEncryptionSet в идентификаторе Microsoft Entra может потребоваться несколько минут. Если при выполнении следующей команды появляется сообщение об ошибке вида "Не удается найти объект 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

Примеры

Итак, создав и настроив эти ресурсы, вы теперь можете использовать их для защиты управляемых дисков. Ниже представлены примеры скриптов с описанием соответствующего сценария, которые можно использовать для защиты управляемых дисков.

Создание виртуальной машины с помощью образа Marketplace, шифрование дисков операционной системы и данных с помощью управляемых клиентом ключей

Скопируйте скрипт, замените все примеры значений собственными параметрами и выполните его.

$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

Создайте пустой диск, зашифрованный с помощью шифрования на стороне сервера, с ключами, управляемыми клиентом, и подключите его к виртуальной машине.

Скопируйте скрипт, замените все примеры значений собственными параметрами и выполните его.

$vmName = "yourVMName"
$LocationName = "westcentralus"
$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

Шифрование существующих управляемых дисков

Существующие диски не должны быть подключены к работающей виртуальной машине, чтобы их можно было зашифровать с помощью следующего скрипта.

$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 и ключей, управляемых клиентом

Этот скрипт будет работать только для масштабируемых наборов в режиме универсальной оркестрации. Для масштабируемых наборов в режиме гибкой оркестрации выполните шифрование существующих управляемых дисков для каждой виртуальной машины.

Скопируйте скрипт, замените все примеры значений собственными параметрами и выполните его.

#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

Создание масштабируемого набора виртуальных машин с помощью образа Marketplace, шифрование дисков операционной системы и данных с помощью управляемых клиентом ключей

Скопируйте скрипт, замените все примеры значений собственными параметрами и выполните его.

Внимание

Начиная с ноября 2023 года масштабируемые наборы виртуальных машин, созданные с помощью PowerShell и Azure CLI, по умолчанию будут использоваться в режиме гибкой оркестрации, если режим оркестрации не указан. Дополнительные сведения об этом изменении и о действиях, которые необходимо предпринять, см. в руководстве по критическим изменениям для клиентов VmSS PowerShell/CLI — Microsoft Community Hub

$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 

$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. При настройке управляемых пользователем ключей управляемое удостоверение автоматически назначается вашим ресурсам. Если вы впоследствии перемещаете подписку, группу ресурсов или управляемый диск из одного каталога Microsoft Entra в другой, управляемое удостоверение, связанное с управляемыми дисками, не передается новому клиенту, поэтому ключи, управляемые клиентом, больше не работают. Дополнительные сведения см. в разделе "Передача подписки между каталогами Microsoft Entra".

Следующие шаги