Partilhar via


Scripts de exemplo do Azure Disk Encryption para VMs Linux

Atenção

Este artigo faz referência ao CentOS, uma distribuição Linux que está se aproximando do status de Fim da Vida Útil (EOL). Por favor, considere o seu uso e planeje de acordo. Para obter mais informações, consulte as diretrizes de Fim da 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, 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

    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

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 a seguir mostra quais parâmetros podem ser usados no script do PowerShell:

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

Criptografar ou descriptografar VMs sem um aplicativo Microsoft Entra

Criptografar ou descriptografar VMs com um aplicativo 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. Desativando o SELinux" no Guia do Usuário 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

    Todos os processos de espaço do usuário que não estão sendo executados como systemd serviços devem ser eliminados com um SIGKILLarquivo . 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 que Get-AzVmDiskEncryptionStatus mostrar "VMRestartPending", reinicie sua VM entrando nela ou usando o portal, PowerShell ou 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 o diagnóstico de inicialização 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 em uma VM com armazenamento Premium.

    Devido ao problema #388 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].

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

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

    Recomendamos que você não entre na VM enquanto a criptografia do sistema operacional estiver em andamento. Copie os logs somente 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 sua unidade raiz.

    Ubuntu 16.04 Setup - Selecione dispositivos para criptografar

  3. Forneça uma frase secreta. Esta é a frase secreta que carregou 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 de 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 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 para fazer o keyscript take effect.

  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, 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

Use o na próxima etapa para conectar o disco do sistema operacional sem usar o $secretUrl 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. Use a API wrap para primeiro criptografar o segredo usando a chave de criptografia de chave. 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 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 conectar o disco do sistema operacional usando o KEK.

Especifique um URL secreto ao anexar um disco do SO

Sem usar um KEK

Enquanto você está anexando o disco do sistema operacional, você precisa passar $secretUrl. O URL foi gerado na seção "Segredo de criptografia de disco não criptografado com um KEK".

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

Usando um KEK

Quando você anexar o disco do sistema operacional, passe $KeyEncryptionKey e $secretUrl. O URL foi gerado na seção "Segredo de criptografia de disco criptografado com um 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