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
- Habilitar criptografia de disco em uma VM do Linux em execução ou existente
- Desabilitar criptografia em uma VM do Linux em execução
- Desabilitar criptografia somente é permitida em volumes de Dados para VMs do Linux.
Criptografar ou descriptografar VMs com um aplicativo do Microsoft Entra (versão anterior)
- Habilitar criptografia de disco em uma VM do Linux em execução ou existente
- Desabilitar criptografia em uma VM do Linux em execução
- Desabilitar criptografia somente é permitida em volumes de Dados para VMs do Linux.
- Criar um novo disco gerenciado criptografado a partir de um blob de armazenamento/VHD previamente criptografado
- Cria um disco gerenciado criptografado fornecido usando um VHD pré-criptografado e as configurações de criptografia correspondentes
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
Crie uma VM usando uma das distribuições especificadas anteriormente.
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.
Saia das sessões do SSH.
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 umSIGKILL
. 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.Periodicamente, monitore o progresso da criptografia usando as instruções da próxima seção.
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
eDataVolumesEncrypted
são mostrados comoUnknown
em algumas distribuições. Com a versão 2.1.5 WALinuxAgent e posterior, esse problema é corrigido automaticamente. Caso você vejaUnknown
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.
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:
Selecione Configurar volumes criptografados ao particionar os discos.
Crie uma unidade de inicialização separada que não deverá ser criptografada. Criptografe a unidade de inicialização.
Forneça uma senha. Essa é a senha que você enviou para o cofre de chaves.
Conclua o particionamento.
Quando você inicializar a VM e precisar fornecer uma frase secreta, use a senha que forneceu na etapa 3.
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:
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
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
Adicione permissões executáveis ao script:
sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
Edite
/etc/initramfs-tools/modules
acrescentando linha:vfat ntfs nls_cp437 nls_utf8 nls_iso8859-1
Execute
update-initramfs -u -k all
para atualizar o initramfs para fazer com que okeyscript
entre em vigor.Agora, você poderá desprovisionar a VM.
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