Tutorial: Isolar a comunicação de back-end no Serviço de Aplicativo do Azure com a integração da Rede Virtual
Neste artigo, você configurará um aplicativo do Serviço de Aplicativo com comunicação segura e isolada de rede para serviços de back-end. O cenário de exemplo usado é no Tutorial: Conexão segura de Serviço Cognitivo do Serviço de Aplicativo usando Key Vault . Ao terminar, você terá um aplicativo do Serviço de Aplicativo que acessa o Key Vault e os serviços de IA do Azure por meio de uma rede virtual do Azure e nenhum outro tráfego tem permissão para acessar esses recursos de back-end. Todo o tráfego será isolado na rede virtual usando a integração de rede virtual e os pontos de extremidade privados.
Como um serviço multi locatário, o tráfego de rede de saída do aplicativo do Serviço de Aplicativo para outros serviços do Azure compartilha o mesmo ambiente com outros aplicativos ou até mesmo com outras assinaturas. Embora o tráfego em si possa ser criptografado, determinados cenários podem exigir um nível extra de segurança isolando a comunicação de back-end de outro tráfego de rede. Esses cenários normalmente são acessíveis para grandes empresas com um alto nível de experiência, mas o Serviço de Aplicativo o coloca em alcance com a integração de rede virtual.
Com essa arquitetura:
- O tráfego público para os serviços de back-end está bloqueado.
- O tráfego de saída do Serviço de Aplicativo é roteado para a rede virtual e pode alcançar os serviços de back-end.
- O Serviço de Aplicativo é capaz de executar a resolução DNS para os serviços de back-end por meio das zonas DNS privadas.
O que você aprenderá:
- Criar uma rede virtual e sub-redes para integração de rede virtual do Serviço de Aplicativo
- Criar zonas DNS particular
- Criar pontos de extremidade privados
- Configurar integração de rede virtual no Serviço de Aplicativo
Pré-requisitos
O tutorial pressupõe que você seguiu o Conexão do Serviço Cognitivo Seguro do Serviço de Aplicativo usando Key Vault e criou o aplicativo detector de idioma.
O tutorial continua a usar as seguintes variáveis de ambiente do tutorial anterior. Certifique-se de defini-los corretamente.
groupName=myKVResourceGroup
region=westeurope
csResourceName=<cs-resource-name>
appName=<app-name>
vaultName=<vault-name>
Crie a rede virtual e as sub-redes
Crie uma rede virtual. Substitua <virtual-network-name> por um nome exclusivo.
# Save vnet name as variable for convenience vnetName=<virtual-network-name> az network vnet create --resource-group $groupName --location $region --name $vnetName --address-prefixes 10.0.0.0/16
Crie uma sub-rede para a integração de rede virtual do Serviço de Aplicativo.
az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name vnet-integration-subnet --address-prefixes 10.0.0.0/24 --delegations Microsoft.Web/serverfarms --disable-private-endpoint-network-policies false
Para o Serviço de Aplicativo, é recomendável que a sub-rede de integração de rede virtual tenha um bloco CIDR de
/26
no mínimo (consulte Requisitos de sub-rede de integração de rede virtual)./24
é mais do que suficiente.--delegations Microsoft.Web/serverfarms
especifica que a sub-rede é delegada para integração de rede virtual do Serviço de Aplicativo.Crie outra sub-rede para os pontos de extremidade privados.
az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name private-endpoint-subnet --address-prefixes 10.0.1.0/24 --disable-private-endpoint-network-policies true
Para sub-redes de ponto de extremidade privado, você deve desabilitar as políticas de rede do ponto de extremidade privado.
Criar zonas DNS particular
Como seus recursos do Key Vault e dos serviços de IA do Azure ficarão atrás de pontos de extremidade privados, você precisa definir zonas DNS privadas para eles. Essas zonas são usadas para hospedar os registros DNS para pontos de extremidade privados e permitir que os clientes encontrem os serviços de back-end por nome.
Crie duas zonas DNS privadas, uma para o recurso de serviços de IA do Azure e outra para o cofre de chaves.
az network private-dns zone create --resource-group $groupName --name privatelink.cognitiveservices.azure.com az network private-dns zone create --resource-group $groupName --name privatelink.vaultcore.azure.net
Para obter mais informações sobre essas configurações, confira Configuração do DNS do ponto de extremidade privado do Azure
Vincule as zonas DNS privadas à rede virtual.
az network private-dns link vnet create --resource-group $groupName --name cognitiveservices-zonelink --zone-name privatelink.cognitiveservices.azure.com --virtual-network $vnetName --registration-enabled False az network private-dns link vnet create --resource-group $groupName --name vaultcore-zonelink --zone-name privatelink.vaultcore.azure.net --virtual-network $vnetName --registration-enabled False
Criar pontos de extremidade privados
Na sub-rede do ponto de extremidade privado da rede virtual, crie um ponto de extremidade privado para o Serviço Cognitivo.
# Get Cognitive Services resource ID csResourceId=$(az cognitiveservices account show --resource-group $groupName --name $csResourceName --query id --output tsv) az network private-endpoint create --resource-group $groupName --name securecstext-pe --location $region --connection-name securecstext-pc --private-connection-resource-id $csResourceId --group-id account --vnet-name $vnetName --subnet private-endpoint-subnet
Crie um grupo de zonas DNS para o ponto de extremidade privado dos serviços de IA do Azure. O grupo de zona DNS é um vínculo entre a zona DNS privado e o ponto de extremidade privado. Esse link ajuda a atualizar automaticamente a zona DNS privado quando há uma atualização para o ponto de extremidade privado.
az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securecstext-pe --name securecstext-zg --private-dns-zone privatelink.cognitiveservices.azure.com --zone-name privatelink.cognitiveservices.azure.com
Bloqueie o tráfego público para o recurso dos serviços de IA do Azure.
az rest --uri $csResourceId?api-version=2021-04-30 --method PATCH --body '{"properties":{"publicNetworkAccess":"Disabled"}}' --headers 'Content-Type=application/json' # Repeat following command until output is "Succeeded" az cognitiveservices account show --resource-group $groupName --name $csResourceName --query properties.provisioningState
Observação
Certifique-se de que o estado de provisionamento da alteração seja
"Succeeded"
. Em seguida, você pode observar a alteração de comportamento no aplicativo de exemplo. Você ainda pode carregar o aplicativo, mas se você tentar clicar no botão Detectar, obterá um erroHTTP 500
. O aplicativo perdeu sua conectividade com o recurso de serviços de IA do Azure por meio da rede compartilhada.Repita as etapas acima para o cofre de chaves.
# Create private endpoint for key vault vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv) az network private-endpoint create --resource-group $groupName --name securekeyvault-pe --location $region --connection-name securekeyvault-pc --private-connection-resource-id $vaultResourceId --group-id vault --vnet-name $vnetName --subnet private-endpoint-subnet # Create DNS zone group for the endpoint az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securekeyvault-pe --name securekeyvault-zg --private-dns-zone privatelink.vaultcore.azure.net --zone-name privatelink.vaultcore.azure.net # Block public traffic to key vault az keyvault update --name $vaultName --default-action Deny
Force uma nova busca imediata das referências do cofre de chaves em seu aplicativo redefinindo as configurações do aplicativo (para obter mais informações, consulte Rotação).
az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
Observação
Novamente, você pode observar a alteração de comportamento no aplicativo de exemplo. Você não pode mais carregar o aplicativo porque ele não pode mais acessar as referências do cofre de chaves. O aplicativo perdeu sua conectividade com o cofre de chaves por meio da rede compartilhada.
Os dois pontos de extremidade privados só podem ser acessados por clientes dentro da rede virtual que você criou. Você não pode nem mesmo acessar os segredos no cofre de chaves por meio da página Segredos no portal do Azure, pois o portal os acessa por meio da Internet pública (consulte Gerenciar os recursos bloqueados).
Configurar integração de rede virtual no aplicativo
Escale verticalmente o aplicativo para um tipo de preço com suporte (confira Integrar o aplicativo a uma rede virtual do Azure).
az appservice plan update --name $appName --resource-group $groupName --sku S1
Não relacionado ao nosso cenário, mas também importante, impõe HTTPS para solicitações de entrada.
az webapp update --resource-group $groupName --name $appName --https-only
Habilite a integração de rede virtual no aplicativo.
az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet
A integração de rede virtual permite que o tráfego de saída flua diretamente para a rede virtual. Por padrão, somente o tráfego IP local definido em RFC-1918 é roteado para a rede virtual, que é o que você precisa para os pontos de extremidade privados. Para rotear todo o tráfego para a rede virtual, consulte Gerenciar o roteamento de integração de rede virtual. O roteamento de todo o tráfego também pode ser usado se você quiser rotear o tráfego da Internet por meio de sua rede virtual, como por meio de um NAT de rede virtual do Azure ou um Firewall do Azure.
No navegador, navegue
<app-name>.azurewebsites.net
até novamente e aguarde até que a integração entre em vigor. Se você receber um erro HTTP 500, aguarde alguns minutos e tente novamente. Se você puder carregar a página e obter resultados de detecção, você se conectará ao ponto de extremidade dos serviços de IA do Azure com referências do cofre de chaves.Observação
Se continuar recebendo erros HTTP 500 após muito tempo, poderá ajudar a forçar uma nova busca das referências do cofre de chaves novamente, da seguinte forma:
az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
Gerenciar os recursos bloqueados
Dependendo de seus cenários, talvez você não consiga gerenciar os recursos protegidos do ponto de extremidade privado por meio do portal do Azure, CLI do Azure ou Azure PowerShell (por exemplo, Key Vault). Todas essas ferramentas fazem chamadas à API REST para acessar os recursos por meio da Internet pública e são bloqueadas por sua configuração. Aqui estão algumas opções para acessar os recursos bloqueados:
- Através do Key Vault, adicione o IP público do computador local para exibir ou atualizar os segredos protegidos pelo ponto de extremidade privado.
- Se sua rede local for estendida para a rede virtual do Azure por meio de um gateway de VPN ou do ExpressRoute, você poderá gerenciar os recursos protegidos do ponto de extremidade privado diretamente da rede local.
- Gerencie os recursos protegidos do ponto de extremidade privado de um servidor de salto na rede virtual.
- Implante o Cloud Shell na rede virtual.
Limpar os recursos
Nas etapas anteriores, você criou os recursos do Azure em um grupo de recursos. Se você acha que não precisará desses recursos no futuro, exclua o grupo de recursos executando o seguinte comando no Cloud Shell:
az group delete --name $groupName
Esse comando pode demorar um pouco para ser executado.