Compartilhar via


Exemplos de scripts do Azure Disk Encryption para VMs do Linux

Cuidado

Este artigo faz referência ao CentOS, uma distribuição Linux que está em status de fim do serviço (EOL). Considere seu uso e planeje adequadamente. Para obter mais informações, veja as Diretrizes sobre fim da vida útil do CentOS.

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

Este artigo fornece scripts de exemplo para a preparação de VHDs e outras tarefas previamente criptografados.

Observação

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

Exemplos de scripts do PowerShell para Azure Disk Encryption

  • Listar todas as VMs criptografadas na assinatura

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

    Como alternativa, esses cmdlets mostrarão todas as VMs criptografadas de ADE (mas não a versão de 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 de VMSS criptografadas na assinatura

    Você pode encontrar todas as instâncias de VMSS criptografadas por ADE e a versão de extensão, em todos os grupos de recursos presentes em uma assinatura, usando este 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 do PowerShell de pré-requisitos do Azure Disk Encryption

Se você já estiver familiarizado com os pré-requisitos do Azure Disk Encryption, use o script do PowerShell de pré-requisitos do Azure Disk Encryption. Para obter um exemplo de como usar esse script do PowerShell, confira o Guia de início rápido para 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 de VMs existentes em um grupo de recursos existente.

A tabela a seguir mostra quais parâmetros podem ser usados no script do PowerShell:

Parâmetro Descrição Obrigatório?
$resourceGroupName Nome do grupo de recursos ao qual o KeyVault pertence. Um grupo de recursos com esse nome será criado caso ele ainda não exista. True
$keyVaultName Nome do KeyVault no qual as chaves de criptografia devem ser colocadas. Um cofre com esse nome será criado caso ele ainda não exista. True
$location Local do KeyVault. Verifique se o KeyVault e as VMs a serem criptografadas estão no mesmo local. Obtenha uma lista de locais com Get-AzLocation. True
$subscriptionId Identificador da assinatura do Azure a ser usada. Você pode obter sua ID de assinatura com Get-AzSubscription. True
$aadAppName O nome do aplicativo do Microsoft Entra que será usado para gravar segredos no KeyVault. Será criado um novo aplicativo com esse nome caso ele não exista. Se esse aplicativo já existir, passe o parâmetro aadClientSecret para o script. Falso
$aadClientSecret Segredo do cliente do aplicativo do Microsoft Entra que foi criado anteriormente. Falso
$keyEncryptionKeyName Nome da chave de criptografia da chave opcional no KeyVault. Uma chave com esse nome será criada caso ela ainda não exista. Falso

Criptografar ou descriptografar VMs sem um aplicativo do Microsoft Entra

Criptografar ou descriptografar VMs com um aplicativo do Microsoft Entra (versão anterior)

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

Pré-requisitos para a criptografia de disco do sistema operacional

  • A VM deve estar usando uma distribuição compatível com a criptografia de disco de SO, conforme listado nos Sistemas operacionais com suporte para o Azure Disk Encryption
  • A VM deve ser criada com base na imagem do Marketplace no Azure Resource Manager.
  • VM do Azure com, no mínimo, 4 GB de RAM (o tamanho recomendável é de 7 GB). Consulte os Requisitos de memória para obter mais informações.
  • (Para RHEL e CentOS) Desabilite o SELinux. Para desabilitar SELinux, confira "4.4.2. Desabilitando o SELinux" no Guia do Administrador e Usuário do SELinux na VM.
  • Depois de desabilitar o SELinux, reinicialize a VM pelo menos uma vez.

Etapas

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

  2. Configure a VM de acordo com suas necessidades. Se você for criptografar todas as unidades (sistema operacional + dados), as unidades de dados precisarão ser especificadas e montadas em /etc/fstab.

    Observação

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

  3. Saia das sessões do SSH.

  4. Para criptografar o SO, especifique volumeType como Todos ou SO ao habilitar a criptografia.

    Observação

    Todos os processos de espaço de usuário que não estão sendo executados como serviços systemd deverão ser encerrados com um SIGKILL. Reinicialize 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. Periodicamente, monitore o progresso da criptografia usando as instruções da próxima seção.

  6. Depois que Get-AzVmDiskEncryptionStatus mostrar "VMRestartPending", reinicie a VM entrando nela ou usando o portal, o 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 reinicializar, recomendamos que você salve os diagnósticos de inicialização da VM.

Monitorando o progresso da criptografia do sistema operacional

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

  • Use o cmdlet Get-AzVmDiskEncryptionStatus e verifique 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 atingir a "Criptografia de disco do sistema operacional iniciada", levará cerca de 40 a 50 minutos em uma VM com backup de armazenamento Premium.

    Devido ao problema 388 no WALinuxAgent, OsVolumeEncrypted e DataVolumesEncrypted são mostrados como Unknown em algumas distribuições. Com a versão 2.1.5 WALinuxAgent e posterior, esse problema é corrigido automaticamente. Caso você veja Unknown na saída, poderá verificar o status da criptografia de disco usando o Explorador de Recursos do Azure.

    Vá para Explorador 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
    

    Em InstanceView, role a tela para baixo para ver o status da criptografia das unidades.

    Exibição de instância VM

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

  • Entre na VM via SSH e obtenha o log de extensão de:

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

    É recomendado que você não entre na máquina virtual enquanto a criptografia do sistema operacional está em andamento. Copie os logs apenas quando os outros dois métodos falharem.

Preparar um VHD Linux previamente criptografado

A preparação para VHDs previamente criptografados pode variar dependendo da distribuição. Exemplos sobre a preparação do Ubuntu, openSUSE e centOS 7 estão disponíveis.

Configure a criptografia durante a instalação da distribuição, realizando as seguintes etapas:

  1. Selecione Configurar volumes criptografados ao particionar os discos.

    Instalação do Ubuntu 16.04: configurar volumes criptografados

  2. Crie uma unidade de inicialização separada que não deverá ser criptografada. Criptografe a unidade de inicialização.

    Instalação do Ubuntu 16.04: selecionar dispositivos para criptografar

  3. Forneça uma senha. Essa é a senha que você enviou para o cofre de chaves.

    Instalação do Ubuntu 16.04: fornecer a frase secreta

  4. Conclua o particionamento.

    Instalação do Ubuntu 16.04: concluir o particionamento

  5. Quando você inicializar a VM e precisar fornecer uma frase secreta, use a senha que forneceu na etapa 3.

    Instalação do Ubuntu 16.04: fornecer a frase secreta na inicialização

  6. Prepare a VM para upload no Azure usando estas instruções. Não execute a última etapa (desprovisionamento da VM) ainda.

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

  1. Criar um arquivo sob /usr/local/sbin/azure_crypt_key.sh, com o conteúdo no seguinte script. Preste atenção ao KeyFileName, pois esse é o nome do arquivo de 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 de criptografia em /etc/crypttab. Ele deverá ser parecido com:

     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 linha:

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

  6. Agora, você poderá desprovisionar a VM.

    Instalação do Ubuntu 16.04: update-initramfs

  7. Continue na próxima etapa e carregue o VHD no Azure.

Carregue o VHD criptografado para uma conta de armazenamento do Azure

Depois que a criptografia DM-Crypt estiver habilitada, o VHD criptografado local precisará ser carregado para a conta de armazenamento.

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

Carregar o segredo da VM previamente criptografada no cofre de chaves

Ao criptografar usando um aplicativo do Microsoft Entra (versão anterior), você precisa carregar o segredo da criptografia de disco obtido anteriormente, como um segredo do seu cofre de chaves. O cofre de chaves deve ter a criptografia de disco e permissões habilitadas para o seu cliente do 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 uma KEK

Para configurar o segredo no cofre de chaves, use Set-AzKeyVaultSecret. A frase secreta é codificada como uma cadeia de caracteres base64 e carregada para o cofre de chaves. Além disso, verifique se as seguintes marcas estão definidas ao criar 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

Use o $secretUrl na próxima etapa para anexar o disco do sistema operacional sem usar KEK.

Segredo de criptografia de disco criptografado com uma KEK

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

    # 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 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 na próxima etapa para anexar o disco do sistema operacional usando KEK.

Especificar uma URL secreta ao anexar um disco do sistema operacional

Sem usar uma KEK

Enquanto você está anexando o disco do sistema operacional, é necessário passar $secretUrl. A URL foi gerada na seção "Segredo de criptografia de disco não criptografado com uma KEK".

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

Usando uma KEK

Ao anexar o disco do sistema operacional, passe $KeyEncryptionKey e $secretUrl. A URL foi gerada na seção "Segredo de criptografia de disco criptografado com 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