A criptografia de Managed Disk no Azure é uma prática essencial para proteger dados em repouso e atender requisitos de conformidade como LGPD, ISO 27001 e PCI-DSS. Neste tutorial você aprenderá a criptografar um Managed Disk no Azure usando AZ CLI, Azure Key Vault e Disk Encryption Set com chaves gerenciadas pelo cliente (CMK — Customer-Managed Keys).
O que é Managed Disk Encryption?
O Azure oferece dois modelos de criptografia para Managed Disks:- SSE com PMK (Platform-Managed Keys) — habilitada por padrão; o Azure gerencia as chaves automaticamente sem configuração adicional.
- SSE com CMK (Customer-Managed Keys) — você controla as chaves no Azure Key Vault, atendendo requisitos de auditoria, rotação e revogação de acesso.
- AZ CLI instalado e atualizado (
az upgrade) - Conta Azure com permissão de Contributor na subscription
- Permissão de Key Vault Administrator ou acesso para criar Key Vaults
- Provider
Microsoft.ComputeeMicrosoft.KeyVaultregistrados
# Verificar versão do AZ CLI
az version
# Login no Azure
az login
# Registrar os providers necessários
az provider register --namespace Microsoft.Compute
az provider register --namespace Microsoft.KeyVault
# Verificar registro (aguarde o status "Registered")
az provider show --namespace Microsoft.Compute --query "registrationState"
az provider show --namespace Microsoft.KeyVault --query "registrationState"
Variáveis de Ambiente
Defina todas as variáveis antes de executar os comandos. Isso facilita a reutilização e evita erros de digitação.# ── Identificação ────────────────────────────────────────────────────────────
SUBSCRIPTION_ID=$(az account show --query id -o tsv)
LOCATION="eastus"
# ── Nomes dos Recursos (padrão blog-castilho) ─────────────────────────────────
RESOURCE_GROUP="rg-blog-castilho"
KEY_VAULT_NAME="kv-blog-castilho" # Deve ser globalmente único
KEY_NAME="key-blog-castilho"
DES_NAME="des-blog-castilho" # Disk Encryption Set
DISK_NAME="disk-blog-castilho"
VM_NAME="vm-blog-castilho"
# ── Configurações do Disk ─────────────────────────────────────────────────────
DISK_SIZE_GB=128
DISK_SKU="Premium_LRS" # Premium_LRS | Standard_LRS | UltraSSD_LRS
echo "Variáveis definidas com sucesso!"
echo "Subscription: $SUBSCRIPTION_ID"
Passo 1 — Criar o Resource Group
az group create \
--name "$RESOURCE_GROUP" \
--location "$LOCATION" \
--tags \
projeto="blog-castilho" \
ambiente="producao" \
responsavel="jefferson.castilho@outlook.com"
# Verificar criação
az group show --name "$RESOURCE_GROUP" --query "{nome:name, local:location, status:properties.provisioningState}"
Passo 2 — Criar o Key Vault
O Azure Key Vault armazenará a chave de criptografia. É obrigatório habilitar
--enable-purge-protection para uso com Disk Encryption Set — sem ele o Azure bloqueia a associação.
az keyvault create \
--name "$KEY_VAULT_NAME" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION" \
--enable-purge-protection true \
--enable-soft-delete true \
--soft-delete-retention-days 90 \
--sku standard \
--tags \
projeto="blog-castilho" \
ambiente="producao"
# Capturar o ID do Key Vault para uso posterior
KEY_VAULT_ID=$(az keyvault show \
--name "$KEY_VAULT_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query id -o tsv)
echo "Key Vault ID: $KEY_VAULT_ID"
⚠️ Atenção: O --enable-purge-protection é irreversível.
RSA, RSA-HSM, EC e EC-HSM.
az keyvault key create \
--vault-name "$KEY_VAULT_NAME" \
--name "$KEY_NAME" \
--kty RSA \
--size 4096 \
--ops wrapKey unwrapKey \
--protection software
# Capturar a URL da chave (sem versão — para rotação automática)
KEY_URL=$(az keyvault key show \
--vault-name "$KEY_VAULT_NAME" \
--name "$KEY_NAME" \
--query "key.kid" -o tsv)
# Remover a versão da URL para suportar rotação automática de chave
KEY_URL_NO_VERSION=$(echo "$KEY_URL" | sed 's/\/[^/]*$//')
echo "Key URL (sem versão): $KEY_URL_NO_VERSION"
Opção: Usar Key Vault com HSM (Hardware Security Module)
Para ambientes que exigem proteção HSM (FIPS 140-2 Level 3), substitua--kty RSA
por --kty RSA-HSM e use um Key Vault Premium:
# Apenas com Key Vault SKU Premium
az keyvault key create \
--vault-name "$KEY_VAULT_NAME" \
--name "$KEY_NAME" \
--kty RSA-HSM \
--size 4096 \
--ops wrapKey unwrapKey \
--protection hsm
Passo 4 — Criar o Disk Encryption Set
O Disk Encryption Set é o objeto Azure que vincula a chave do Key Vault aos Managed Disks.
Ele possui uma Managed Identity que recebe permissão de acesso à chave.
az disk-encryption-set create \
--name "$DES_NAME" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION" \
--key-url "$KEY_URL_NO_VERSION" \
--source-vault "$KEY_VAULT_ID" \
--encryption-type EncryptionAtRestWithCustomerKey \
--mi-system-assigned \
--tags \
projeto="blog-castilho" \
ambiente="producao"
# Capturar o ID do Disk Encryption Set
DES_ID=$(az disk-encryption-set show \
--name "$DES_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query id -o tsv)
# Capturar o Principal ID da Managed Identity do DES
DES_PRINCIPAL_ID=$(az disk-encryption-set show \
--name "$DES_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query "identity.principalId" -o tsv)
echo "DES ID: $DES_ID"
echo "DES Principal ID: $DES_PRINCIPAL_ID"
Tipos de Encryption disponíveis
| recomendado | |||||
|---|---|---|---|---|---|
EncryptionAtRestWithCustomerKey |
Somente CMK | Conformidade e auditoria | |||
EncryptionAtRestWithPlatformAndCustomerKeys |
CMK + PMK (dupla camada) | Máxima segurança | |||
ConfidentialVmEncryptedWithCustomerKey |
CMK em Confidential VMs | Workloads confidenciais |
Opção A — Key Vault com Azure RBAC (recomendado)
# Verificar se o Key Vault usa RBAC
az keyvault show \
--name "$KEY_VAULT_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query "properties.enableRbacAuthorization"
# Habilitar RBAC no Key Vault (caso ainda não esteja habilitado)
az keyvault update \
--name "$KEY_VAULT_NAME" \
--resource-group "$RESOURCE_GROUP" \
--enable-rbac-authorization true
# Atribuir a role "Key Vault Crypto Service Encryption User" ao DES
az role assignment create \
--assignee-object-id "$DES_PRINCIPAL_ID" \
--assignee-principal-type ServicePrincipal \
--role "Key Vault Crypto Service Encryption User" \
--scope "$KEY_VAULT_ID"
echo "Permissão RBAC concedida ao Disk Encryption Set!"
Opção B — Key Vault com Access Policy
# Usar quando o Key Vault NÃO está com RBAC habilitado
az keyvault set-policy \
--name "$KEY_VAULT_NAME" \
--resource-group "$RESOURCE_GROUP" \
--object-id "$DES_PRINCIPAL_ID" \
--key-permissions wrapKey unwrapKey get
echo "Access Policy concedida ao Disk Encryption Set!"
Passo 6 — Criar o Managed Disk Criptografado
Com o Disk Encryption Set configurado, crie o Managed Disk vinculando-o ao DES.
Todos os dados gravados neste disco serão criptografados automaticamente com a CMK.
az disk create \
--name "$DISK_NAME" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION" \
--size-gb "$DISK_SIZE_GB" \
--sku "$DISK_SKU" \
--disk-encryption-set "$DES_ID" \
--network-access-policy DenyAll \
--public-network-access Disabled \
--tags \
projeto="blog-castilho" \
ambiente="producao" \
criptografia="cmk"
# Capturar o ID do Disk
DISK_ID=$(az disk show \
--name "$DISK_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query id -o tsv)
echo "Managed Disk criado: $DISK_ID"
Passo 7 — Anexar o Disk a uma VM
7.1 — Criar uma VM com o Disk de OS Criptografado
# Criar VM com OS Disk já criptografado com CMK
az vm create \
--name "$VM_NAME" \
--resource-group "$RESOURCE_GROUP" \
--location "$LOCATION" \
--image "Ubuntu2204" \
--size "Standard_D2s_v3" \
--admin-username "azureuser" \
--generate-ssh-keys \
--os-disk-encryption-set "$DES_ID" \
--os-disk-name "osdisk-blog-castilho" \
--os-disk-size-gb 64 \
--os-disk-sku "Premium_LRS" \
--public-ip-sku Standard \
--tags \
projeto="blog-castilho" \
ambiente="producao"
7.2 — Anexar o Data Disk Criptografado a uma VM existente
az vm disk attach \ --vm-name "$VM_NAME" \ --resource-group "$RESOURCE_GROUP" \ --name "$DISK_NAME" \ --lun 1 echo "Data Disk criptografado anexado à VM!"
Passo 8 — Criptografar um Managed Disk Existente
Caso você já tenha um Managed Disk sem criptografia CMK, é possível associar o Disk Encryption Set a ele com o comandoaz disk update. O disco precisa estar desanexado da VM
ou a VM precisa estar desalocada.
# Variável com o nome do disk existente DISK_EXISTENTE="disk-existente-blog-castilho" # Desalocar a VM (se o disk estiver anexado) az vm deallocate \ --name "$VM_NAME" \ --resource-group "$RESOURCE_GROUP" # Associar o Disk Encryption Set ao disk existente az disk update \ --name "$DISK_EXISTENTE" \ --resource-group "$RESOURCE_GROUP" \ --disk-encryption-set "$DES_ID" # Iniciar a VM após a atualização az vm start \ --name "$VM_NAME" \ --resource-group "$RESOURCE_GROUP" echo "Disk existente atualizado com criptografia CMK!"Verificar a Criptografia Use os comandos abaixo para confirmar que o Managed Disk está criptografado com a chave CMK correta.
# Verificar configuração de criptografia do Disk
az disk show \
--name "$DISK_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query "{
nome: name,
tamanhoGB: diskSizeGb,
sku: sku.name,
criptografia: encryption.type,
diskEncryptionSetId: encryption.diskEncryptionSetId
}" \
-o table
# Verificar o Disk Encryption Set
az disk-encryption-set show \
--name "$DES_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query "{
nome: name,
tipoEncryptacao: encryptionType,
keyUrl: activeKey.keyUrl,
provisioningState: provisioningState
}" \
-o table
# Listar todos os disks do Resource Group e seu estado de criptografia
az disk list \
--resource-group "$RESOURCE_GROUP" \
--query "[].{Nome:name, Criptografia:encryption.type, DES:encryption.diskEncryptionSetId}" \
-o table
Criptografia deve exibir
EncryptionAtRestWithCustomerKey e o campo DES deve conter o ID do
des-blog-castilho.# ATENÇÃO: Este comando remove TODOS os recursos do Resource Group!
az group delete \
--name "$RESOURCE_GROUP" \
--yes \
--no-wait
echo "Resource Group $RESOURCE_GROUP em processo de exclusão."
# Remover o soft-delete do Key Vault após excluir o grupo (se necessário)
az keyvault purge \
--name "$KEY_VAULT_NAME" \
--location "$LOCATION"
Troubleshooting — Erros Comuns
PurgeProtectionMustBeEnabled |
Key Vault sem purge protection | Adicionar --enable-purge-protection true ao criar o Key Vault |
|||
KeyVaultAccessForbidden |
DES sem permissão na chave | Verificar role assignment ou access policy do DES no Key Vault | |||
DiskEncryptionSetNotFound |
DES em outro Resource Group | Usar o ID completo do DES (--disk-encryption-set "$DES_ID") |
|||
OperationNotAllowed — disk is attached |
Tentou atualizar disk anexado | Desalocar a VM antes de atualizar o disk (az vm deallocate) |
|||
LinkedAuthorizationFailed |
DES e Key Vault em subscriptions diferentes | Manter DES e Key Vault na mesma subscription |
Conclusão
Neste tutorial você aprendeu como criptografar um Managed Disk no Azure com AZ CLI usando Customer-Managed Keys (CMK). O fluxo completo envolveu:- Criar o Resource Group
rg-blog-castilho - Criar o Key Vault
kv-blog-castilhocom purge protection - Gerar a chave RSA 4096
key-blog-castilho - Criar o Disk Encryption Set
des-blog-castilho - Conceder permissões à Managed Identity do DES via RBAC ou Access Policy
- Criar ou atualizar Managed Disks com criptografia CMK
- Verificar o estado de criptografia via
az disk show
Interessado em saber mais sobre artigos relacionados ao Microsoft Azure CLIQUE AQUI
🚀 Vamos nos conectar?
Não perca nenhuma oportunidade! Cadastre-se nas minhas redes e no canal do YouTube para receber conteúdos de TI, Cloud, Azure, Kubernetes e DevOps em primeira mão.
Dica: No Facebook, todos os artigos do blog são publicados automaticamente. Vale a pena curtir!
💬 Dúvidas ou Problemas?
Com o intuito de ajudar a comunidade, caso você tenha dúvidas ou encontre problemas na execução dos comandos deste artigo, deixe um comentário abaixo. Responderei o mais breve possível!
Muito obrigado pela visita e até o próximo post!
Jefferson Castilho Especialista em Cloud & DevOps.Este guia técnico é exclusivo do Blog do Castilho. Explore nossa para mais conteúdos sobre IA e Cloud.


