Pular para o conteúdo principal

Fundamentação Teórica: Configure Encryption at Host for Azure Virtual Machines


1. Intuição Inicial

Imagine que você tem um servidor físico em um datacenter. Os dados no disco estão criptografados. Mas quando o servidor lê esses dados para processá-los, eles passam por uma área de armazenamento temporário no próprio servidor físico, chamada de cache, antes de chegarem à CPU. Essa área temporária pode ficar em texto claro (não criptografado), mesmo que o disco principal esteja criptografado.

No Azure, o mesmo cenário existe. Uma VM tem seu disco criptografado, mas o servidor físico (o host) que hospeda aquela VM tem áreas de cache e armazenamento temporário onde dados podem existir momentaneamente sem criptografia.

Encryption at Host resolve exatamente esse ponto cego: garante que todos os dados associados a uma VM sejam criptografados mesmo no host físico do Azure, cobrindo o cache de discos de SO e dados, discos temporários e fluxos de dados em cache, formando uma proteção de criptografia de ponta a ponta completa.

É a diferença entre criptografar apenas o cofre e criptografar também a mesa onde o cofre é aberto.


2. Contexto

O panorama de criptografia de discos no Azure

Para entender Encryption at Host, é necessário primeiro entender as outras formas de criptografia de disco no Azure:

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

SSE (Storage Service Encryption) é automática e cobre os dados em repouso nos discos gerenciados, mas não cobre o cache do host físico onde a VM roda.

Azure Disk Encryption (ADE) criptografa dentro da VM usando BitLocker (Windows) ou DM-Crypt (Linux), mas não elimina a lacuna do host para discos temporários e cache.

Encryption at Host fecha a lacuna: aplica criptografia diretamente no host físico antes que qualquer dado seja escrito no armazenamento do Azure Storage, cobrindo o que as outras opções deixam descoberto.

Por que Encryption at Host existe

A lacuna técnica que motiva o Encryption at Host é o seguinte: discos gerenciados têm criptografia SSE por padrão, mas antes dos dados serem gravados de volta ao armazenamento, eles passam pelo cache do host (RAM ou NVMe temporário no servidor físico). Esse cache pode não estar criptografado, criando uma janela onde dados sensíveis ficam expostos no hardware do Azure.

Para cargas de trabalho com requisitos de compliance como PCI-DSS, HIPAA ou ISO 27001, esta lacuna é inaceitável. Encryption at Host garante que não há nenhum ponto no ciclo de vida dos dados onde eles existam sem criptografia, mesmo no hardware físico do Azure.


3. Construção dos Conceitos

3.1 O que é o "host" no contexto do Azure

No Azure, suas VMs rodam em servidores físicos chamados de hosts (ou nós físicos). Esses hosts são máquinas de alta densidade que hospedam múltiplas VMs de clientes diferentes, com isolamento por hypervisor (Hyper-V).

O host físico tem seus próprios componentes de hardware, incluindo:

  • Cache de disco: área de armazenamento temporário de alta velocidade para dados de discos gerenciados
  • Disco temporário (Temp Disk): um disco efêmero presente em muitos SKUs de VM, não persistente, que existe apenas no host local

Esses componentes ficam fora do escopo da criptografia SSE padrão e do ADE.

3.2 O que Encryption at Host criptografa especificamente

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

Com Encryption at Host habilitado:

  • Cache dos discos de SO e dados: criptografado com chaves PMK (Platform Managed Keys) ou CMK (Customer Managed Keys)
  • Disco temporário: criptografado com PMK ou CMK (quando configurado com CMK, requer Disk Encryption Set)
  • Fluxos de dados em cache: o pipeline completo de dados é criptografado

3.3 Chaves de criptografia: PMK vs. CMK

Platform Managed Keys (PMK): chaves geradas, armazenadas e gerenciadas completamente pela Microsoft. O cliente não tem acesso ou controle sobre as chaves. É o modo padrão.

Customer Managed Keys (CMK): chaves geradas e armazenadas pelo cliente no Azure Key Vault ou Azure Managed HSM. O cliente controla o ciclo de vida das chaves (rotação, revogação, expiração). Requer um Disk Encryption Set como intermediário.

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

3.4 Disk Encryption Set

O Disk Encryption Set é um recurso ARM que serve como intermediário entre os discos gerenciados (e Encryption at Host) e o Key Vault. Ele:

  • Recebe uma identidade gerenciada (System-assigned Managed Identity)
  • Essa identidade recebe permissão de Get, WrapKey, UnwrapKey no Key Vault
  • Os discos usam o Disk Encryption Set para acessar as chaves do Key Vault

3.5 Pré-requisito: registrar o feature no subscription

Antes de usar Encryption at Host, o feature precisa ser registrado na subscription:

az feature register \
--name EncryptionAtHost \
--namespace Microsoft.Compute

Isso é diferente de outros recursos: Encryption at Host requer um opt-in explícito no nível da subscription antes de poder ser habilitado nas VMs.

3.6 Suporte por SKU de VM

Encryption at Host não é suportado em todos os SKUs de VM. Os SKUs sem suporte incluem alguns tipos mais antigos ou de capacidade básica:

  • Não suportados: série B (Burstable), série A (básico), Lsv2 algumas versões
  • Suportados: Dsv3, Dsv4, Esv3, Esv4, Fsv2, M-series, e a maioria dos SKUs modernos

Para verificar se um SKU específico suporta Encryption at Host:

az vm list-skus \
--location "brazilsouth" \
--resource-type virtualMachines \
--query "[?capabilities[?name=='EncryptionAtHostSupported' && value=='True']].name" \
--output table

4. Visão Estrutural

Comparação de cobertura entre métodos de criptografia

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

Fluxo de dados com Encryption at Host habilitado

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

O ponto crítico é que a criptografia e descriptografia ocorrem no host físico, não dentro da VM. A VM em si opera com dados em texto claro (como sempre fez), mas o host nunca mantém dados em claro fora do escopo da VM.


5. Funcionamento na Prática

Ciclo de habilitação de Encryption at Host

100%
Scroll para zoom · Arraste para mover · 📱 Pinch para zoom no celular

Comportamentos não óbvios

Habilitar em VM existente requer desalocação. Não é possível habilitar Encryption at Host em uma VM em execução. A VM deve ser stopped (deallocated), não apenas parada. "Stopped" no Azure não libera o hardware; apenas "deallocated" libera o host físico e permite a reconfiguração.

O disco temporário não é persistente, mas pode conter dados sensíveis. O disco temporário (D: no Windows, /dev/sdb em muitas distros Linux) é recriado a cada alocação da VM. Sem Encryption at Host, dados deixados nele podem potencialmente ser acessados se o host físico for reutilizado por outra VM do mesmo ou de outro cliente (embora o Azure zere a memória entre alocações). Com EoH, esses dados estão criptografados mesmo no host.

Encryption at Host não substitui Azure Disk Encryption. São complementares. ADE criptografa dentro da VM (proteção contra acesso ao arquivo VHD) enquanto EoH criptografa no host (proteção contra acesso ao hardware físico). Usar ambos é o nível mais alto de proteção disponível fora de Confidential Computing.

Combinação com ADE tem considerações específicas. Quando ADE e EoH são usados juntos, o disco de SO é duplamente criptografado: primeiro pelo ADE (dentro da VM) e depois pelo EoH (no host). O disco temporário, que ADE não criptografa nativamente no Linux, passa a ser coberto pelo EoH.

Discos Ultra e Premium SSD v2 têm comportamento diferente. Para esses tipos de disco, Encryption at Host se comporta como SSE com CMK para o cache, mas a implementação pode variar. Verifique a documentação mais recente para detalhes específicos de cada tipo de disco.


6. Formas de Implementação

Portal do Azure

Quando usar: configuração manual de VMs individuais, verificação visual

Para nova VM:

  1. Portal > Virtual Machines > + Create
  2. Aba Disks
  3. Seção Encryption > habilitar Encryption at host
  4. Se usando CMK: selecionar Key management e escolher o Disk Encryption Set
  5. Concluir a criação normalmente

Para VM existente (deve estar desalocada):

  1. Stop VM (garantir que está Deallocated, não apenas Stopped)
  2. Portal > VM > Disks > Additional settings
  3. Habilitar Encryption at host
  4. Save
  5. Iniciar a VM

Limitação: não reproduzível, sem controle de versão.


Azure CLI

# Passo 1: Verificar e registrar o feature na subscription
az feature show \
--name EncryptionAtHost \
--namespace Microsoft.Compute \
--query "properties.state" \
--output tsv

# Se não estiver "Registered":
az feature register \
--name EncryptionAtHost \
--namespace Microsoft.Compute

# Aguardar registro (pode levar alguns minutos)
az feature show \
--name EncryptionAtHost \
--namespace Microsoft.Compute

# Após registro, propagar para o resource provider
az provider register --namespace Microsoft.Compute

# Passo 2: Verificar se o SKU suporta EoH
az vm list-skus \
--location "brazilsouth" \
--resource-type virtualMachines \
--query "[?name=='Standard_D4s_v5'].capabilities[?name=='EncryptionAtHostSupported'].value" \
--output tsv

# Passo 3a: Criar VM com EoH habilitado (PMK - Platform Managed Keys)
az vm create \
--resource-group "rg-vms-seguras" \
--name "vm-prod-001" \
--image "Win2022Datacenter" \
--size "Standard_D4s_v5" \
--encryption-at-host \
--admin-username "azureadmin" \
--admin-password "<senha-segura>" \
--location "brazilsouth"

# Passo 3b: Criar VM com EoH habilitado e CMK (Customer Managed Keys)
# Primeiro criar Key Vault e Disk Encryption Set

# Criar Key Vault com purge protection (obrigatório para CMK em discos)
az keyvault create \
--name "kv-disk-encryption" \
--resource-group "rg-vms-seguras" \
--location "brazilsouth" \
--enable-purge-protection true \
--sku premium

# Criar chave no Key Vault
az keyvault key create \
--vault-name "kv-disk-encryption" \
--name "disk-encryption-key" \
--protection software \
--kty RSA \
--size 4096

KEY_URL=$(az keyvault key show \
--vault-name "kv-disk-encryption" \
--name "disk-encryption-key" \
--query "key.kid" --output tsv)

KV_ID=$(az keyvault show \
--name "kv-disk-encryption" \
--resource-group "rg-vms-seguras" \
--query "id" --output tsv)

# Criar Disk Encryption Set
az disk-encryption-set create \
--name "des-prod" \
--resource-group "rg-vms-seguras" \
--location "brazilsouth" \
--key-url "$KEY_URL" \
--source-vault "$KV_ID" \
--encryption-type EncryptionAtRestWithCustomerKey

# Dar permissão ao Disk Encryption Set no Key Vault
DES_IDENTITY=$(az disk-encryption-set show \
--name "des-prod" \
--resource-group "rg-vms-seguras" \
--query "identity.principalId" --output tsv)

az keyvault set-policy \
--name "kv-disk-encryption" \
--object-id "$DES_IDENTITY" \
--key-permissions get wrapKey unwrapKey

DES_ID=$(az disk-encryption-set show \
--name "des-prod" \
--resource-group "rg-vms-seguras" \
--query "id" --output tsv)

# Criar VM com EoH + CMK
az vm create \
--resource-group "rg-vms-seguras" \
--name "vm-prod-cmk-001" \
--image "Ubuntu2204" \
--size "Standard_D4s_v5" \
--encryption-at-host \
--os-disk-encryption-set "$DES_ID" \
--admin-username "azureadmin" \
--ssh-key-values ~/.ssh/id_rsa.pub \
--location "brazilsouth"

# Passo 4: Habilitar EoH em VM existente (deve estar desalocada)
# Desalocar a VM primeiro
az vm deallocate \
--resource-group "rg-vms-seguras" \
--name "vm-existente"

# Habilitar Encryption at Host
az vm update \
--resource-group "rg-vms-seguras" \
--name "vm-existente" \
--set securityProfile.encryptionAtHost=true

# Iniciar a VM novamente
az vm start \
--resource-group "rg-vms-seguras" \
--name "vm-existente"

# Verificar se EoH está habilitado
az vm show \
--resource-group "rg-vms-seguras" \
--name "vm-prod-001" \
--query "securityProfile.encryptionAtHost" \
--output tsv

# Desabilitar EoH (também requer desalocação)
az vm deallocate \
--resource-group "rg-vms-seguras" \
--name "vm-prod-001"

az vm update \
--resource-group "rg-vms-seguras" \
--name "vm-prod-001" \
--set securityProfile.encryptionAtHost=false

az vm start \
--resource-group "rg-vms-seguras" \
--name "vm-prod-001"

Azure PowerShell

# Verificar registro do feature
Get-AzProviderFeature `
-FeatureName "EncryptionAtHost" `
-ProviderNamespace "Microsoft.Compute"

# Registrar se necessário
Register-AzProviderFeature `
-FeatureName "EncryptionAtHost" `
-ProviderNamespace "Microsoft.Compute"

# Verificar suporte no SKU
Get-AzVMSize -Location "brazilsouth" |
Where-Object { $_.Name -eq "Standard_D4s_v5" } |
Select-Object Name

# Criar VM com EoH via PowerShell
$vmConfig = New-AzVMConfig -VMName "vm-prod-001" -VMSize "Standard_D4s_v5"

# Habilitar EoH no config
$vmConfig = Set-AzVMSecurityProfile `
-VM $vmConfig `
-EncryptionAtHost $true

$cred = Get-Credential -Message "Admin credentials"

$vmConfig = Set-AzVMOperatingSystem `
-VM $vmConfig `
-Windows `
-ComputerName "vm-prod-001" `
-Credential $cred

$vmConfig = Set-AzVMSourceImage `
-VM $vmConfig `
-PublisherName "MicrosoftWindowsServer" `
-Offer "WindowsServer" `
-Skus "2022-Datacenter" `
-Version "latest"

$vmConfig = Add-AzVMNetworkInterface `
-VM $vmConfig `
-Id $nicId

New-AzVM `
-ResourceGroupName "rg-vms-seguras" `
-Location "brazilsouth" `
-VM $vmConfig

# Habilitar em VM existente
Stop-AzVM `
-ResourceGroupName "rg-vms-seguras" `
-Name "vm-existente" `
-Force

Update-AzVM `
-ResourceGroupName "rg-vms-seguras" `
-VM (Get-AzVM -ResourceGroupName "rg-vms-seguras" -Name "vm-existente") `
-EncryptionAtHost $true

Start-AzVM `
-ResourceGroupName "rg-vms-seguras" `
-Name "vm-existente"

# Verificar status
(Get-AzVM -ResourceGroupName "rg-vms-seguras" -Name "vm-prod-001").SecurityProfile.EncryptionAtHost

Bicep

// Disk Encryption Set para CMK
resource diskEncryptionSet 'Microsoft.Compute/diskEncryptionSets@2022-07-02' = {
name: 'des-prod'
location: 'brazilsouth'
identity: {
type: 'SystemAssigned' // Managed Identity para acessar Key Vault
}
properties: {
encryptionType: 'EncryptionAtRestWithCustomerKey'
activeKey: {
keyUrl: keyVaultKeyUri
sourceVault: {
id: keyVaultId
}
}
}
}

// VM com Encryption at Host habilitado
resource vm 'Microsoft.Compute/virtualMachines@2023-03-01' = {
name: 'vm-prod-001'
location: 'brazilsouth'
properties: {
hardwareProfile: {
vmSize: 'Standard_D4s_v5'
}
securityProfile: {
encryptionAtHost: true // Habilita Encryption at Host
}
storageProfile: {
imageReference: {
publisher: 'MicrosoftWindowsServer'
offer: 'WindowsServer'
sku: '2022-Datacenter'
version: 'latest'
}
osDisk: {
name: 'vm-prod-001-osdisk'
createOption: 'FromImage'
managedDisk: {
storageAccountType: 'Premium_LRS'
// Se usando CMK, adicionar diskEncryptionSet
diskEncryptionSet: {
id: diskEncryptionSet.id
}
}
}
dataDisks: [
{
lun: 0
name: 'vm-prod-001-datadisk'
createOption: 'Empty'
diskSizeGB: 128
managedDisk: {
storageAccountType: 'Premium_LRS'
diskEncryptionSet: {
id: diskEncryptionSet.id
}
}
}
]
}
osProfile: {
computerName: 'vm-prod-001'
adminUsername: adminUsername
adminPassword: adminPassword
}
networkProfile: {
networkInterfaces: [
{
id: nic.id
}
]
}
}
}

7. Controle e Segurança

Azure Policy para enforçar Encryption at Host

Para garantir que todas as VMs criadas na organização tenham Encryption at Host habilitado, use Azure Policy:

# Built-in policy: "Virtual machines should encrypt temp disks, caches, and data flows"
# Policy ID: 0961003e-5a0a-4549-abde-af6a37f2724d

az policy assignment create \
--name "enforce-encryption-at-host" \
--display-name "VMs must have Encryption at Host enabled" \
--policy "0961003e-5a0a-4549-abde-af6a37f2724d" \
--scope "/subscriptions/<sub-id>" \
--params '{"effect": {"value": "Deny"}}'

Com essa policy como Deny, qualquer tentativa de criar uma VM sem EoH será bloqueada.

Auditoria de VMs sem Encryption at Host

# Listar todas as VMs sem Encryption at Host habilitado
az graph query -q "
Resources
| where type == 'microsoft.compute/virtualmachines'
| where isnull(properties.securityProfile.encryptionAtHost) or properties.securityProfile.encryptionAtHost == false
| project name, resourceGroup, location, subscriptionId"

# Via CLI em uma subscription
az vm list \
--query "[?securityProfile.encryptionAtHost != true].{Name:name, RG:resourceGroup, EoH:securityProfile.encryptionAtHost}" \
--output table

Rotação de chaves CMK

Para Customer Managed Keys, a rotação regular é uma prática de segurança obrigatória:

# Criar nova versão da chave no Key Vault
az keyvault key rotate \
--vault-name "kv-disk-encryption" \
--name "disk-encryption-key"

# Obter URL da nova versão
NEW_KEY_URL=$(az keyvault key show \
--vault-name "kv-disk-encryption" \
--name "disk-encryption-key" \
--query "key.kid" --output tsv)

# Atualizar Disk Encryption Set com nova versão da chave
az disk-encryption-set update \
--name "des-prod" \
--resource-group "rg-vms-seguras" \
--key-url "$NEW_KEY_URL"

# O Azure automaticamente re-criptografa os discos com a nova chave
# (processo assíncrono, leva alguns minutos)

8. Tomada de Decisão

Quando usar cada abordagem de criptografia

SituaçãoSoluçãoMotivo
Requisito básico de compliance (dados em repouso)SSE padrão (automático)Já habilitado por padrão, sem configuração adicional
Dados sensíveis com requisito de não exposição no hostEncryption at Host (PMK)Cobre lacuna do cache do host sem complexidade de CMK
Compliance máximo (PCI-DSS Level 1, HIPAA, GDPR)Encryption at Host + CMKControle total sobre chaves + cobertura completa
Proteção dentro da VM também (acesso ao VHD)ADE + Encryption at HostADE protege dentro da VM, EoH protege no host
Necessidade de revogar acesso imediatamente a todos os dadosCMK (desabilitar chave no Key Vault)Revogar CMK torna todos os dados inacessíveis instantaneamente
VM efêmera de curta duração (< 1 hora)SSE padrão pode ser suficienteO risco é menor; avaliar requisito de compliance específico

PMK vs. CMK para Encryption at Host

AspectoPMK (Platform Managed)CMK (Customer Managed)
Controle sobre chavesNenhumTotal
Complexidade operacionalMínimaRequer Key Vault, Disk Encryption Set, IAM
Rotação de chavesAutomática pela MicrosoftManual ou automática via Key Vault
Custo adicionalNenhumKey Vault Premium + operações de chave
Revogação de emergênciaNão disponívelSim (desabilitar chave no Key Vault)
Requisito de complianceMaioria dos cenáriosPCI-DSS, HIPAA, requisitos governamentais

9. Boas Práticas

Habilite Encryption at Host em todas as VMs de produção por padrão. O overhead de performance é mínimo (praticamente imperceptível para a maioria dos workloads) e o ganho de segurança é significativo. Use Azure Policy com efeito Deny para garantir que nenhuma VM de produção seja criada sem EoH.

Registre o feature na subscription antes de precisar, não no momento do deploy. O registro do feature EncryptionAtHost é assíncrono e pode levar alguns minutos. Em pipelines de deploy automatizados, esse delay pode causar falhas se o feature não estiver registrado. Registre com antecedência como parte do processo de provisioning de novas subscriptions.

Use CMK apenas quando há real necessidade de controle de chaves. CMK adiciona complexidade operacional significativa: Key Vault precisa de purge protection, Disk Encryption Set precisa de permissões corretas, rotação de chaves precisa ser gerenciada. Para a maioria dos cenários, PMK com EoH é suficiente. Use CMK apenas quando compliance exigir controle de chaves pelo cliente.

Se usar CMK, habilite soft delete e purge protection no Key Vault. Esses são pré-requisitos para usar Key Vault com CMK em discos. Soft delete retém chaves deletadas por um período (padrão 90 dias), e purge protection impede a exclusão permanente antes do período expirar. Sem purge protection, você poderia acidentalmente tornar VMs inacessíveis.

Verifique o SKU antes de planejar EoH. Não assuma que todos os SKUs suportam EoH. Valide com az vm list-skus antes de commitar a arquitetura. Isso é especialmente importante ao migrar VMs legadas para novos SKUs.

Para VMs existentes, planeje a janela de manutenção. Habilitar EoH requer desalocação da VM. Para VMs críticas, coordene uma janela de manutenção. A VM ficará indisponível por alguns minutos durante a desalocação, habilitação e inicialização.


10. Erros Comuns

ErroPor que aconteceComo evitar
Falha na criação de VM com EoH: "EncryptionAtHost not registered"Feature não registrado na subscriptionRegistrar o feature antes de criar qualquer VM com EoH
Falha na criação: "SKU does not support EncryptionAtHost"SKU incompatível selecionadoVerificar suporte do SKU antes do deploy
VM não pode ser atualizada para habilitar EoH sem desalocaçãoVM em execução, tentativa sem deallocateSempre deallocate antes de habilitar/desabilitar EoH
Disk Encryption Set sem permissão no Key VaultManaged Identity não configurada corretamenteVerificar role assignment do DES no Key Vault após criação
Confundir EoH com ADENomes similares, funções diferentesEoH: criptografia no host físico; ADE: criptografia dentro da VM com BitLocker/DM-Crypt
Key Vault sem purge protection falhando para CMKRequisito obrigatório não atendidoHabilitar purge protection na criação do Key Vault
Assumir que EoH substitui ADEFalta de compreensão das camadasSão complementares; EoH não criptografa dentro da VM

O erro mais crítico

Criar VMs de produção sem registrar o feature de EoH na subscription e sem policy que enforçe isso. O resultado é uma frota de VMs que parece estar em conformidade (SSE ativo) mas tem a lacuna do cache do host exposta. Em uma auditoria de compliance, essa lacuna pode resultar em não conformidade com requisitos como PCI-DSS.


11. Operação e Manutenção

Monitorar status de EoH em toda a organização

# Resource Graph: todas as VMs com/sem EoH em toda a organização
az graph query -q "
Resources
| where type == 'microsoft.compute/virtualmachines'
| extend eohEnabled = tobool(properties.securityProfile.encryptionAtHost)
| summarize count() by eohEnabled
| order by eohEnabled desc"

# Listar VMs específicas sem EoH por subscription
az graph query -q "
Resources
| where type == 'microsoft.compute/virtualmachines'
| where isnull(properties.securityProfile.encryptionAtHost)
or properties.securityProfile.encryptionAtHost == false
| project name, resourceGroup, location, subscriptionId, vmSize=properties.hardwareProfile.vmSize
| order by subscriptionId, resourceGroup"

# Verificar conformidade via Azure Policy
az policy state list \
--policy-assignment "enforce-encryption-at-host" \
--filter "complianceState eq 'NonCompliant'" \
--query "[].{VM: resourceId, Estado: complianceState}" \
--output table

Verificar status de re-criptografia após rotação de CMK

# Verificar se discos estão usando a versão mais recente da chave
az disk list \
--resource-group "rg-vms-seguras" \
--query "[?encryption.diskEncryptionSetId!=null].{Name:name, KeyVersion:encryption.diskEncryptionSetId}" \
--output table

# Verificar status de migration do Disk Encryption Set
az disk-encryption-set show \
--name "des-prod" \
--resource-group "rg-vms-seguras" \
--query "provisioningState"

Limites e considerações

AspectoValor/Detalhe
SKUs suportadosMaioria dos SKUs modernos (verificar por região)
Overhead de performanceMínimo (~1-3% em workloads I/O intensivos)
Compatibilidade com ADEPode ser usado em conjunto
Compatibilidade com Azure Spot VMsSuportado
Compatibilidade com Scale SetsSuportado (definir na policy do Scale Set)
Disponibilidade por regiãoVerificar: algumas regiões podem não suportar todos os SKUs

12. Integração e Automação

Habilitar EoH em Scale Sets

resource vmss 'Microsoft.Compute/virtualMachineScaleSets@2023-03-01' = {
name: 'vmss-prod'
location: 'brazilsouth'
properties: {
virtualMachineProfile: {
securityProfile: {
encryptionAtHost: true // EoH para todas as VMs do Scale Set
}
storageProfile: {
imageReference: {
publisher: 'Canonical'
offer: '0001-com-ubuntu-server-jammy'
sku: '22_04-lts-gen2'
version: 'latest'
}
osDisk: {
createOption: 'FromImage'
managedDisk: {
storageAccountType: 'Premium_LRS'
}
}
}
}
}
}

Azure Policy Initiative para segurança de VMs

# Criar initiative que combina múltiplas policies de segurança de VM
az policy set-definition create \
--name "vm-security-baseline" \
--display-name "VM Security Baseline" \
--definitions '[
{
"policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/0961003e-5a0a-4549-abde-af6a37f2724d",
"policyDefinitionReferenceId": "encryption-at-host"
},
{
"policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/2b66f9f6-c26a-4e3f-ae73-2e2b13e53d35",
"policyDefinitionReferenceId": "azure-disk-encryption"
}
]' \
--params '{}'

# Atribuir initiative na subscription
az policy assignment create \
--name "vm-security-baseline-assignment" \
--policy-set-definition "vm-security-baseline" \
--scope "/subscriptions/<sub-id>"

Automação de habilitação em massa

# Habilitar EoH em todas as VMs de um Resource Group (com janela de manutenção)
$vms = Get-AzVM -ResourceGroupName "rg-producao"

foreach ($vm in $vms) {
if (-not $vm.SecurityProfile.EncryptionAtHost) {
Write-Output "Habilitando EoH em: $($vm.Name)"

# Desalocar
Stop-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Force

# Habilitar EoH
$vm.SecurityProfile = New-Object Microsoft.Azure.Management.Compute.Models.SecurityProfile
$vm.SecurityProfile.EncryptionAtHost = $true
Update-AzVM -ResourceGroupName $vm.ResourceGroupName -VM $vm

# Iniciar
Start-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name

Write-Output "EoH habilitado e VM reiniciada: $($vm.Name)"
} else {
Write-Output "EoH já habilitado: $($vm.Name)"
}
}

13. Resumo Final

Pontos essenciais:

  • Encryption at Host criptografa dados no host físico Azure antes de qualquer escrita em storage, cobrindo o cache de discos de SO e dados e o disco temporário
  • SSE padrão não cobre o cache do host; EoH preenche essa lacuna, criando criptografia de ponta a ponta
  • Requer registro do feature EncryptionAtHost na subscription antes de uso
  • Habilitar/desabilitar em VMs existentes requer que a VM esteja deallocated (não apenas parada)
  • Suporta PMK (chaves gerenciadas pela Microsoft) ou CMK (chaves gerenciadas pelo cliente via Key Vault + Disk Encryption Set)
  • Não é suportado em todos os SKUs de VM; verificar com az vm list-skus

Diferenças críticas:

  • EoH vs. ADE (Azure Disk Encryption): EoH criptografa no host físico (cache, disco temporário); ADE criptografa dentro da VM com BitLocker/DM-Crypt. São complementares, não substitutos
  • EoH vs. SSE: SSE é automática no Azure Storage (não cobre host cache); EoH cobre o que SSE deixa descoberto
  • PMK vs. CMK: PMK é gerenciado pela Microsoft (simples, sem controle); CMK dá controle total ao cliente mas requer Key Vault com purge protection e Disk Encryption Set
  • Stopped vs. Deallocated: para alterar EoH é necessário Deallocated (hardware liberado), não apenas Stopped (VM pausada mas ainda no host)

O que precisa ser lembrado para o AZ-104:

  • O feature deve ser registrado com az feature register --name EncryptionAtHost --namespace Microsoft.Compute
  • O parâmetro na CLI é --encryption-at-host
  • Na ARM/Bicep é securityProfile.encryptionAtHost: true
  • Requer VM deallocated para habilitar em VM existente
  • O disco temporário (efêmero) é criptografado com EoH mas não é persistente entre desalocações
  • Para CMK, o Key Vault obrigatoriamente precisa de --enable-purge-protection true
  • A built-in policy que verifica EoH é: "Virtual machines should encrypt temp disks, caches, and data flows between Compute and Storage resources" (ID: 0961003e-5a0a-4549-abde-af6a37f2724d)