Tutorial: Isolar a comunicação de back-end no Serviço de Aplicações do Azure com a integração do Rede Virtual
Neste artigo, irá configurar uma aplicação Serviço de Aplicações com comunicação segura e isolada de rede para serviços de back-end. O cenário de exemplo utilizado é no Tutorial: Ligação do Serviço Cognitivo Seguro de Serviço de Aplicações com Key Vault. Quando terminar, tem uma aplicação Serviço de Aplicações que acede aos serviços Key Vault e do Azure AI através de uma rede virtual do Azure e nenhum outro tráfego pode aceder a esses recursos de back-end. Todo o tráfego será isolado na sua rede virtual através da integração da rede virtual e dos pontos finais privados.
Como serviço multi-inquilino, o tráfego de rede de saída da sua aplicação Serviço de Aplicações para outros serviços do Azure partilha o mesmo ambiente com outras aplicações ou até com outras subscrições. Embora o tráfego em si possa ser encriptado, determinados cenários podem exigir um nível adicional de segurança ao isolar a comunicação de back-end de outro tráfego de rede. Estes cenários são normalmente acessíveis a grandes empresas com um elevado nível de conhecimentos, mas Serviço de Aplicações coloca-a ao alcance da integração da rede virtual.
Com esta 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 Aplicações é encaminhado para a rede virtual e pode aceder aos serviços de back-end.
- Serviço de Aplicações consegue efetuar a resolução de DNS para os serviços de back-end através das zonas DNS privadas.
O que irá aprender:
- Criar uma rede virtual e sub-redes para Serviço de Aplicações integração de rede virtual
- Criar zonas DNS privadas
- Criar pontos finais privados
- Configurar a integração da rede virtual no Serviço de Aplicações
Pré-requisitos
O tutorial pressupõe que seguiu o Tutorial: Proteger a ligação do Serviço Cognitivo a partir de Serviço de Aplicações com Key Vault e criou a aplicação de detetor de idiomas.
O tutorial continua a utilizar as seguintes variáveis de ambiente do tutorial anterior. Certifique-se de que as define corretamente.
groupName=myKVResourceGroup
region=westeurope
csResourceName=<cs-resource-name>
appName=<app-name>
vaultName=<vault-name>
Criar redes virtuais e 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 da rede virtual Serviço de Aplicações.
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 Serviço de Aplicações, recomenda-se que a sub-rede de integração da rede virtual tenha um bloco CIDR de
/26
no mínimo (veja Requisitos de sub-rede de integração de rede virtual)./24
é mais do que suficiente.--delegations Microsoft.Web/serverfarms
especifica que a sub-rede está delegada para Serviço de Aplicações integração de rede virtual.Crie outra sub-rede para os pontos finais 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 final privado, tem de desativar as políticas de rede de ponto final privado.
Criar zonas DNS privadas
Uma vez que os recursos Key Vault e dos serviços de IA do Azure ficarão atrás de pontos finais privados, tem de definir zonas DNS privadas para os mesmos. Estas zonas são utilizadas para alojar os registos DNS para pontos finais privados e permitir que os clientes encontrem os serviços de back-end por nome.
Crie duas zonas DNS privadas, uma para o recurso dos 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 estas definições, veja Configuração do DNS do Ponto Final Privado do Azure
Ligue 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 finais privados
Na sub-rede de ponto final privado da sua rede virtual, crie um ponto final privado para o seu 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 final privado dos serviços de IA do Azure. O grupo de zona DNS é uma ligação entre a zona DNS privada e o ponto final privado. Esta ligação ajuda-o a atualizar automaticamente a Zona DNS privada quando existe uma atualização para o ponto final 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
Bloquear 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
Nota
Certifique-se de que o estado de aprovisionamento da alteração é
"Succeeded"
. Em seguida, pode observar a alteração de comportamento na aplicação de exemplo. Ainda pode carregar a aplicação, mas se tentar clicar no botão Detetar , obtém umHTTP 500
erro. A aplicação perdeu a conectividade ao recurso dos serviços de IA do Azure através da rede partilhada.Repita os passos 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 correspondência imediata das referências do cofre de chaves na sua aplicação ao repor as definições da aplicação (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)"
Nota
Mais uma vez, pode observar a alteração de comportamento na aplicação de exemplo. Já não pode carregar a aplicação porque já não consegue aceder às referências do cofre de chaves. A aplicação perdeu a conectividade ao cofre de chaves através da rede partilhada.
Os dois pontos finais privados só estão acessíveis aos clientes dentro da rede virtual que criou. Nem sequer pode aceder aos segredos no cofre de chaves através da página Segredos no portal do Azure, porque o portal acede aos mesmos através da Internet pública (consulte Gerir os recursos bloqueados).
Configurar a integração da rede virtual na sua aplicação
Dimensione a aplicação para um escalão de preço suportado (veja Integrar a sua aplicação numa rede virtual do Azure).
az appservice plan update --name $appName --resource-group $groupName --sku S1
Não relacionado com o nosso cenário, mas também importante, imponha HTTPS para pedidos de entrada.
az webapp update --resource-group $groupName --name $appName --https-only
Ativar a integração da rede virtual na sua aplicação.
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 predefinição, apenas o tráfego ip local definido em RFC-1918 é encaminhado para a rede virtual, que é o que precisa para os pontos finais privados. Para encaminhar todo o tráfego para a rede virtual, veja Gerir o encaminhamento de integração de rede virtual. O encaminhamento de todo o tráfego também pode ser utilizado se quiser encaminhar o tráfego da Internet através da sua rede virtual, como através de um NAT de Rede Virtual do Azure ou de um Azure Firewall.
No browser, navegue para
<app-name>.azurewebsites.net
novamente e aguarde que a integração entre em vigor. Se receber um erro HTTP 500, aguarde alguns minutos e tente novamente. Se conseguir carregar a página e obter resultados de deteção, está a ligar-se ao ponto final dos serviços de IA do Azure com referências do cofre de chaves.Nota
Se continuar a receber erros HTTP 500 após muito tempo, poderá ajudar a forçar uma nova repetição das referências do cofre de chaves , 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)"
Gerir os recursos bloqueados
Consoante os seus cenários, poderá não conseguir gerir os recursos protegidos pelo ponto final privado através do portal do Azure, da CLI do Azure ou do Azure PowerShell (por exemplo, Key Vault). Todas estas ferramentas fazem chamadas à API REST para aceder aos recursos através da Internet pública e são bloqueadas pela sua configuração. Seguem-se algumas opções para aceder aos recursos bloqueados:
- Para Key Vault, adicione o IP público do seu computador local para ver ou atualizar os segredos protegidos pelo ponto final privado.
- Se a rede no local for expandida para a rede virtual do Azure através de um gateway de VPN ou do ExpressRoute, pode gerir os recursos protegidos pelo ponto final privado diretamente a partir da sua rede no local.
- Gerir os recursos protegidos por pontos finais privados a partir de um servidor jump na rede virtual.
- Implemente Cloud Shell na rede virtual.
Limpar os recursos
Nos passos anteriores, criou os recursos do Azure num grupo de recursos. Se achar que não vai precisar destes recursos no futuro, execute o seguinte comando no Cloud Shell para eliminar o grupo de recursos:
az group delete --name $groupName
Este comando pode demorar alguns minutos a ser executado.