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.

arquitetura de cenário

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

  1. 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
    
  2. 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/serverfarmsespecifica que a sub-rede está delegada para Serviço de Aplicações integração de rede virtual.

  3. 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.

  1. 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

  2. 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

  1. 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
    
  2. 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
    
  3. 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 um HTTP 500 erro. A aplicação perdeu a conectividade ao recurso dos serviços de IA do Azure através da rede partilhada.

  4. 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
    
  5. 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

  1. 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
    
  2. 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
    
  3. 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.

  4. 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.

Passos seguintes