Desafio 34: Private Endpoints e integração DNS
45-60 minutos | ~$0,01/h | Peso no exame: 10-15%
Cenário
A MedSecure Health, uma empresa de saúde, está migrando seus serviços PaaS para acesso privado a fim de cumprir requisitos de residência de dados e segurança. A equipe de conformidade exige que nenhum dado de paciente trafegue pela internet pública. Você foi encarregado de configurar pontos de extremidade privados para a conta de Azure Storage (endpoint de blob) e garantir a resolução DNS adequada para que aplicações dentro da rede virtual resolvam o FQDN da conta de armazenamento para um endereço IP privado em vez de um público.
Arquitetura:
Objetivos de aprendizagem
Após concluir este desafio, você será capaz de:
- Criar um ponto de extremidade privado para um sub-recurso blob do Azure Storage
- Criar e configurar uma zona DNS privatelink para resolução automática de nomes
- Vincular uma zona DNS privada a uma rede virtual
- Usar grupos de zona DNS para gerenciamento automático de registros DNS
- Habilitar políticas de rede em uma sub-rede de ponto de extremidade privado para permitir a aplicação de NSG
- Verificar que a resolução DNS retorna o endereço IP privado
- Entender os estados de conexão do ponto de extremidade privado (Pending, Approved, Rejected)
Pré-requisitos
- Uma assinatura Azure com acesso de Contributor
- Azure CLI instalado e autenticado (
az login) - PowerShell com módulo Az instalado (
Install-Module Az -Force)
Conceitos-chave para o AZ-700
| Conceito | Detalhe |
|---|---|
| Private Endpoint | Uma interface de rede com um IP privado que conecta você de forma privada a um serviço por meio do Azure Private Link |
| Zona DNS privatelink | Uma zona DNS privada (ex.: privatelink.blob.core.windows.net) usada para substituir a resolução DNS pública por IPs privados |
| Grupo de zona DNS | Associa um ponto de extremidade privado a uma zona DNS privada para gerenciamento automático do ciclo de vida dos registros A |
| Link de rede virtual | Conecta uma zona DNS privada a uma VNet para que VMs nessa VNet possam resolver registros da zona |
| Políticas de rede | Por padrão, NSGs e UDRs estão desabilitados em sub-redes de PE; devem ser habilitados explicitamente via configuração de sub-rede |
| Estados de conexão | Pending (aguardando aprovação), Approved (ativo), Rejected (negado pelo proprietário do serviço), Disconnected |
| Sub-recurso (group-id) | Identifica qual parte de um serviço multi-endpoint conectar (ex.: blob, file, table, queue) |
Cadeia de resolução DNS para pontos de extremidade privados
Quando um cliente em uma VNet vinculada resolve stmedsecure.blob.core.windows.net:
- O Azure DNS recebe a consulta
- O DNS público retorna um CNAME para
stmedsecure.privatelink.blob.core.windows.net - O Azure DNS verifica as zonas DNS privadas vinculadas
- A zona privatelink retorna o registro A apontando para o IP privado (ex.: 10.0.2.4)
Sem a zona DNS privada vinculada à VNet, a resolução cai para o IP público.
O exame frequentemente testa a cadeia de resolução DNS. Lembre-se de que o DNS público sempre retorna um CNAME para o subdomínio privatelink. É a zona DNS privada (vinculada à VNet) que resolve esse CNAME para o IP privado. Se a zona não estiver vinculada, a consulta resolve para o IP público.
Tarefa 1: Criar o grupo de recursos e a rede virtual
Azure CLI
# Create resource group
az group create \
--name rg-pe-lab \
--location eastus2
# Create VNet with workload subnet
az network vnet create \
--resource-group rg-pe-lab \
--name vnet-medsecure \
--location eastus2 \
--address-prefixes 10.0.0.0/16 \
--subnet-name snet-workloads \
--subnet-prefixes 10.0.1.0/24
# Create dedicated subnet for private endpoints
az network vnet subnet create \
--resource-group rg-pe-lab \
--vnet-name vnet-medsecure \
--name snet-pe \
--address-prefixes 10.0.2.0/24
Azure PowerShell
# Create resource group
New-AzResourceGroup -Name "rg-pe-lab" -Location "eastus2"
# Create subnet configurations
$snetWorkloads = New-AzVirtualNetworkSubnetConfig `
-Name "snet-workloads" `
-AddressPrefix "10.0.1.0/24"
$snetPe = New-AzVirtualNetworkSubnetConfig `
-Name "snet-pe" `
-AddressPrefix "10.0.2.0/24"
# Create VNet
New-AzVirtualNetwork `
-ResourceGroupName "rg-pe-lab" `
-Name "vnet-medsecure" `
-Location "eastus2" `
-AddressPrefix "10.0.0.0/16" `
-Subnet $snetWorkloads, $snetPe
Tarefa 2: Criar a conta de armazenamento
Azure CLI
# Create storage account (must be globally unique name)
az storage account create \
--resource-group rg-pe-lab \
--name stmedsecurelab01 \
--location eastus2 \
--sku Standard_LRS \
--kind StorageV2
Azure PowerShell
# Create storage account
$storageAccount = New-AzStorageAccount `
-ResourceGroupName "rg-pe-lab" `
-Name "stmedsecurelab01" `
-Location "eastus2" `
-SkuName "Standard_LRS" `
-Kind "StorageV2"
Tarefa 3: Criar o ponto de extremidade privado para armazenamento de blobs
Azure CLI
# Get the storage account resource ID
STORAGE_ID=$(az storage account show \
--resource-group rg-pe-lab \
--name stmedsecurelab01 \
--query "id" \
--output tsv)
# Create private endpoint for blob sub-resource
az network private-endpoint create \
--resource-group rg-pe-lab \
--name pe-storage-blob \
--vnet-name vnet-medsecure \
--subnet snet-pe \
--private-connection-resource-id $STORAGE_ID \
--group-id blob \
--connection-name pec-storage-blob \
--location eastus2
Azure PowerShell
# Get storage account and VNet references
$storageAccount = Get-AzStorageAccount `
-ResourceGroupName "rg-pe-lab" `
-Name "stmedsecurelab01"
$vnet = Get-AzVirtualNetwork `
-ResourceGroupName "rg-pe-lab" `
-Name "vnet-medsecure"
$subnet = $vnet | Select-Object -ExpandProperty Subnets | `
Where-Object { $_.Name -eq "snet-pe" }
# Create private link service connection
$plsConnection = New-AzPrivateLinkServiceConnection `
-Name "pec-storage-blob" `
-PrivateLinkServiceId $storageAccount.Id `
-GroupId "blob"
# Create private endpoint
New-AzPrivateEndpoint `
-ResourceGroupName "rg-pe-lab" `
-Name "pe-storage-blob" `
-Location "eastus2" `
-Subnet $subnet `
-PrivateLinkServiceConnection $plsConnection
Portal
- Pesquise Private endpoints e selecione Create
- Em Basics: selecione o grupo de recursos
rg-pe-lab, nomeie comope-storage-blob, regiãoEast US 2 - Em Resource: tipo de recurso
Microsoft.Storage/storageAccounts, selecione sua conta de armazenamento, sub-recurso de destinoblob - Em Virtual Network: selecione
vnet-medsecure, sub-redesnet-pe - Em DNS: configure na próxima tarefa
- Selecione Review + create e depois Create
Ao criar um PE para um recurso em sua própria assinatura, a conexão é aprovada automaticamente (estado: Approved). Ao conectar-se a um recurso em outra assinatura ou a um Private Link Service, o estado inicia como Pending até que o proprietário do recurso o aprove.
Tarefa 4: Configurar zona DNS privada e vincular à VNet
Azure CLI
# Create the privatelink DNS zone for blob storage
az network private-dns zone create \
--resource-group rg-pe-lab \
--name "privatelink.blob.core.windows.net"
# Link the DNS zone to the VNet
az network private-dns link vnet create \
--resource-group rg-pe-lab \
--zone-name "privatelink.blob.core.windows.net" \
--name link-vnet-medsecure \
--virtual-network vnet-medsecure \
--registration-enabled false
# Create DNS zone group to auto-manage A records
az network private-endpoint dns-zone-group create \
--resource-group rg-pe-lab \
--endpoint-name pe-storage-blob \
--name zone-group-blob \
--private-dns-zone "privatelink.blob.core.windows.net" \
--zone-name blob
Azure PowerShell
# Create private DNS zone
$dnsZone = New-AzPrivateDnsZone `
-ResourceGroupName "rg-pe-lab" `
-Name "privatelink.blob.core.windows.net"
# Link DNS zone to VNet
$vnet = Get-AzVirtualNetwork -ResourceGroupName "rg-pe-lab" -Name "vnet-medsecure"
New-AzPrivateDnsVirtualNetworkLink `
-ResourceGroupName "rg-pe-lab" `
-ZoneName "privatelink.blob.core.windows.net" `
-Name "link-vnet-medsecure" `
-VirtualNetworkId $vnet.Id `
-EnableRegistration $false
# Create DNS zone group for automatic record management
$dnsZoneConfig = New-AzPrivateDnsZoneConfig `
-Name "blob" `
-PrivateDnsZoneId $dnsZone.ResourceId
New-AzPrivateDnsZoneGroup `
-ResourceGroupName "rg-pe-lab" `
-PrivateEndpointName "pe-storage-blob" `
-Name "zone-group-blob" `
-PrivateDnsZoneConfig $dnsZoneConfig
O parâmetro --registration-enabled false significa que VMs na VNet vinculada NÃO registrarão automaticamente seus próprios registros DNS nesta zona. Isso é correto para zonas privatelink — você deseja apenas os registros A do ponto de extremidade privado aqui, não os nomes de host das VMs. Defina registration como true apenas em zonas destinadas ao registro automático de VMs (ex.: contoso.internal).
Tarefa 5: Verificar resolução DNS
Azure CLI
# Check the private endpoint's private IP
az network private-endpoint show \
--resource-group rg-pe-lab \
--name pe-storage-blob \
--query "customDnsConfigs[0].ipAddresses[0]" \
--output tsv
# List DNS records in the private zone
az network private-dns record-set a list \
--resource-group rg-pe-lab \
--zone-name "privatelink.blob.core.windows.net" \
--output table
A partir de uma VM dentro da VNet
# Run nslookup from a VM connected to vnet-medsecure
nslookup stmedsecurelab01.blob.core.windows.net
# Expected output (private IP resolution):
# Server: UnKnown
# Address: 168.63.129.16
#
# Non-authoritative answer:
# Name: stmedsecurelab01.privatelink.blob.core.windows.net
# Address: 10.0.2.4
# Aliases: stmedsecurelab01.blob.core.windows.net
Tarefa 6: Habilitar políticas de rede na sub-rede de PE
Por padrão, políticas de rede (NSGs e UDRs) estão desabilitadas em sub-redes que contêm pontos de extremidade privados. Para aplicar regras de NSG ao tráfego de/para seu ponto de extremidade privado, você deve habilitar explicitamente as políticas de rede.
Azure CLI
# Enable network policies on the PE subnet
# NOTE: --disable-private-endpoint-network-policies false means policies ARE ENABLED
# This is a confusing double-negative in the CLI parameter name
az network vnet subnet update \
--resource-group rg-pe-lab \
--vnet-name vnet-medsecure \
--name snet-pe \
--disable-private-endpoint-network-policies false
Azure PowerShell
# Enable network policies on the PE subnet
$vnet = Get-AzVirtualNetwork -ResourceGroupName "rg-pe-lab" -Name "vnet-medsecure"
# PrivateEndpointNetworkPoliciesFlag values:
# "Enabled" = NSGs and UDRs apply to private endpoints
# "Disabled" = NSGs and UDRs are bypassed (default)
Set-AzVirtualNetworkSubnetConfig `
-Name "snet-pe" `
-VirtualNetwork $vnet `
-AddressPrefix "10.0.2.0/24" `
-PrivateEndpointNetworkPoliciesFlag "Enabled"
$vnet | Set-AzVirtualNetwork
O parâmetro da Azure CLI --disable-private-endpoint-network-policies usa uma dupla negação:
--disable-private-endpoint-network-policies true= políticas estão DESABILITADAS (padrão, NSGs NÃO se aplicam)--disable-private-endpoint-network-policies false= políticas estão HABILITADAS (NSGs SE aplicam)
O equivalente em PowerShell é mais claro: -PrivateEndpointNetworkPoliciesFlag "Enabled" ou "Disabled".
Criar uma regra NSG para a sub-rede de PE
# Create NSG
az network nsg create \
--resource-group rg-pe-lab \
--name nsg-snet-pe
# Allow HTTPS from workload subnet to PE subnet
az network nsg rule create \
--resource-group rg-pe-lab \
--nsg-name nsg-snet-pe \
--name Allow-HTTPS-From-Workloads \
--priority 100 \
--direction Inbound \
--source-address-prefixes 10.0.1.0/24 \
--destination-address-prefixes 10.0.2.0/24 \
--destination-port-ranges 443 \
--protocol Tcp \
--access Allow
# Deny all other inbound
az network nsg rule create \
--resource-group rg-pe-lab \
--nsg-name nsg-snet-pe \
--name Deny-All-Inbound \
--priority 4096 \
--direction Inbound \
--source-address-prefixes "*" \
--destination-address-prefixes "*" \
--destination-port-ranges "*" \
--protocol "*" \
--access Deny
# Associate NSG with PE subnet
az network vnet subnet update \
--resource-group rg-pe-lab \
--vnet-name vnet-medsecure \
--name snet-pe \
--network-security-group nsg-snet-pe
Cenários de quebra e correção
Cenário 1: DNS não resolve para o IP privado
Sintoma: nslookup stmedsecurelab01.blob.core.windows.net retorna o endereço IP público em vez de 10.0.2.4.
Diagnóstico:
# Check if the DNS zone exists
az network private-dns zone show \
--resource-group rg-pe-lab \
--name "privatelink.blob.core.windows.net" \
--query "name" \
--output tsv
# Check if the VNet link exists
az network private-dns link vnet list \
--resource-group rg-pe-lab \
--zone-name "privatelink.blob.core.windows.net" \
--output table
Causa raiz: A zona DNS privada não está vinculada à VNet onde a VM cliente reside.
Correção:
az network private-dns link vnet create \
--resource-group rg-pe-lab \
--zone-name "privatelink.blob.core.windows.net" \
--name link-vnet-medsecure \
--virtual-network vnet-medsecure \
--registration-enabled false
Cenário 2: NSG bloqueando tráfego para o ponto de extremidade privado
Sintoma: A aplicação em snet-workloads não consegue conectar-se ao armazenamento via PE, mas o DNS resolve corretamente para o IP privado.
Diagnóstico:
# Check if network policies are enabled on the PE subnet
az network vnet subnet show \
--resource-group rg-pe-lab \
--vnet-name vnet-medsecure \
--name snet-pe \
--query "privateEndpointNetworkPolicies" \
--output tsv
Causa raiz: Políticas de rede foram habilitadas na sub-rede e um NSG foi associado, mas o NSG não possui uma regra Allow para o tráfego necessário. Quando as políticas estão habilitadas, todas as regras padrão de NSG se aplicam ao tráfego do PE.
Correção: Adicione uma regra Allow para a porta 443 a partir da sub-rede de origem, ou desabilite as políticas de rede se a aplicação de NSG não for necessária:
# Option A: Disable network policies (NSG rules will not apply to PE)
az network vnet subnet update \
--resource-group rg-pe-lab \
--vnet-name vnet-medsecure \
--name snet-pe \
--disable-private-endpoint-network-policies true
# Option B: Add allow rule (if policies should remain enabled)
az network nsg rule create \
--resource-group rg-pe-lab \
--nsg-name nsg-snet-pe \
--name Allow-Storage-HTTPS \
--priority 100 \
--direction Inbound \
--source-address-prefixes 10.0.1.0/24 \
--destination-address-prefixes 10.0.2.0/24 \
--destination-port-ranges 443 \
--protocol Tcp \
--access Allow
Cenário 3: Ponto de extremidade privado travado no estado Pending
Sintoma: A conexão do ponto de extremidade privado mostra o estado Pending e o tráfego não flui.
Diagnóstico:
# Check connection state
az network private-endpoint show \
--resource-group rg-pe-lab \
--name pe-storage-blob \
--query "privateLinkServiceConnections[0].privateLinkServiceConnectionState.status" \
--output tsv
Causa raiz: O PE foi criado com --manual-request true ou o recurso de destino está em uma assinatura diferente, exigindo aprovação manual do proprietário do recurso.
Correção:
# Approve the pending connection (run from the storage account owner's context)
az network private-endpoint-connection approve \
--resource-group rg-pe-lab \
--name <connection-name> \
--resource-name stmedsecurelab01 \
--type Microsoft.Storage/storageAccounts \
--description "Approved for MedSecure VNet access"
Verificação de conhecimento
1. Uma VM dentro de uma VNet resolve stmedsecure.blob.core.windows.net para um IP público apesar de existir um private endpoint. Qual é a causa mais provável?
2. O que o parâmetro da Azure CLI --disable-private-endpoint-network-policies false realiza?
3. Uma conexão de private endpoint a uma conta de armazenamento em outra assinatura mostra o estado 'Pending'. O que deve acontecer para o tráfego fluir?
4. Qual valor de group-id é usado ao criar um private endpoint para acesso ao blob do Azure Storage?
5. Qual é a finalidade de um DNS zone group em um private endpoint?
6. Na cadeia de resolução DNS para um private endpoint, o que o DNS público retorna para stmedsecure.blob.core.windows.net?
Limpeza
Remova todos os recursos criados neste desafio para interromper a cobrança:
az group delete --name rg-pe-lab --yes --no-wait
Remove-AzResourceGroup -Name "rg-pe-lab" -Force -AsJob
Private Endpoints geram cobranças de aproximadamente $0,01/hora por endpoint. Embora seja mínimo, certifique-se de fazer a limpeza após concluir o laboratório para evitar custos desnecessários. A conta de armazenamento também gera cobranças pelos dados armazenados.