Samouczek: izolowanie komunikacji zaplecza w Azure App Service za pomocą integracji z usługą Virtual Network

W tym artykule skonfigurujesz aplikację App Service z bezpieczną izolowanym siecią komunikacją z usługami zaplecza. Przykładowy scenariusz jest używany w artykule Samouczek: zabezpieczanie połączenia usługi Cognitive Service z App Service przy użyciu Key Vault. Po zakończeniu będziesz mieć aplikację App Service, która uzyskuje dostęp do usług Key Vault i Azure AI za pośrednictwem sieci wirtualnej platformy Azure, a żaden inny ruch nie może uzyskiwać dostępu do tych zasobów zaplecza. Cały ruch zostanie odizolowany w sieci wirtualnej przy użyciu integracji sieci wirtualnej i prywatnych punktów końcowych.

Jako usługa z wieloma dzierżawami ruch sieciowy wychodzący z aplikacji App Service do innych usług platformy Azure współudzieli to samo środowisko z innymi aplikacjami, a nawet innymi subskrypcjami. Chociaż sam ruch może być zaszyfrowany, niektóre scenariusze mogą wymagać dodatkowego poziomu zabezpieczeń przez izolowanie komunikacji zaplecza z innego ruchu sieciowego. Te scenariusze są zwykle dostępne dla dużych przedsiębiorstw o wysokim poziomie wiedzy, ale App Service ująć je w zasięgu integracji z siecią wirtualną.

architektura scenariusza

Z tą architekturą:

  • Ruch publiczny do usług zaplecza jest blokowany.
  • Ruch wychodzący z App Service jest kierowany do sieci wirtualnej i może uzyskiwać dostęp do usług zaplecza.
  • App Service jest w stanie przeprowadzić rozpoznawanie nazw DNS w usługach zaplecza za pośrednictwem prywatnych stref DNS.

Czego się nauczysz:

  • Tworzenie sieci wirtualnej i podsieci na potrzeby integracji z siecią wirtualną App Service
  • Tworzenie prywatnych stref DNS
  • Tworzenie prywatnych punktów końcowych
  • Konfigurowanie integracji sieci wirtualnej w programie App Service

Wymagania wstępne

W samouczku założono, że wykonano czynności opisane w artykule Samouczek: zabezpieczanie połączenia z usługą Cognitive Service z App Service przy użyciu Key Vault i utworzono aplikację do wykrywania języka.

W samouczku są nadal używane następujące zmienne środowiskowe z poprzedniego samouczka. Upewnij się, że ustawiono je prawidłowo.

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

Tworzenie sieci wirtualnej i podsieci

  1. Utwórz sieć wirtualną. Zastąp ciąg< virtual-network-name> unikatową nazwą.

    # 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. Utwórz podsieć na potrzeby integracji App Service sieci wirtualnej.

    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
    

    W przypadku App Service zaleca się, aby podsieć integracji sieci wirtualnej miała co najmniej blok /26 CIDR (zobacz Wymagania dotyczące podsieci integracji sieci wirtualnej). /24 jest większa niż wystarczająca. --delegations Microsoft.Web/serverfarmsokreśla, że podsieć jest delegowana na potrzeby integracji z siecią wirtualną App Service.

  3. Utwórz kolejną podsieć dla prywatnych punktów końcowych.

    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
    

    W przypadku podsieci prywatnych punktów końcowych należy wyłączyć zasady sieci prywatnego punktu końcowego.

Tworzenie prywatnych stref DNS

Ponieważ zasoby usług Key Vault i Azure AI znajdują się za prywatnymi punktami końcowymi, należy zdefiniować dla nich prywatne strefy DNS. Te strefy są używane do hostowania rekordów DNS dla prywatnych punktów końcowych i umożliwiają klientom znajdowanie usług zaplecza według nazwy.

  1. Utwórz dwie prywatne strefy DNS: jedną dla zasobu usług Azure AI i jedną dla magazynu kluczy.

    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
    

    Aby uzyskać więcej informacji na temat tych ustawień, zobacz Konfiguracja usługi DNS prywatnego punktu końcowego platformy Azure

  2. Połącz prywatne strefy DNS z siecią wirtualną.

    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
    

Tworzenie prywatnych punktów końcowych

  1. W podsieci prywatnego punktu końcowego sieci wirtualnej utwórz prywatny punkt końcowy dla usługi 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. Utwórz grupę stref DNS dla prywatnego punktu końcowego usług AI platformy Azure. Grupa stref DNS jest łączem między prywatną strefą DNS a prywatnym punktem końcowym. Ten link ułatwia automatyczne aktualizowanie prywatnej strefy DNS w przypadku aktualizacji prywatnego punktu końcowego.

    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. Blokuj ruch publiczny do zasobu usług 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
    

    Uwaga

    Upewnij się, że stan aprowizacji zmiany to "Succeeded". Następnie możesz obserwować zmianę zachowania w przykładowej aplikacji. Nadal możesz załadować aplikację, ale jeśli spróbujesz kliknąć przycisk Wykryj , wystąpi HTTP 500 błąd. Aplikacja utraciła łączność z zasobem usług Azure AI za pośrednictwem udostępnionej sieci.

  4. Powtórz powyższe kroki dla magazynu kluczy.

    # 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. Wymuś natychmiastowe ponowne pobranie odwołań magazynu kluczy w aplikacji przez zresetowanie ustawień aplikacji (aby uzyskać więcej informacji, zobacz Rotacja).

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

    Uwaga

    Ponownie możesz obserwować zmiany zachowania w przykładowej aplikacji. Nie można już załadować aplikacji, ponieważ nie może już uzyskać dostępu do odwołań do magazynu kluczy. Aplikacja utraciła łączność z magazynem kluczy za pośrednictwem udostępnionej sieci.

Dwa prywatne punkty końcowe są dostępne tylko dla klientów w utworzonej sieci wirtualnej. Nie można nawet uzyskać dostępu do wpisów tajnych w magazynie kluczy za pośrednictwem strony Wpisy tajne w Azure Portal, ponieważ portal uzyskuje do nich dostęp za pośrednictwem publicznego Internetu (zobacz Zarządzanie zablokowanymi zasobami).

Konfigurowanie integracji sieci wirtualnej w aplikacji

  1. Przeprowadź skalowanie aplikacji w górę do obsługiwanej warstwy cenowej (zobacz Integrowanie aplikacji z siecią wirtualną platformy Azure).

    az appservice plan update --name $appName --resource-group $groupName --sku S1
    
  2. Niezwiązane z naszym scenariuszem, ale także ważne, wymuszanie protokołu HTTPS dla żądań przychodzących.

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. Włącz integrację z siecią wirtualną w aplikacji.

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

    Integracja z siecią wirtualną umożliwia przepływ ruchu wychodzącego bezpośrednio do sieci wirtualnej. Domyślnie do sieci wirtualnej jest kierowany tylko lokalny ruch IP zdefiniowany w dokumencie RFC-1918 , co jest potrzebne w przypadku prywatnych punktów końcowych. Aby skierować cały ruch do sieci wirtualnej, zobacz Zarządzanie routingiem integracji z siecią wirtualną. Routing całego ruchu może być również używany, jeśli chcesz kierować ruch internetowy przez sieć wirtualną, na przykład za pośrednictwem translatora adresów sieciowych platformy Azure Virtual Network lub Azure Firewall.

  4. W przeglądarce przejdź ponownie do <app-name>.azurewebsites.net strony i poczekaj na zastosowanie integracji. Jeśli wystąpi błąd HTTP 500, zaczekaj kilka minut i spróbuj ponownie. Jeśli możesz załadować stronę i uzyskać wyniki wykrywania, łączysz się z punktem końcowym usług Azure AI za pomocą odwołań do magazynu kluczy.

    Uwaga

    Jeśli po długim czasie występują błędy HTTP 500, może to pomóc wymusić ponowne pobranie odwołań do magazynu kluczy w następujący sposób:

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

Zarządzanie zablokowanymi zasobami

W zależności od scenariuszy zarządzanie zasobami chronionymi przez prywatny punkt końcowy może nie być możliwe za pośrednictwem Azure Portal, interfejsu wiersza polecenia platformy Azure lub Azure PowerShell (na przykład Key Vault). Wszystkie te narzędzia tworzą wywołania interfejsu API REST w celu uzyskania dostępu do zasobów za pośrednictwem publicznego Internetu i są blokowane przez konfigurację. Poniżej przedstawiono kilka opcji uzyskiwania dostępu do zablokowanych zasobów:

  • W przypadku Key Vault dodaj publiczny adres IP maszyny lokalnej, aby wyświetlić lub zaktualizować wpisy tajne chronione przez prywatny punkt końcowy.
  • Jeśli sieć lokalna jest rozszerzona do sieci wirtualnej platformy Azure za pośrednictwem bramy sieci VPN lub usługi ExpressRoute, możesz zarządzać zasobami chronionymi przez prywatny punkt końcowy bezpośrednio z sieci lokalnej.
  • Zarządzanie zasobami chronionymi przez prywatny punkt końcowy z serwera przesiadkowego w sieci wirtualnej.
  • Wdróż Cloud Shell w sieci wirtualnej.

Czyszczenie zasobów

W poprzednich krokach utworzono zasoby platformy Azure w grupie zasobów. Jeśli te zasoby nie będą raczej potrzebne w przyszłości, usuń grupę zasobów, uruchamiając następujące polecenie w usłudze Cloud Shell:

az group delete --name $groupName

Wykonanie tego polecenia może potrwać około minutę.

Następne kroki