Scripts de exemplo do Azure Disk Encryption para VMs Linux

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.

Atenção

Este artigo refere o CentOS, uma distribuição Linux que está em estado de fim de vida útil (EOL). Considere a sua utilização e planeie em conformidade. Para obter mais informações, consulte as diretrizes de fim de vida útil do CentOS.

Aplica-se a: ✔️ Linux VMs ✔️ Conjuntos de escala flexível

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

Nota

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

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

  • Listar todas as VMs criptografadas em sua assinatura

    Você pode encontrar todas as VMs criptografadas pelo ADE e a versão da extensão, em todos os grupos de recursos presentes em uma assinatura, usando esse script do PowerShell.

    Como alternativa, esses cmdlets mostrarão todas as VMs criptografadas pelo 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

    Você pode encontrar todas as instâncias VMSS criptografadas pelo ADE e a versão da extensão, em todos os grupos de recursos presentes em uma assinatura, usando esse script do PowerShell.

  • 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}}
    

Usando o script PowerShell de pré-requisitos do Azure Disk Encryption

Caso já esteja familiarizado com os pré-requisitos da Criptografia de Disco do Azure, poderá utilizar 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 os parâmetros que pode usar no script PowerShell:

Parâmetro Descrição Obrigatório?
$resourceGroupName Nome do grupo de recursos ao qual o KeyVault pertence. O script cria um novo grupo de recursos com este nome, caso não exista nenhum. Verdadeiro
$keyVaultName Nome do KeyVault onde colocar chaves de encriptação. O script cria um novo cofre com este nome se não existir um. Verdadeiro
$location Localização do KeyVault. Verifica se o KeyVault e as VMs a encriptar estão no mesmo local. Obtenha uma lista de localizações com 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 KeyVault. O script cria uma nova aplicação com este nome se não existir uma. Se esse aplicativo já existir, passe 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 de criptografia de chave opcional no KeyVault. O script cria uma nova chave com este nome se não existir uma. Falso

Criptografar ou descriptografar VMs sem um aplicativo Microsoft Entra

Encrypt or decrypt VMs with a Microsoft Entra app (previous release) Criptografar ou descriptografar VMs usando uma aplicação Microsoft Entra (versão anterior)

Criptografando uma unidade do sistema operacional em uma VM Linux em execução

Pré-requisitos para criptografia de disco do sistema operacional

  • A VM deve estar usando uma distribuição compatível com a criptografia de disco do sistema operacional, conforme listado nos sistemas operacionais com suporte do Azure Disk Encryption
  • A VM deve ser criada a partir da imagem do Marketplace no Azure Resource Manager.
  • VM do Azure com pelo menos 4 GB de RAM (o tamanho recomendado é 7 GB). Consulte Requisitos de memória para obter mais informações.
  • (Para RHEL e CentOS) Desative o SELinux. Para desativar o SELinux, consulte "4.4.2. "Desativar o SELinux" no Guia do Utilizador e do Administrador do SELinux na VM.
  • Depois de desativar o SELinux, reinicie a VM pelo menos uma vez.

Passos

  1. Crie uma VM usando uma das distribuições especificadas anteriormente.

  2. Configure a VM de acordo com suas necessidades. Se você vai criptografar todas as unidades (OS + dados), as unidades de dados precisam ser especificadas e montáveis a partir de /etc/fstab.

    Nota

    Use UUID=... para especificar unidades de dados em /etc/fstab em vez de especificar o nome do dispositivo de bloco (por exemplo, /dev/sdb1). Durante a criptografia, a ordem das unidades muda na VM. Se sua VM depender de uma ordem específica de dispositivos de bloco, ela não conseguirá montá-los após a criptografia.

  3. Saia das sessões SSH.

  4. Para criptografar o sistema operacional, especifique volumeType como All ou OS ao habilitar a criptografia.

    Nota

    Termine todos os processos no espaço do utilizador que não estejam em execução como serviços systemd com um SIGKILL. Reinicie a VM. Ao habilitar a criptografia de disco do sistema operacional em uma VM em execução, planeje o tempo de inatividade da VM.

  5. Monitore periodicamente o progresso da criptografia usando as instruções na próxima seção.

  6. Depois de o Get-AzVmDiskEncryptionStatus mostrar "VMRestartPending", reinicie a sua VM iniciando sessão nela ou utilizando o portal, PowerShell ou a CLI.

    C:\> Get-AzVmDiskEncryptionStatus  -ResourceGroupName $ResourceGroupName -VMName $VMName
    -ExtensionName $ExtensionName
    
    OsVolumeEncrypted          : VMRestartPending
    DataVolumesEncrypted       : NotMounted
    OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
    ProgressMessage            : OS disk successfully encrypted, reboot the VM
    

    Antes de reiniciares, guarda os diagnósticos de arranque da VM.

Monitorando o progresso da criptografia do sistema operacional

Você pode monitorar o progresso da criptografia do sistema operacional de três maneiras:

  • Use o Get-AzVmDiskEncryptionStatus cmdlet e inspecione o campo ProgressMessage:

    Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name
    
    OsVolumeEncrypted          : EncryptionInProgress
    DataVolumesEncrypted       : NotMounted
    OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
    ProgressMessage            : OS disk encryption started
    

    Depois que a VM atinge "Criptografia de disco do sistema operacional iniciada", leva cerca de 40 a 50 minutos numa VM com armazenamento Premium.

    Por causa da edição #388 do GitHub no WALinuxAgent, OsVolumeEncrypted e DataVolumesEncrypted aparecem como Unknown em algumas distribuições. Com o WALinuxAgent versão 2.1.5 e posterior, esse problema é corrigido automaticamente. Se você vir Unknown na saída, poderá verificar o status da criptografia de disco usando o Gerenciador de Recursos do Azure.

    Vá para o Gerenciador de Recursos do Azure e expanda essa hierarquia no painel de seleção à esquerda:

    |-- subscriptions
       |-- [Your subscription]
            |-- resourceGroups
                 |-- [Your resource group]
                      |-- providers
                           |-- Microsoft.Compute
                                |-- virtualMachines
                                     |-- [Your virtual machine]
                                          |-- InstanceView
    

    No InstanceView, role para baixo para ver o status de criptografia de suas unidades.

    Visualização da instância da VM

  • Observe o diagnóstico de inicialização. As mensagens da extensão ADE devem ser prefixadas com [AzureDiskEncryption].

  • Inicie sessão na VM através de SSH e obtenha o registo da extensão em:

    /var/log/azure/Microsoft.Azure.Security.AzureDiskEncryptionForLinux

    Não faça login na VM enquanto a encriptação do sistema operativo está em curso. Copie os registos apenas quando os outros dois métodos falharem.

Preparar um VHD Linux pré-criptografado

A preparação para VHDs pré-criptografados pode variar dependendo da distribuição. Exemplos sobre como preparar o Ubuntu, openSUSE e CentOS 7 estão disponíveis.

Configure a criptografia durante a instalação de distribuição executando as seguintes etapas:

  1. Selecione Configurar volumes criptografados ao particionar os discos.

    Ubuntu 16.04 Setup - Configurar volumes criptografados

  2. Crie uma unidade de inicialização separada, que não deve ser criptografada. Criptografe a sua unidade raiz.

    Ubuntu 16.04 Setup - Selecione dispositivos para criptografar

  3. Forneça uma frase secreta. Carregaste esta palavra-passe para o cofre de chaves.

    Configuração do Ubuntu 16.04 - Forneça senha

  4. Termine o particionamento.

    Ubuntu 16.04 Setup - Concluir particionamento

  5. Quando você inicializar a VM e for solicitada uma senha, use a senha fornecida na etapa 3.

    Ubuntu 16.04 Setup - Forneça senha na inicialização

  6. Prepare a VM para carregar no Azure usando estas instruções. Ainda não execute a última etapa (desprovisionar a VM).

Configure a criptografia para trabalhar com o Azure executando as seguintes etapas:

  1. Crie um arquivo em /usr/local/sbin/azure_crypt_key.sh, com o conteúdo no script a seguir. Preste atenção ao KeyFileName, porque é o nome do ficheiro da frase secreta usado pelo Azure.

    #!/bin/sh
    MountPoint=/tmp-keydisk-mount
    KeyFileName=LinuxPassPhraseFileName
    echo "Trying to get the key from disks ..." >&2
    mkdir -p $MountPoint
    modprobe vfat >/dev/null 2>&1
    modprobe ntfs >/dev/null 2>&1
    sleep 2
    OPENED=0
    cd /sys/block
    for DEV in sd*; do
    
        echo "> Trying device: $DEV ..." >&2
        mount -t vfat -r /dev/${DEV}1 $MountPoint >/dev/null||
        mount -t ntfs -r /dev/${DEV}1 $MountPoint >/dev/null
        if [ -f $MountPoint/$KeyFileName ]; then
                cat $MountPoint/$KeyFileName
                umount $MountPoint 2>/dev/null
                OPENED=1
                break
        fi
        umount $MountPoint 2>/dev/null
    done
    
      if [ $OPENED -eq 0 ]; then
        echo "FAILED to find suitable passphrase file ..." >&2
        echo -n "Try to enter your password: " >&2
        read -s -r A </dev/console
        echo -n "$A"
     else
        echo "Success loading keyfile!" >&2
    fi
    
  2. Altere a configuração da criptografia em /etc/crypttab. Deverá ter o seguinte aspeto:

     xxx_crypt uuid=xxxxxxxxxxxxxxxxxxxxx none luks,discard,keyscript=/usr/local/sbin/azure_crypt_key.sh
    
  3. Adicione permissões executáveis ao script:

     sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
    
  4. Edite /etc/initramfs-tools/modules acrescentando linhas:

     vfat
     ntfs
     nls_cp437
     nls_utf8
     nls_iso8859-1
    
  5. Execute update-initramfs -u -k all para atualizar o initramfs e fazer com que o keyscript entre em vigor.

  6. Agora você pode desprovisionar a VM.

    Configuração do Ubuntu 16.04 - update-initramfs

  7. Continue para a próxima etapa e carregue seu VHD no Azure.

Carregar VHD criptografado em uma conta de armazenamento do Azure

Depois que a criptografia DM-Crypt estiver ativada, o VHD criptografado local precisa ser carregado para 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

Ao criptografar usando um aplicativo Microsoft Entra (versão anterior), o segredo de criptografia de disco obtido anteriormente deve ser carregado como um segredo no cofre de chaves. O cofre de chaves precisa ter criptografia de disco e permissões habilitadas para seu cliente Microsoft Entra.

 $AadClientId = "My-AAD-Client-Id"
 $AadClientSecret = "My-AAD-Client-Secret"

 $key vault = New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -Location $Location

 Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -ServicePrincipalName $AadClientId -PermissionsToKeys all -PermissionsToSecrets all
 Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -EnabledForDiskEncryption

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, verifique se as seguintes tags estão definidas quando criar o segredo no Key Vault.


 # 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 a 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 wrap para primeiro cifrar o segredo usando 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 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 KEK.

Especifique um URL secreto ao anexar um disco do SO

Sem usar um KEK

Ao anexar o disco do sistema operativo, é necessário passar $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 `
            -Linux `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl

Usando um KEK

Quando anexar o disco do sistema operacional, passe $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 `
            -Linux `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl `
            -KeyEncryptionKeyVaultId $KeyVault.ResourceId `
            -KeyEncryptionKeyURL $KeyEncryptionKey.Id