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.

scenario architecture

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

  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 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/serverfarmsespecifica que a sub-rede é delegada para integração de rede virtual do Serviço de Aplicativo.

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

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

  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 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
    
  2. 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
    
  3. 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 erro HTTP 500. O aplicativo perdeu sua conectividade com o recurso de serviços de IA do Azure por meio da rede compartilhada.

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

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

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

Próximas etapas