Självstudie: Isolera serverdelskommunikation i Azure App Service med Virtual Network integration

I den här artikeln konfigurerar du en App Service app med säker, nätverksisolerad kommunikation till serverdelstjänster. Exempelscenariot som används är i Självstudie: Säker Cognitive Service-anslutning från App Service med hjälp av Key Vault. När du är klar har du en App Service-app som har åtkomst till både Key Vault- och Azure AI-tjänster via ett virtuellt Azure-nätverk, och ingen annan trafik tillåts komma åt dessa serverdelsresurser. All trafik isoleras i ditt virtuella nätverk med hjälp av integrering av virtuella nätverk och privata slutpunkter.

Som en tjänst med flera klientorganisationer delar utgående nätverkstrafik från din App Service-app till andra Azure-tjänster samma miljö med andra appar eller till och med andra prenumerationer. Även om själva trafiken kan krypteras kan vissa scenarier kräva en extra säkerhetsnivå genom att isolera serverdelskommunikationen från annan nätverkstrafik. Dessa scenarier är vanligtvis tillgängliga för stora företag med hög expertisnivå, men App Service gör det inom räckhåll med integrering av virtuella nätverk.

scenarioarkitektur

Med den här arkitekturen:

  • Offentlig trafik till serverdelstjänsterna blockeras.
  • Utgående trafik från App Service dirigeras till det virtuella nätverket och kan nå serverdelstjänsterna.
  • App Service kan utföra DNS-matchning till serverdelstjänsterna via de privata DNS-zonerna.

Det här får du lära dig:

  • Skapa ett virtuellt nätverk och undernät för App Service integrering av virtuella nätverk
  • Skapa privata DNS-zoner
  • Skapa privata slutpunkter
  • Konfigurera integrering av virtuella nätverk i App Service

Förutsättningar

Självstudien förutsätter att du har följt självstudien: Säker Cognitive Service-anslutning från App Service med hjälp av Key Vault och skapat språkidentifieringsappen.

Självstudien fortsätter att använda följande miljövariabler från föregående självstudie. Se till att du ställer in dem korrekt.

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

Skapa virtuella nätverk och undernät

  1. Skapa ett virtuellt nätverk. Ersätt <virtual-network-name> med ett unikt namn.

    # 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. Skapa ett undernät för integrering av App Service virtuella nätverk.

    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
    

    För App Service rekommenderas undernätet för integrering av virtuella nätverk att minst ha ett CIDR-block (se Krav för undernät för integrering av/26 virtuella nätverk). /24 är mer än tillräckligt. --delegations Microsoft.Web/serverfarmsanger att undernätet har delegerats för App Service integrering av virtuella nätverk.

  3. Skapa ett annat undernät för de privata slutpunkterna.

    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
    

    För privata slutpunktsundernät måste du inaktivera nätverksprinciper för privata slutpunkter.

Skapa privata DNS-zoner

Eftersom dina Key Vault- och Azure AI-tjänstresurser ligger bakom privata slutpunkter måste du definiera privata DNS-zoner för dem. Dessa zoner används som värd för DNS-posterna för privata slutpunkter och gör att klienterna kan hitta serverdelstjänsterna efter namn.

  1. Skapa två privata DNS-zoner, en för din Azure AI-tjänstresurs och en för ditt nyckelvalv.

    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
    

    Mer information om de här inställningarna finns i DNS-konfiguration för privat slutpunkt i Azure

  2. Länka de privata DNS-zonerna till det virtuella nätverket.

    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
    

Skapa privata slutpunkter

  1. I det privata slutpunktsundernätet för ditt virtuella nätverk skapar du en privat slutpunkt för din Cognitive Service.

    # 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. Skapa en DNS-zongrupp för den privata slutpunkten för Azure AI-tjänster. DNS-zongrupp är en länk mellan den privata DNS-zonen och den privata slutpunkten. Den här länken hjälper dig att uppdatera den privata DNS-zonen automatiskt när det finns en uppdatering av den privata slutpunkten.

    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. Blockera offentlig trafik till Azure AI-tjänstresursen.

    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
    

    Anteckning

    Kontrollera att etableringstillståndet för ändringen är "Succeeded". Sedan kan du se beteendeförändringen i exempelappen. Du kan fortfarande läsa in appen, men om du försöker klicka på knappen Identifiera får du ett HTTP 500 felmeddelande. Appen har förlorat anslutningen till Azure AI-tjänstresursen via det delade nätverket.

  4. Upprepa stegen ovan för nyckelvalvet.

    # 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. Framtvinga en omedelbar refetch av key vault-referenser i din app genom att återställa appinställningarna (mer information finns i Rotation).

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

    Anteckning

    Återigen kan du se beteendeförändringen i exempelappen. Du kan inte längre läsa in appen eftersom den inte längre kan komma åt key vault-referenser. Appen har förlorat sin anslutning till nyckelvalvet via det delade nätverket.

De två privata slutpunkterna är endast tillgängliga för klienter i det virtuella nätverk som du skapade. Du kan inte ens komma åt hemligheterna i nyckelvalvet via sidan Hemligheter i Azure Portal, eftersom portalen kommer åt dem via det offentliga Internet (se Hantera låsta resurser).

Konfigurera integrering av virtuella nätverk i din app

  1. Skala upp appen till en prisnivå som stöds (se Integrera din app med ett virtuellt Azure-nätverk).

    az appservice plan update --name $appName --resource-group $groupName --sku S1
    
  2. Inte relaterat till vårt scenario men också viktigt, framtvinga HTTPS för inkommande begäranden.

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. Aktivera integrering av virtuella nätverk i din app.

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

    Integrering av virtuella nätverk gör att utgående trafik kan flöda direkt till det virtuella nätverket. Som standard dirigeras endast lokal IP-trafik som definierats i RFC-1918 till det virtuella nätverket, vilket är vad du behöver för de privata slutpunkterna. Information om hur du dirigerar all trafik till det virtuella nätverket finns i Hantera routning för integrering av virtuella nätverk. Routning av all trafik kan också användas om du vill dirigera Internettrafik via ditt virtuella nätverk, till exempel via en Azure Virtual Network NAT eller en Azure Firewall.

  4. I webbläsaren navigerar du till <app-name>.azurewebsites.net igen och väntar tills integreringen börjar gälla. Om du får ett HTTP 500-fel väntar du några minuter och försöker igen. Om du kan läsa in sidan och få identifieringsresultat ansluter du till Azure AI-tjänsternas slutpunkt med key vault-referenser.

    Anteckning

    Om http 500-fel fortsätter att visas efter en längre tid kan det hjälpa till att framtvinga en refetch av key vault-referenser igen, så här:

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

Hantera låsta resurser

Beroende på dina scenarier kanske du inte kan hantera de privata slutpunktsskyddade resurserna via Azure Portal, Azure CLI eller Azure PowerShell (till exempel Key Vault). Alla dessa verktyg gör REST API-anrop för att få åtkomst till resurserna via det offentliga Internet och blockeras av din konfiguration. Här följer några alternativ för att komma åt de låsta resurserna:

Rensa resurser

I de föregående stegen skapade du Azure-resurser i en resursgrupp. Om du inte tror att du behöver dessa resurser i framtiden tar du bort resursgruppen genom att köra följande kommando i Cloud Shell:

az group delete --name $groupName

Det kan några minuter att köra kommandot.

Nästa steg