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

En este artículo va a configurar una aplicación de App Service con comunicación segura con aislamiento de red con servicios de back-end. El escenario de ejemplo usado está en Tutorial: Protección de la conexión de Cognitive Service desde App Service mediante Key Vault. Cuando termine, tendrá una aplicación de App Service que accede tanto a Key Vault como a los servicios de Azure AI por medio de una red virtual de Azure, y no se permitirá que ningún otro tráfico acceda a esos recursos de back-end. Todo el tráfico estará aislado 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 desde la aplicación de App Service a otros servicios de Azure comparte el mismo entorno con otras aplicaciones o incluso otras suscripciones. Aunque el propio tráfico se puede cifrar, determinados escenarios pueden exigir un nivel adicional de seguridad mediante el aislamiento de la comunicación de back-end de otro tráfico de red. Estos escenarios suelen ser accesibles para grandes empresas con un alto nivel de experiencia, pero App Service los pone al alcance de cualquiera con la integración de red virtual.

scenario architecture

Con esta arquitectura:

  • El tráfico público a los servicios de back-end se bloquea.
  • El tráfico saliente de App Service se enruta a la red virtual y puede llegar a los servicios de back-end.
  • App Service puede realizar la resolución DNS en los servicios de back-end mediante 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 con red virtual en App Service

Prerrequisitos

En el tutorial se da por hecho que ha seguido Tutorial: Protección de la conexión de Cognitive Service desde App Service mediante Key Vault y ha creado la aplicación de detección de idiomas.

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

    groupName=myKVResourceGroup
    region=westeurope
    csResourceName=<cs-resource-name>
    appName=<app-name>
    vaultName=<vault-name>

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 --disable-private-endpoint-network-policies false
    

    En App Service, se recomienda que la subred de integración de red virtual tenga un bloque CIDR de /26 como mínimo (vea Requisitos de subred de integración de red virtual). /24 es más que suficiente. --delegations Microsoft.Web/serverfarms 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 --disable-private-endpoint-network-policies true
    

    En las subredes de puntos de conexión privados, debe deshabilitar las directivas de red de punto de conexión privado.

Creación de zonas DNS privadas

Dado que los recursos de Key Vault y los servicios de Azure AI se encuentran tras los puntos de conexión privados, debe definir zonas DNS privadas para ellos. Estas zonas se usan para hospedar los registros DNS de los puntos de conexión privados y para permitir que los clientes encuentren los servicios de back-end por nombre.

  1. Cree dos zonas DNS privadas, una para el recurso de los 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 esta configuración, vea Configuración de DNS para puntos de conexión privados 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 los servicios de Azure AI. 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. Bloquee el tráfico público al recurso de los servicios de Azure AI.

    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

    Asegúrese de que el estado de aprovisionamiento del cambio es "Succeeded". Luego 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, se produce un error HTTP 500. La aplicación ha perdido su conectividad con el recurso de los servicios de Azure AI a través de las redes compartidas.

  4. Repita los pasos anteriores para el almacén 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. Fuerce una nueva captura inmediata de las referencias del almacén de claves en la aplicación mediante el restablecimiento de la configuración de la aplicación (para obtener más información, vea 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

    Una vez más puede observar el cambio de comportamiento en la aplicación de ejemplo. Ya no puede cargar la aplicación porque ya no puede acceder a las referencias del almacén de claves. La aplicación ha perdido su conectividad con el almacén de claves a través de las redes compartidas.

Los dos puntos de conexión privados solo son accesibles para los clientes de dentro de la red virtual creada. Ni siquiera puede acceder a los secretos del almacén de claves por medio de la página Secretos de Azure Portal, ya que el portal accede a ellos a través de la red pública de Internet (vea Administración de 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 (vea Integración de la aplicación con una red virtual de Azure).

    az appservice plan update --name $appName --resource-group $groupName --sku S1
    
  2. No relacionado con este escenario, pero también importante, aplique 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 se quiere enrutar el tráfico de Internet a través de la red virtual, por ejemplo, a través de Azure Virtual Network NAT o Azure Firewall.

  4. En el explorador, vaya a <app-name>.azurewebsites.net de nuevo y espere a que la integración se aplique. 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, se está conectando al punto de conexión de los servicios de Azure AI con referencias del almacén de claves.

    Nota

    Si sigue recibiendo errores HTTP 500 después de mucho tiempo, forzar una nueva captura de las referencias del almacén de claves puede ayudar, así:

    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 mediante Azure Portal, la CLI de Azure o Azure PowerShell (por ejemplo, Key Vault). Todas estas herramientas hacen llamadas API de 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:

  • En 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 de Azure mediante una puerta de enlace de 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 de la red virtual.
  • Implementación de Cloud Shell en la red virtual.

Limpieza de recursos

En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:

az group delete --name $groupName

Este comando puede tardar varios segundos en ejecutarse.

Pasos siguientes