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ą.
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
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
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/serverfarms
określa, że podsieć jest delegowana na potrzeby integracji z siecią wirtualną App Service.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.
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
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
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
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
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ąpiHTTP 500
błąd. Aplikacja utraciła łączność z zasobem usług Azure AI za pośrednictwem udostępnionej sieci.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
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
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
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
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.
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ę.