Tutorial: Isolar a comunicação de back-end no Serviço de Aplicativo do Azure usando a integração de rede virtual

Neste artigo, você configura um aplicativo do App Service com comunicação segura e isolada em 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. Quando terminar, você terá um aplicativo do App Service que acessa tanto o Key Vault quanto as Ferramentas de Fundição através de uma rede virtual do Azure. Nenhum outro tráfego tem permissão para acessar esses recursos de back-end. Todo o tráfego será isolado em sua rede virtual por meio da integração de rede virtual e pontos de extremidade privados.

Em um serviço multilocatário, o tráfego de saída da sua aplicação no Serviço de Aplicativo para outros serviços do Azure compartilha o mesmo ambiente de rede com outras aplicações ou até mesmo outras assinaturas. Embora o tráfego em si possa ser criptografado, determinados cenários podem exigir um nível extra de segurança por meio do isolamento da 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 ao alcance com a integração de rede virtual.

Diagrama que mostra a arquitetura do cenário.

Nessa 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 acessar os serviços de back-end.
  • O App Service pode 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 privadas
  • Criar pontos de extremidade privados
  • Configurar a integração de rede virtual no Serviço de Aplicativo

Pré-requisitos

  • Tutorial Completo: Proteger a conexão do Serviço Cognitivo do App Service usando o Key Vault e criar o aplicativo detector de idiomas.

  • Certifique-se de definir as seguintes variáveis de ambiente do Tutorial: conexão segura do Serviço Cognitivo a partir do App Service usando o Key Vault:

         groupName=myKVResourceGroup
         region=canadacentral
         csResourceName=<cs-resource-name>
         appName=<app-name>
         vaultName=<vault-name>
         planName=<plan-name>
         csResourceKVUri=<cs-resource-kv-uri>
         csKeyKVUri=<cs-key-kv-uri>
    

Criar uma rede virtual e sub-redes

  1. Crie uma rede virtual. Substitua <o nome> da rede virtual por um nome exclusivo.

    # Save the virtual network name as a 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 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 --private-endpoint-network-policies Enabled
    

    Para o App Service, a recomendação é que a sub-rede de integração de rede virtual /26 tenha, no mínimo, um bloco CIDR. (Consulte os requisitos de sub-rede de integração de rede virtual.) /24 é mais do que suficiente. --delegations Microsoft.Web/serverfarmsespecifica que a sub-rede é delegada para integração de rede virtual do Serviço de Aplicativo.

  3. Crie uma nova sub-rede para os endpoints privados.

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name private-endpoint-subnet --address-prefixes 10.0.1.0/24 --private-endpoint-network-policies Disabled
    

    Para sub-redes de ponto de extremidade privado, você precisa desabilitar políticas de rede de ponto de extremidade privado.

Criar zonas DNS privadas

Como os recursos do Key Vault e das Ferramentas de Fundação estarão localizados 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 de pontos de extremidade privados e permitir que os clientes localizem os serviços do back-end pelo nome.

  1. Crie duas zonas DNS privadas, uma para o recurso Foundry Tools 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.

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

  1. Na sub-rede de ponto de extremidade privado da rede virtual, crie um ponto de extremidade privado para o recurso Ferramentas Foundry.

    # Get Foundry Tools 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 de extremidade privado do Foundry Tools. Um grupo de zona DNS é um vínculo entre a zona DNS privada e o ponto de extremidade privado. Este link permite que você atualize automaticamente a zona DNS privada quando houver uma atualização no 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
    
  3. Bloqueie o tráfego público para o recurso Ferramentas da Foundry.

    az rest --uri $csResourceId?api-version=2024-10-01 --method PATCH --body '{"properties":{"publicNetworkAccess":"Disabled"}}' --headers 'Content-Type=application/json'
    
    # Repeat the following command until the output is "Succeeded"
    az cognitiveservices account show --resource-group $groupName --name $csResourceName --query properties.provisioningState
    

    Observação

    Verifique se o estado de provisionamento da alteração é "Succeeded". Em seguida, você pode observar a alteração de comportamento no aplicativo de exemplo. Você ainda pode carregar o aplicativo, mas se tentar selecionar o botão Detectar , receberá um HTTP 500 erro. O aplicativo perdeu sua conectividade com o recurso de ferramentas da fundição através da rede compartilhada.

  4. Repita as etapas anteriores para o cofre de chaves.

    # Create a private endpoint for the 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 a 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 the key vault
    az keyvault update --name $vaultName --default-action Deny
    
  5. Forçar uma atualização imediata das referências do cofre de chaves em seu aplicativo reiniciando as configurações do aplicativo. (Para obter mais informações, consulte Rotation.)

    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 ao Key Vault. O aplicativo perdeu a conectividade com o key vault por meio da rede compartilhada.

Os dois pontos de extremidade privados só são acessíveis para clientes dentro da rede virtual que você criou. Você não pode nem acessar os segredos no cofre de chaves na página Segredos no portal do Azure, pois o portal os acessa por meio da Internet pública. (Consulte Gerenciar os recursos bloqueados.)

Configurar a integração de rede virtual em seu aplicativo

  1. Escale o aplicativo para um nível de preço suportado. (Consulte Integrar seu aplicativo a uma rede virtual do Azure.)

    az appservice plan update --name $planName --resource-group $groupName --sku S1
    
  2. Imponha HTTPS para solicitações de entrada. (Esta etapa não está relacionada ao cenário atual, mas é importante.)

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. 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 obter informações sobre como rotear todo o tráfego para a rede virtual, consulte Gerenciar o roteamento de integração de rede virtual. Você também pode rotear todo o tráfego se quiser rotear o tráfego da Internet por meio de sua rede virtual por meio, por exemplo, do Gateway nat do Azure ou do Firewall do Azure.

  4. Em um navegador, acesse <app-name>.azurewebsites.net e aguarde a integração entrar 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, estará se conectando ao ponto de extremidade das Ferramentas Foundry usando referências de cofre de chaves.

    Observação

    Se você continuar recebendo erros HTTP 500 por muito tempo, pode ajudar forçar uma recarga das referências do cofre de chaves:

    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 dos seus cenários, talvez você não consiga gerenciar os recursos protegidos por ponto de extremidade privado através do portal do Azure, CLI do Azure ou do Azure PowerShell (por exemplo, Cofre de Chaves). Todas essas ferramentas fazem chamadas à API REST para acessar os recursos por meio da Internet pública e são bloqueadas pela configuração. Aqui estão algumas opções para acessar os recursos bloqueados:

  • Para o Key Vault, adicione o IP público da sua máquina local para visualizar ou atualizar os segredos protegidos por endpoints privados.
  • Se sua rede local for estendida para a rede virtual do Azure por meio de um gateway de VPN ou do Azure ExpressRoute, você poderá gerenciar os recursos protegidos do ponto de extremidade privado diretamente de sua rede local.
  • Gerencie os recursos protegidos por um ponto de extremidade privado a partir de um servidor bastião na rede virtual.
  • Deploy Cloud Shell na rede virtual.

Limpar os recursos

Nas etapas anteriores, você criou recursos do Azure em um grupo de recursos. Se você não espera 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 levar alguns minutos para ser executado.

Próximas etapas