Scripts de exemplo do Azure Disk Encryption

Importante

O Azure Disk Encryption está programado para ser descontinuado a 15 de setembro de 2028. Até essa data, pode continuar a usar o Azure Disk Encryption sem interrupções. A 15 de setembro de 2028, cargas de trabalho com ADE continuarão a funcionar, mas os discos encriptados não conseguirão desbloquear após o reinício da VM, resultando em interrupção do serviço.

Use encriptação na hospedagem para novas VMs, ou considere tamanhos de VM confidenciais com encriptação do disco do SO para workloads de computação confidencial. Todas as VMs habilitadas por ADE (incluindo backups) devem migrar para encriptação no host antes da data de desativação para evitar interrupções do serviço. Consulte Migrar de Encriptação de Disco Azure para Encriptação no Host para mais detalhes.

Aplica-se a: ✔️ Windows VMs

Este artigo fornece scripts de exemplo para preparar VHDs pré-criptografados e outras tarefas.

Nota

Todos os scripts referem-se à versão mais recente, não AAD do ADE, exceto onde indicado.

Exemplos de scripts do PowerShell para a Criptografia de Disco do Azure

  • Listar todas as VMs criptografadas em sua assinatura

Pode encontrar todas as VMs encriptadas por ADE e a versão da extensão, em todos os grupos de recursos presentes numa subscrição, usando o script PowerShellFind_1passAdeVersion_VM.ps1.

Alternativamente, estes cmdlets mostram todas as VMs encriptadas por ADE (mas não a versão da extensão):

$osVolEncrypted = {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).OsVolumeEncrypted}
$dataVolEncrypted= {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).DataVolumesEncrypted}
Get-AzVm | Format-Table @{Label="MachineName"; Expression={$_.Name}}, @{Label="OsVolumeEncrypted"; Expression=$osVolEncrypted}, @{Label="DataVolumesEncrypted"; Expression=$dataVolEncrypted}
  • Listar todas as instâncias criptografadas do VMSS em sua assinatura

    Pode encontrar todas as instâncias de conjuntos de dimensionamento de máquinas virtuais encriptadas com ADE, bem como a versão da extensão, em todos os grupos de recursos presentes numa subscrição, utilizando o script do PowerShell Find_1passAdeVersion_VMSS.ps1.

  • Listar todos os segredos de criptografia de disco usados para criptografar VMs em um cofre de chaves

Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}

Utilização do script PowerShell de pré-requisitos de Encriptação de Discos Azure

Se você já estiver familiarizado com os pré-requisitos para a Criptografia de Disco do Azure, poderá usar o script PowerShell de pré-requisitos da Criptografia de Disco do Azure. Para obter um exemplo de como usar esse script do PowerShell, consulte o Guia de início rápido Criptografar uma VM. Você pode remover os comentários de uma seção do script, começando na linha 211, para criptografar todos os discos para VMs existentes em um grupo de recursos existente.

A tabela seguinte mostra quais os parâmetros que podes usar no script PowerShell:

Parâmetro Descrição Obrigatório?
$resourceGroupName Nome do grupo de recursos a que pertence o cofre de chaves. O script cria um novo grupo de recursos com este nome, caso não exista nenhum. Verdadeiro
$keyVaultName Nome do cofre de chaves onde colocar as chaves de encriptação. O script cria um novo cofre com este nome se não existir um. Verdadeiro
$location Localização do cofre de chaves. Certifique-se de que o cofre de chaves e as VMs a encriptar estão no mesmo local. Obtenha uma lista de locais com o Get-AzLocation. Verdadeiro
$subscriptionId Identificador da subscrição Azure a utilizar. Obtenha o seu ID de subscrição com Get-AzSubscription. Verdadeiro
$aadAppName Nome da aplicação Microsoft Entra que escreve segredos no Key Vault. O script cria uma nova aplicação com este nome se não existir uma. Se esta aplicação já existir, passa o parâmetro aadClientSecret para o script. Falso
$aadClientSecret Segredo do cliente da aplicação do Microsoft Entra criada anteriormente. Falso
$keyEncryptionKeyName Nome da chave opcional de encriptação de chaves no Key Vault. O script cria uma nova chave com este nome se não existir uma. Falso

Modelos do Resource Manager

Criptografar ou descriptografar VMs sem um aplicativo Microsoft Entra

Encripte ou desencripte VMs usando uma aplicação Microsoft Entra

Preparar um VHD do Windows pré-criptografado

As secções seguintes explicam como preparar um VHD Windows pré-encriptado para implementação como um VHD encriptado no Azure IaaS. Use esta informação para preparar e arrancar uma VM Windows (VHD) limpa no Azure Site Recovery ou Azure. Para mais informações sobre como preparar e carregar um VHD, consulte Carregar um VHD generalizado e usá-lo para criar novas VMs no Azure.

Atualizar a política de grupo para permitir sem TPM para proteção do sistema operativo

Configure a definição da Política de Grupo do BitLocker Criptografia de Unidade de Disco BitLocker, que pode ser encontrada em Política do Computador Local>Configuração do Computador>Modelos Administrativos>Componentes do Windows. Altere esta configuração para Unidades do Sistema Operacional >>, como ilustrado na figura seguinte:

Microsoft Antimalware no Azure

Instalar componentes de recursos do BitLocker

Para Windows Server 2012 e versões posteriores, use o seguinte comando:

dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart

Para o Windows Server 2008 R2, use o seguinte comando:

ServerManagerCmd -install BitLockers

Preparar o volume do SO para o BitLocker utilizando bdehdcfg

Para compactar a partição do sistema operacional e preparar a máquina para o BitLocker, execute o bdehdcfg se necessário:

bdehdcfg -target c: shrink -quiet

Proteger o volume do SO utilizando o BitLocker

Use o manage-bde comando para ativar a encriptação no volume de arranque usando um protetor de chave externo. Coloque também a chave externa (arquivo .bek) na unidade externa ou no volume. A criptografia é ativada no volume do sistema/de arranque após a próxima reinicialização.

manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot

Nota

Prepare a VM com um VHD de dados/recurso separado para obter a chave externa usando o BitLocker.

Carregar VHD criptografado em uma conta de armazenamento do Azure

Depois que a criptografia BitLocker estiver habilitada, o VHD criptografado local precisará ser carregado em sua conta de armazenamento.

    Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]

Carregue o segredo da VM pré-encriptada para o cofre de chaves

Carrega o segredo de encriptação do disco que já obtiveste como segredo no teu cofre de chaves. Para isso, conceda à conta que carrega os segredos a permissão para definir segredos e a permissão wrapkey.

# Typically, account Id is the user principal name (in user@domain.com format)
$upn = (Get-AzureRmContext).Account.Id
Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set

# In cloud shell, the account ID is a managed service identity, so specify the username directly
# $upn = "user@domain.com"
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set

# When running as a service principal, retrieve the service principal ID from the account ID, and set access policy to that
# $acctid = (Get-AzureRmContext).Account.Id
# $spoid = (Get-AzureRmADServicePrincipal -ServicePrincipalName $acctid).Id
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -ObjectId $spoid -BypassObjectIdValidation -PermissionsToKeys wrapKey -PermissionsToSecrets set

Segredo de criptografia de disco não criptografado com um KEK

Para configurar o segredo no cofre de chaves, use Set-AzKeyVaultSecret. A frase secreta é codificada como uma cadeia de caracteres base64 e, em seguida, carregada para o cofre de chaves. Além disso, certifique-se de que as seguintes tags estão definidas quando você cria o segredo no cofre de chaves.


 # This is the passphrase that was provided for encryption during the distribution installation
 $passphrase = "contoso-password"

 $tags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
 $secretName = [guid]::NewGuid().ToString()
 $secretValue = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($passphrase))
 $secureSecretValue = ConvertTo-SecureString $secretValue -AsPlainText -Force

 $secret = Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name $secretName -SecretValue $secureSecretValue -tags $tags
 $secretUrl = $secret.Id

Utilize o $secretUrl no passo seguinte para anexar o disco do sistema operativo sem utilizar uma KEK.

Segredo de criptografia de disco criptografado com um KEK

Antes de carregar o segredo para o cofre de chaves, você pode, opcionalmente, criptografá-lo usando uma chave de criptografia de chave. Utilize a API de encapsulamento para primeiro encriptar o segredo utilizando a chave de encriptação de chaves. A saída dessa operação de encapsulamento é uma cadeia de caracteres codificada por URL base64, que você pode carregar como um segredo usando o Set-AzKeyVaultSecret cmdlet.

    # This is the passphrase that was provided for encryption during the distribution installation
    $passphrase = "contoso-password"

    Add-AzKeyVaultKey -VaultName $KeyVaultName -Name "keyencryptionkey" -Destination Software
    $KeyEncryptionKey = Get-AzKeyVaultKey -VaultName $KeyVault.OriginalVault.Name -Name "keyencryptionkey"

    $apiversion = "2015-06-01"

    ##############################
    # Get Auth URI
    ##############################

    $uri = $KeyVault.VaultUri + "/keys"
    $headers = @{}

    $response = try { Invoke-RestMethod -Method GET -Uri $uri -Headers $headers } catch { $_.Exception.Response }

    $authHeader = $response.Headers["www-authenticate"]
    $authUri = [regex]::match($authHeader, 'authorization="(.*?)"').Groups[1].Value

    Write-Host "Got Auth URI successfully"

    ##############################
    # Get Auth Token
    ##############################

    $uri = $authUri + "/oauth2/token"
    $body = "grant_type=client_credentials"
    $body += "&client_id=" + $AadClientId
    $body += "&client_secret=" + [Uri]::EscapeDataString($AadClientSecret)
    $body += "&resource=" + [Uri]::EscapeDataString("https://vault.azure.net")
    $headers = @{}

    $response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body

    $access_token = $response.access_token

    Write-Host "Got Auth Token successfully"

    ##############################
    # Get KEK info
    ##############################

    $uri = $KeyEncryptionKey.Id + "?api-version=" + $apiversion
    $headers = @{"Authorization" = "Bearer " + $access_token}

    $response = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers

    $keyid = $response.key.kid

    Write-Host "Got KEK info successfully"

    ##############################
    # Encrypt passphrase by using a KEK
    ##############################

    $passphraseB64 = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Passphrase))
    $uri = $keyid + "/encrypt?api-version=" + $apiversion
    $headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
    $bodyObj = @{"alg" = "RSA-OAEP"; "value" = $passphraseB64}
    $body = $bodyObj | ConvertTo-Json

    $response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body

    $wrappedSecret = $response.value

    Write-Host "Encrypted passphrase successfully"

    ##############################
    # Store secret
    ##############################

    $secretName = [guid]::NewGuid().ToString()
    $uri = $KeyVault.VaultUri + "/secrets/" + $secretName + "?api-version=" + $apiversion
    $secretAttributes = @{"enabled" = $true}
    $secretTags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
    $headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
    $bodyObj = @{"value" = $wrappedSecret; "attributes" = $secretAttributes; "tags" = $secretTags}
    $body = $bodyObj | ConvertTo-Json

    $response = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -Body $body

    Write-Host "Stored secret successfully"

    $secretUrl = $response.id

Use $KeyEncryptionKey e $secretUrl no passo seguinte para ligar o disco do sistema operativo usando um KEK.

Especifique um URL secreto ao anexar um disco do SO

Sem usar um KEK

Ao anexar o disco do sistema operativo, indique $secretUrl. A URL é gerada na secção intitulada "Segredo de encriptação do disco não encriptado com uma KEK".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $VhdUri `
            -VhdUri $OSDiskUri `
            -Windows `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl

Usando um KEK

Ao anexares o disco do sistema operativo, passa $KeyEncryptionKey e $secretUrl. O endereço URL é gerado na secção "Segredo de encriptação do disco encriptado com uma KEK".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $CopiedTemplateBlobUri `
            -VhdUri $OSDiskUri `
            -Windows `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl `
            -KeyEncryptionKeyVaultId $KeyVault.ResourceId `
            -KeyEncryptionKeyURL $KeyEncryptionKey.Id