Scripts de exemplo do Azure Disk Encryption para VMs Linux
Atenção
Este artigo faz referência ao CentOS, uma distribuição Linux com status de Fim de Vida (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
- Habilite a criptografia de disco em uma VM Linux existente ou em execução
- Desativar a criptografia em uma VM Linux em execução
- A desativação da criptografia só é permitida em volumes de dados para VMs Linux.
Criptografar ou descriptografar VMs com um aplicativo Microsoft Entra (versão anterior)
- Habilite a criptografia de disco em uma VM Linux existente ou em execução
- Desativar a criptografia em uma VM Linux em execução
- A desativação da criptografia só é permitida em volumes de dados para VMs Linux.
- Criar um novo disco gerenciado criptografado a partir de um VHD/blob de armazenamento pré-criptografado
- Cria um novo disco gerenciado criptografado desde que um VHD pré-criptografado e suas configurações de criptografia correspondentes
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
Crie uma VM usando uma das distribuições especificadas anteriormente.
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.
Saia das sessões SSH.
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 umSIGKILL
arquivo . 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.Monitore periodicamente o progresso da criptografia usando as instruções na próxima seção.
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
eDataVolumesEncrypted
aparecem comoUnknown
em algumas distribuições. Com o WALinuxAgent versão 2.1.5 e posterior, esse problema é corrigido automaticamente. Se você virUnknown
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.
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:
Selecione Configurar volumes criptografados ao particionar os discos.
Crie uma unidade de inicialização separada, que não deve ser criptografada. Criptografe sua unidade raiz.
Forneça uma frase secreta. Esta é a frase secreta que carregou para o cofre de chaves.
Termine o particionamento.
Quando você inicializar a VM e for solicitada uma senha, use a senha fornecida na etapa 3.
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:
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
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
Adicione permissões executáveis ao script:
sudo chmod +x /usr/local/sbin/azure_crypt_key.sh
Edite
/etc/initramfs-tools/modules
acrescentando linhas:vfat ntfs nls_cp437 nls_utf8 nls_iso8859-1
Execute
update-initramfs -u -k all
para atualizar o initramfs para fazer okeyscript
take effect.Agora você pode desprovisionar a VM.
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