Partilhar via


Tutorial: Isolar a comunicação de back-end no Azure App Service com integração de Rede Virtual

Neste artigo, irá configurar uma aplicação de Serviços de Aplicações com comunicação segura e isolada da rede para serviços de backend. O exemplo de cenário utilizado está no Tutorial: Ligação Segura de Serviço Cognitivo a partir do App Service usando Key Vault. Quando termina, tem uma aplicação de Serviço de Aplicações que acede tanto à Key Vault como à Foundry Tools através de uma rede virtual Azure, e nenhum outro tráfego pode aceder a esses recursos de back-end. Todo o tráfego será isolado dentro da sua rede virtual usando integração com redes virtuais e endpoints privados.

Como serviço multi-inquilino, o tráfego de rede de saída da sua aplicação de Serviços de Aplicações para outros serviços Azure partilha o mesmo ambiente com outras aplicações ou até com outras subscrições. Embora o tráfego em si possa ser encriptado, certos cenários podem exigir um nível extra de segurança ao isolar a comunicação 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 especialização, mas o App Service coloca-os ao alcance da integração de redes virtuais.

Arquitetura de cenários

Com esta arquitetura:

  • O tráfego público para os serviços de back-end está bloqueado.
  • O tráfego de saída do App Service é encaminhado para a rede virtual e pode chegar aos serviços de back-end.
  • O App Service é capaz de realizar resolução DNS para os serviços de back-end através das zonas DNS privadas.

O que você vai aprender:

  • Criar uma rede virtual e sub-redes para integração de redes virtuais de Serviços de Aplicações
  • Criar zonas DNS privadas
  • Criar pontos de extremidade privados
  • Configurar a integração da rede virtual no App Service

Pré-requisitos

O tutorial assume que seguiu o Tutorial: Ligação Segura ao Serviço Cognitivo a partir do App Service usando Key Vault e criou a aplicação detetor de línguas.

O tutorial continua a usar as seguintes variáveis de ambiente do tutorial anterior. Certifica-te de que as colocas corretamente.

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

Criar rede virtual e sub-redes

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

    # 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 do App Service.

    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 App Service, recomenda-se que a sub-rede de integração de rede virtual tenha um bloco CIDR de /26 no mínimo (ver 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 a integração de rede virtual do App Service.

  3. Crie outra 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 subredes de endpoints privados, deve desativar as políticas de rede de endpoints privados.

Criar zonas DNS privadas

Como os seus recursos Key Vault e Azure AI services ficarão atrás de endpoints privados, precisa de definir zonas DNS privadas para eles. Estas zonas são usadas para alojar os registos DNS dos endpoints privados e permitem aos clientes encontrar os serviços de back-end pelo nome.

  1. Crie duas zonas DNS privadas, uma para o seu recurso Azure AI services e outra para o seu 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 mais informações sobre estas definições, consulte Configuração de DNS de Endpoint Privado do Azure

  2. Liga 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 privada da sua rede virtual, crie um endpoint 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 endpoint privado dos Azure AI Services. O grupo de zonas DNS é uma ligação entre a zona DNS privada e o endpoint privado. Este link ajuda-te a atualizar automaticamente a Zona DNS privada quando há uma atualização para o endpoint 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 Azure AI services.

    az rest --uri $csResourceId?api-version=2024-10-01 --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 sua alteração é "Succeeded". Depois podes observar a mudança de comportamento na aplicação de exemplo. Ainda podes carregar a aplicação, mas se tentares clicar no botão Detetar , recebes um HTTP 500 erro. A aplicação perdeu a sua ligação ao recurso Azure AI services através da rede partilhada.

  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. Forçar uma recuperação imediata das referências do cofre de chaves na sua aplicação ao redefinir as definições da aplicação (para mais informações, veja 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

    Mais uma vez, pode observar a mudança de comportamento na aplicação de exemplo. Já não podes carregar a aplicação porque ela já não pode aceder às referências do cofre de chaves. A aplicação perdeu a ligação ao cofre de chaves através da rede partilhada.

Os dois endpoints privados só são acessíveis a clientes dentro da rede virtual que criou. Nem sequer podes aceder aos segredos no cofre de chaves através da página Segredos no portal Azure, porque o portal acede-os através da internet pública (ver Gerir os recursos bloqueados).

Configure a integração da rede virtual na sua aplicação

  1. Escale a aplicação para um escalão de preços suportado (veja Integre a sua aplicação com uma rede virtual Azure).

    az appservice plan update --name $planName --resource-group $groupName --sku S1
    
  2. Sem relação com o nosso cenário, mas também importante: aplicar o HTTPS para pedidos recebidos.

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. Habilite a integração de rede virtual em seu 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, apenas o tráfego IP local definido no RFC-1918 é roteado para a rede virtual, que é o que você precisa para os pontos de extremidade privados. Para rotear todo o seu tráfego para a rede virtual, consulte Gerenciar roteamento de integração de rede virtual. O encaminhamento de todo o tráfego também pode ser usado se quiser encaminhar o tráfego da internet através da sua rede virtual, como através de um Azure Virtual Network NAT ou um Azure Firewall.

  4. No navegador, navegue novamente para <app-name>.azurewebsites.net e espere que a integração entre em vigor. Se aparecer um erro HTTP 500, espere alguns minutos e tente novamente. Se conseguir carregar a página e obter resultados de deteção, então está a ligar-se ao endpoint do Azure AI Services com referências do Azure Key Vault.

    Observação

    Se continuar a receber erros HTTP 500 após algum tempo, pode ser útil forçar novamente a obtenção das referências do cofre de chaves, assim:

    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

Dependendo dos seus cenários, pode não conseguir gerir os recursos protegidos do endpoint privado através do portal Azure, Azure CLI ou Azure PowerShell (por exemplo, Key Vault). Estas ferramentas fazem todas chamadas REST API para aceder aos recursos através da internet pública e são bloqueadas pela sua configuração. Aqui estão algumas opções para aceder aos recursos bloqueados:

  • Para o Key Vault, adicione o IP público da sua máquina local para visualizar ou atualizar os segredos protegidos do endpoint privado.
  • Se a sua rede local (on-premises) for expandida para a rede virtual do Azure através de um gateway VPN ou ExpressRoute, pode gerir diretamente os recursos protegidos do endpoint privado a partir da sua rede local.
  • Gerir os recursos protegidos pelo endpoint privado a partir de um servidor de salto na rede virtual.
  • Implementa Cloud Shell na rede virtual.

Limpeza de recursos

Nos passos anteriores, criou recursos do Azure num grupo de recursos. Se não espera precisar destes recursos no futuro, elimine o grupo de recursos executando o seguinte comando na Cloud Shell:

az group delete --name $groupName

Este comando pode demorar alguns minutos a ser executado.

Próximos passos