Esercitazione: Isolare le comunicazioni back-end nel servizio app di Azure usando l'integrazione della rete virtuale

In questo articolo, configuri un'app di Azure App Service con comunicazione sicura, isolata dalla rete ai servizi back-end. Lo scenario di esempio usato si trova in Tutorial: Proteggere la connessione al servizio cognitivo dal servizio app usando Key Vault. Al termine, si dispone di un'app del servizio app che accede sia a Key Vault che a Foundry Tools tramite una rete virtuale di Azure. Nessun altro traffico è autorizzato ad accedere a tali risorse back-end. Tutto il traffico verrà isolato all'interno della rete virtuale tramite l'integrazione della rete virtuale e gli endpoint privati.

In un servizio multi-tenant, il traffico di rete in uscita dall'app del tuo App Service verso altri servizi di Azure condivide lo stesso ambiente con altre applicazioni o anche con altre sottoscrizioni. Anche se il traffico stesso può essere crittografato, alcuni scenari potrebbero richiedere un livello di sicurezza aggiuntivo tramite l'isolamento della comunicazione back-end da altri traffico di rete. Questi scenari sono in genere accessibili alle aziende di grandi dimensioni con un elevato livello di esperienza, ma il servizio app lo mette in portata con l'integrazione della rete virtuale.

Diagramma che mostra l'architettura dello scenario.

In questa architettura:

  • Il traffico pubblico verso i servizi back-end è bloccato.
  • Il traffico in uscita dal servizio app viene instradato alla rete virtuale e può raggiungere i servizi back-end.
  • Il servizio app può eseguire la risoluzione DNS ai servizi back-end tramite le zone DNS private.

Cosa imparerai:

  • Creare una rete virtuale e subnet per l'integrazione della rete virtuale del servizio app
  • Creare zone DNS private
  • Creare endpoint privati
  • Configurare l'integrazione della rete virtuale nel servizio app

Prerequisiti

Creare una rete virtuale e le subnet

  1. Crea una rete virtuale. Sostituire <virtual-network-name> con un nome univoco.

    # 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. Crea una subnet per l'integrazione della rete virtuale di 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
    

    Per App Service, è consigliabile che la subnet di integrazione della rete virtuale abbia un blocco CIDR di /26 come minimo. Vedere Requisiti della subnet di integrazione della rete virtuale. /24 è più che sufficiente. --delegations Microsoft.Web/serverfarmsspecifica che la subnet è delegata per l'integrazione della rete virtuale di Servizio app.

  3. Creare un'altra subnet per gli endpoint privati.

    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
    

    Per le subnet degli endpoint privati, è necessario disabilitare i criteri di rete degli endpoint privati.

Creare zone DNS private

Poiché le risorse di Key Vault e Foundry Tools si troveranno dietro gli endpoint privati, è necessario definire le zone DNS private per tali endpoint. Queste zone vengono usate per ospitare i record DNS per gli endpoint privati e consentire ai client di trovare i servizi back-end in base al nome.

  1. Creare due zone DNS private, una per la risorsa Foundry Tools e una per il key vault.

    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
    

    Per altre informazioni su queste impostazioni, vedere Configurazione DNS dell'endpoint privato di Azure.

  2. Collegare le zone DNS private alla rete virtuale.

    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
    

Creare endpoint privati

  1. Nella subnet dell'endpoint privato della rete virtuale, crea un endpoint privato per la risorsa Foundry Tools.

    # 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. Creare un gruppo di zone DNS per l'endpoint privato di Foundry Tools. Un gruppo di zone DNS è un collegamento tra la zona DNS privata e l'endpoint privato. Questo collegamento consente di aggiornare automaticamente la zona DNS privata quando è presente un aggiornamento all'endpoint privato.

    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. Bloccare il traffico pubblico verso la risorsa Strumenti 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
    

    Annotazioni

    Verificare che lo stato di provisioning della modifica sia "Succeeded". È quindi possibile osservare la modifica del comportamento nell'app di esempio. È comunque possibile caricare l'app, ma se si tenta di selezionare il pulsante Rileva , viene visualizzato un HTTP 500 errore. L'app ha perso la connettività alla risorsa Foundry Tools tramite la rete condivisa.

  4. Ripetere i passaggi precedenti per il vault delle chiavi.

    # 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. Forzare un aggiornamento immediato dei riferimenti dell'insieme di credenziali nell'app reimpostando le impostazioni dell'app. Per altre informazioni, vedere Rotazione.

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

    Annotazioni

    Anche in questo caso, è possibile osservare la modifica del comportamento nell'app di esempio. Non è più possibile caricare l'app perché non può più accedere ai riferimenti al Key Vault. L'app ha perso la connettività all'insieme di credenziali delle chiavi nella rete condivisa.

I due endpoint privati sono accessibili solo ai client all'interno della rete virtuale creata. Non è nemmeno possibile accedere ai segreti nell'insieme di credenziali delle chiavi dalla pagina Segreti nel portale di Azure, perché il portale vi accede tramite la rete internet pubblica. Vedere Gestire le risorse bloccate.

Configurare l'integrazione della rete virtuale nell'app

  1. Ridimensionare l'app fino a un piano tariffario supportato. Vedere Integrare l'app con una rete virtuale di Azure.

    az appservice plan update --name $planName --resource-group $groupName --sku S1
    
  2. Applicare HTTPS per le richieste in ingresso. Questo passaggio non è correlato allo scenario corrente, ma è importante.

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. Abilitare l'integrazione della rete virtuale nell'app.

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

    L'integrazione della rete virtuale consente al traffico in uscita di fluire direttamente nella rete virtuale. Per impostazione predefinita, solo il traffico IP locale definito in RFC-1918 viene instradato alla rete virtuale, che ciò che serve per gli endpoint privati. Per informazioni sul routing di tutto il traffico verso la rete virtuale, vedere Gestire il routing di integrazione della rete virtuale. È anche possibile instradare tutto il traffico se si vuole instradare il traffico Internet attraverso la rete virtuale, ad esempio gateway NAT di Azure o Firewall di Azure.

  4. In un browser passare a <app-name>.azurewebsites.net e attendere che l'integrazione venga applicata. Se viene visualizzato un errore HTTP 500, attendere alcuni minuti e riprovare. Se è possibile caricare la pagina e ottenere i risultati del rilevamento, ci si connette all'endpoint degli strumenti Foundry usando i riferimenti a Key Vault.

    Annotazioni

    Se si ricevono errori HTTP 500 per un periodo prolungato, potrebbe essere utile forzare nuovamente un refetch dei riferimenti al key vault :

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

Gestire le risorse bloccate

A seconda degli scenari, potrebbe non essere possibile gestire le risorse protette dall'endpoint privato tramite il portale di Azure, l'interfaccia della riga di comando di Azure o Azure PowerShell, ad esempio Key Vault. Questi strumenti eseguono tutte chiamate API REST per accedere alle risorse tramite Internet pubblico e vengono bloccati dalla configurazione. Ecco alcune opzioni per accedere alle risorse bloccate:

  • Per Key Vault, aggiungere l'indirizzo IP pubblico del computer locale per visualizzare o aggiornare i segreti protetti da endpoint privati.
  • Se la rete locale viene estesa alla rete virtuale di Azure tramite un gateway VPN o Azure ExpressRoute, è possibile gestire le risorse protette dall'endpoint privato direttamente dalla rete locale.
  • Gestire le risorse nella rete virtuale protette dall'endpoint privato tramite un jump server.
  • Deploy Cloud Shell nella rete virtuale.

Pulire le risorse

Nei passaggi precedenti sono state create le risorse di Azure in un gruppo di risorse. Se non si prevede che queste risorse siano necessarie in futuro, eliminare il gruppo di risorse eseguendo il comando seguente nel Cloud Shell:

az group delete --name $groupName

L'esecuzione del comando può richiedere un minuto.

Passaggi successivi