Compartir a través de


Tutorial: Aislamiento de la comunicación de back-end en Azure App Service con la integración de Virtual Network

En este artículo, configurará una aplicación de App Service para asegurar una comunicación segura y aislada en red con los servicios de backend. El escenario de ejemplo usado se encuentra en Tutorial: Conexión segura de Cognitive Service desde App Service mediante Key Vault. Cuando termines, tendrás una aplicación de App Service que accede tanto a Key Vault como a las herramientas de Foundry a través de una red virtual de Azure red virtual de Azure, y no se permite ningún otro tráfico para acceder a esos recursos de back-end. Todo el tráfico se aislará dentro de la red virtual mediante la integración de red virtual y los puntos de conexión privados.

Como servicio multiinquilino, el tráfico de red saliente de la aplicación de App Service a otros servicios de Azure comparte el mismo entorno con otras aplicaciones o incluso con otras suscripciones. Aunque el propio tráfico se puede cifrar, ciertos escenarios pueden requerir un nivel adicional de seguridad al aislar la comunicación de back-end desde otro tráfico de red. Normalmente, estos escenarios son accesibles para grandes empresas con un alto nivel de experiencia, pero App Service lo pone al alcance de la integración de red virtual.

arquitectura de escenario

Con esta arquitectura:

  • El tráfico público a los servicios back-end está bloqueado.
  • El tráfico saliente de App Service se enruta a la red virtual y puede llegar a los servicios back-end.
  • App Service puede realizar la resolución DNS para los servicios back-end a través de las zonas DNS privadas.

Lo qué aprenderá:

  • Creación de una red virtual y subredes para la integración de red virtual de App Service
  • Creación de zonas DNS privadas
  • Creación de puntos de conexión privados
  • Configuración de la integración de red virtual en App Service

Prerrequisitos

En el tutorial se supone que ha seguido el Tutorial: Protección de la conexión de Cognitive Service desde App Service mediante Key Vault y ha creado la aplicación de detector de lenguaje.

El tutorial sigue usando las siguientes variables de entorno del tutorial anterior. Asegúrese de establecerlos correctamente.

    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>

Creación de redes virtuales y subredes

  1. Cree una red virtual. Reemplace virtual-network-name por un nombre ú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. Cree una subred para la integración de red virtual de 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, se recomienda que la subred de integración de red virtual tenga un bloque CIDR de como mínimo (consulte Requisitos de subred de integración de red virtual). es más que suficiente. especifica que la subred se delega para la integración de red virtual de App Service.

  3. Cree otra subred para los puntos de conexión 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
    

    En el caso de las subredes de punto de conexión privado, debe deshabilitar las directivas de red del punto de conexión privado.

Creación de zonas DNS privadas

Porque los recursos de Key Vault y los servicios de Azure AI estarán ubicados detrás de puntos de conexión privados, debe definir zonas DNS privadas para ellos. Estas zonas se usan para hospedar los registros DNS para los puntos de conexión privados y permiten a los clientes encontrar los servicios back-end por nombre.

  1. Cree dos zonas DNS privadas, una para el recurso de Servicios de Azure AI y otra para el almacén de claves.

    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 obtener más información sobre estas configuraciones, consulte Configuración DNS del punto de conexión privado de Azure

  2. Vincule las zonas DNS privadas a la red 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
    

Creación de puntos de conexión privados

  1. En la subred del punto de conexión privado de su red virtual, cree un punto de conexión privado para su Servicio 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. Cree un grupo de zonas DNS para el punto de conexión privado de Azure AI Services. El grupo de zonas DNS es un vínculo entre la zona DNS privada y el punto de conexión privado. Este vínculo le ayuda a actualizar automáticamente la zona DNS privada cuando hay una actualización del punto de conexión 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 el tráfico público al recurso de Servicios de Azure AI.

    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
    

    Nota:

    Asegúrese de que el estado de aprovisionamiento del cambio es . A continuación, puede observar el cambio de comportamiento en la aplicación de ejemplo. Todavía puede cargar la aplicación, pero si intenta hacer clic en el botón Detectar , recibirá un error. La aplicación ha perdido su conectividad con el recurso Servicios de Azure AI a través de las redes compartidas.

  4. Repita los pasos anteriores para la bóveda de claves.

    # 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. Forzar una actualización inmediata de las referencias del Key Vault de la aplicación mediante el restablecimiento de la configuración de la aplicación (para obtener más información, consulte Rotación).

    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:

    De nuevo, puede observar el cambio de comportamiento en la aplicación de ejemplo. Ya no se puede cargar la aplicación debido a la imposibilidad de acceder a las referencias de la bóveda de claves. La aplicación ha perdido su conectividad con la bóveda de claves a través de la red compartida.

Los dos puntos de conexión privados solo son accesibles para los clientes dentro de la red virtual que creó. Ni siquiera puede acceder a los secretos del almacén de claves a través de Secrets página en el portal de Azure, ya que el portal accede a ellos a través de la red pública de Internet (consulte Administrar los recursos bloqueados).

Configuración de la integración de red virtual en la aplicación

  1. Escale la aplicación hasta un plan de tarifa compatible (consulte Integrate la aplicación con una red virtual de Azure).

    az appservice plan update --name $planName --resource-group $groupName --sku S1
    
  2. No está relacionado con nuestro escenario, pero también importante, aplicar HTTPS para las solicitudes entrantes.

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. Habilite la integración de red virtual en la aplicación.

    az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet
    

    La integración de red virtual permite que el tráfico saliente fluya directamente a la red virtual. De manera predeterminada, solo el tráfico IP local definido en RFC-1918 se enruta a la red virtual, que es lo que necesita para los puntos de conexión privados. Para enrutar todo el tráfico a la red virtual, vea Administración del enrutamiento de la integración de red virtual. También se puede usar el enrutamiento de todo el tráfico si desea enrutar el tráfico de Internet a través de la red virtual, como a través de un Azure Virtual Network NAT o un Azure Firewall.

  4. En el navegador, navegue de nuevo al [sitio/aplicación] y espere a que la integración surta efecto. Si recibe un error HTTP 500, espere unos minutos e inténtelo de nuevo. Si puede cargar la página y obtener resultados de detección, entonces se está conectando al punto de conexión de los Servicios de IA de Azure con las referencias del almacén de claves.

    Nota:

    Si sigue recibiendo errores HTTP 500 después de mucho tiempo, puede ayudar a forzar una refetación de las referencias del almacén de claves de nuevo, de la siguiente manera:

    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)"
    

Administración de los recursos bloqueados

En función de los escenarios, es posible que no pueda administrar los recursos protegidos del punto de conexión privado a través del portal de Azure, CLI de Azure o Azure PowerShell (por ejemplo, Key Vault). Todas estas herramientas realizan llamadas a la API REST para acceder a los recursos a través de la red pública de Internet y están bloqueadas por la configuración. Estas son algunas opciones para acceder a los recursos bloqueados:

  • Para Key Vault, agregue la dirección IP pública de la máquina local para ver o actualizar los secretos protegidos del punto de conexión privado.
  • Si la red local se extiende a la red virtual Azure a través de una puerta de enlace VPN o ExpressRoute, puede administrar los recursos protegidos del punto de conexión privado directamente desde la red local.
  • Administre los recursos protegidos del punto de conexión privado desde un servidor de salto en la red virtual.
  • Deploy Cloud Shell en la red virtual.

Limpieza de recursos

En los pasos precedentes, creó recursos de Azure en un grupo de recursos. Si no espera necesitar estos recursos en el futuro, elimine el grupo de recursos ejecutando el comando siguiente en el Cloud Shell:

az group delete --name $groupName

Este comando puede tardar varios segundos en ejecutarse.

Pasos siguientes