Compartilhar via


Azure PowerShell – Habilitar chaves gerenciadas pelo cliente com criptografia do lado do servidor – Discos gerenciados

Aplica-se a: ✔️ VMs do Windows ✔️ Conjuntos de dimensionamento flexíveis ✔️ Conjuntos de dimensionamento uniformes

O Armazenamento em Disco do Azure permite que você gerencie as próprias chaves ao usar a SSE (criptografia do lado do servidor) para discos gerenciados, se você escolher. Para obter informações conceituais sobre a SSE com chaves gerenciadas pelo cliente, bem como outros tipos de criptografia de disco gerenciado, confira a seção Chaves gerenciadas pelo cliente do nosso artigo sobre criptografia de disco.

Restrições

Por enquanto, as chaves gerenciadas pelo cliente têm as seguintes restrições:

  • Se esse recurso estiver habilitado para um disco com instantâneos incrementais, ele não poderá ser desabilitado nesse disco ou em seus instantâneos. Para contornar isso, copie todos os dados para um disco gerenciado totalmente diferente que não use chaves gerenciadas pelo cliente. Você pode fazer isso com a CLI do Azure ou com o módulo do Azure PowerShell.
  • Um disco e todos os seus instantâneos incrementais associados devem ter o mesmo Conjunto de Criptografia de Disco.
  • chaves de software e chaves RSA HSM de tamanhos 2.048, 3.072 e 4.096 bits são suportadas. Não são aceitas outras chaves ou tamanhos.
    • As chaves HSM exigem a camada Premium de cofres de chaves do Azure.
  • Somente para Discos Ultra e discos SSD Premium v2:
    • Discos criados a partir de instantâneos que são criptografados com Criptografia do lado do Servidor e Chaves gerenciadas pelo Cliente devem ser criptografados com o mesmo Conjunto de Criptografia de Disco.
    • Não há suporte para identidades gerenciadas atribuídas pelo usuário em Discos Ultra e discos SSD Premium v2 criptografados com chaves gerenciadas pelo cliente.
    • No momento, não há suporte para a criptografia de discos Ultra e discos SSD Premium v2 com chaves gerenciadas pelo cliente usando Azure Key Vaults armazenados em um locatário diferente do Microsoft Entra ID.
  • A maioria dos recursos relacionados às chaves gerenciadas pelo cliente (conjuntos de criptografia de disco, VMs, discos e instantâneos) precisa estar na mesma assinatura e região.
    • Os cofres de chaves do Azure podem ser usados em outra assinatura, mas precisam estar na mesma região do conjunto de criptografia de disco. Com o acesso à versão prévia, você poderá usar os Azure Key Vaults de diferentes locatários do Microsoft Entra.
  • Os discos criptografados com chaves gerenciadas pelo cliente só poderão ser movidos para outro grupo de recursos se a VM à qual estão anexados for desalocada.
  • Os discos, os instantâneos e as imagens criptografadas com chaves gerenciadas pelo cliente não podem ser movidas entre assinaturas.
  • Os discos gerenciados atualmente ou criptografados anteriormente usando Azure Disk Encryption não podem ser criptografados usando chaves gerenciadas pelo cliente.
  • Só é possível criar até 5 mil conjuntos de criptografia de disco por região e assinatura.
  • Para obter informações sobre o uso de chaves gerenciadas pelo cliente com galerias de imagens compartilhadas, confira Preview: Use chaves gerenciadas pelo cliente para criptografar imagens.

Configurar um Azure Key Vault e um DiskEncryptionSet opcionalmente com a rotação de chaves automática

Para usar chaves gerenciadas pelo cliente com o SSE, você deve configurar um Azure Key Vault e um recurso DiskEncryptionSet.

  1. Verifique se você instalou a versão mais recente do Azure PowerShell e se está conectado a uma conta do Azure com Connect-AzAccount

  2. Crie uma instância do Azure Key Vault e a chave de criptografia.

    Ao criar a instância do Key Vault, habilite a proteção de limpeza. A proteção de limpeza garante que uma chave excluída não seja excluída permanentemente até que o período de retenção termine. Essas configurações protegem você contra a perda de dados devido à exclusão acidental. Essas configurações são obrigatórias ao usar um Key Vault para criptografar discos gerenciados.

    $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. Crie uma instância de um DiskEncryptionSet. Você pode definir “RotationToLatestKeyVersionEnabled” como “$true” para habilitar a rotação automática da chave. Quando você habilita a rotação automática, o sistema atualiza automaticamente todos os discos gerenciados, instantâneos e imagens que fazem referência ao conjunto de criptografia de disco para usar a nova versão da chave em uma hora.

    $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. Conceda o acesso ao recurso DiskEncryptionSet para o Key Vault.

    Observação

    Pode levar alguns minutos para o Azure criar a identidade do DiskEncryptionSet no seu Microsoft Entra ID. Se você receber um erro como "não é possível encontrar o objeto Active Directory" ao executar o comando a seguir, aguarde alguns minutos e tente novamente.

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

Usar um cofre de chaves em uma assinatura diferente

Como alternativa, você pode gerenciar os cofres de chaves do Azure centralmente de uma assinatura única e usar as chaves armazenadas no Key Vault para criptografar discos gerenciados e instantâneos em outras assinaturas em sua organização. Isso permite que sua equipe de segurança aplique e gerencie facilmente uma política de segurança robusta para uma assinatura única.

Importante

Para essa configuração, o Key Vault e o conjunto de criptografia de disco devem estar na mesma região e estar usando o mesmo locatário.

O seguinte script é um exemplo de como você configurará um conjunto de criptografia de disco para usar uma chave de um Key Vault em uma assinatura diferente, mas na mesma região:

$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

Exemplos

Agora que você criou e configurou esses recursos, você pode usá-los para proteger seus discos gerenciados. Veja a seguir os scripts de exemplo, cada um com um cenário respectivo, que você pode usar para proteger seus discos gerenciados.

Crie uma VM usando uma imagem do Marketplace, criptografando o sistema operacional e os discos de dados com chaves gerenciadas pelo cliente

Copie o script, substitua todos os valores de exemplo pelos seus próprios parâmetros e, em seguida, execute-o.

$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

Crie um disco vazio criptografado usando a criptografia do lado do servidor com chaves gerenciadas pelo cliente e anexe-o a uma VM

Copie o script, substitua todos os valores de exemplo pelos seus próprios parâmetros e, em seguida, execute-o.

$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

Criptografe os discos gerenciados existentes

Os discos existentes não devem ser anexados a uma VM em execução para que você possa criptografá-los usando o seguinte script:

$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

Criptografar um conjunto de dimensionamento de máquinas virtuais existente (modo de orquestração uniforme) com SSE e chaves gerenciadas pelo cliente

Esse script funcionará somente para conjuntos de dimensionamento no modo de orquestração uniforme. Para conjuntos de dimensionamento no modo de orquestração flexível, siga a opção Criptografar discos gerenciados para cada VM.

Copie o script, substitua todos os valores de exemplo pelos seus próprios parâmetros e, em seguida, execute-o:

#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

Crie um conjunto de dimensionamento de máquinas virtuais usando uma imagem do Marketplace, criptografando o sistema operacional e os discos de dados com chaves gerenciadas pelo cliente

Copie o script, substitua todos os valores de exemplo pelos seus próprios parâmetros e, em seguida, execute-o.

Importante

A partir de novembro de 2023, os conjuntos de dimensionamento de VM criados usando o PowerShell e a CLI do Azure serão padrão para o Modo de Orquestração Flexível se nenhum modo de orquestração for especificado. Para obter mais informações sobre essa alteração e quais ações você deve executar, acesse Alteração interruptiva para clientes PowerShell/CLI do VMSS – Hub de Comunidade da Microsoft

$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

Mude a chave de um DiskEncryptionSet para alternar a chave de todos os recursos que fazem referência ao DiskEncryptionSet

Copie o script, substitua todos os valores de exemplo pelos seus próprios parâmetros e, em seguida, execute-o.

$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

Encontre o status da criptografia do lado do servidor de um disco

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

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

Importante

As chaves gerenciadas pelo cliente dependem de identidades gerenciadas para recursos do Azure, um recurso do Microsoft Entra ID. Ao configurar chaves gerenciadas pelo cliente, uma identidade gerenciada é atribuída automaticamente aos recursos nos bastidores. Caso mova posteriormente a assinatura, o grupo de recursos ou o disco gerenciado de um diretório do Microsoft Entra para outro, a identidade gerenciada associada aos discos gerenciados não será transferida para o novo locatário, portanto, as chaves gerenciadas pelo cliente poderão não funcionar mais. Para obter mais informações, confira Como transferir uma assinatura entre os diretórios do Microsoft Entra.

Próximas etapas