Tutorial: Isolieren der Back-End-Kommunikation in Azure App Service mit Virtual Network-Integration
In diesem Artikel konfigurieren Sie eine App Service-App mit sicherer, netzwerkisolierter Kommunikation mit Back-End-Diensten. Das verwendete Beispielszenario befindet sich in Tutorial: Sichere Verbindung des Cognitive Service vom App Service aus mit Key Vault. Nach Abschluss des Tutorials verfügen Sie über eine App Service-App, die über ein virtuelles Azure-Netzwerk sowohl auf Key Vault als auch auf Azure KI Services zugreift, und diese Back-End-Ressourcen sind für keinen anderen Datenverkehr zugänglich. Der gesamte Datenverkehr wird innerhalb Ihres virtuellen Netzwerks mithilfe der Integration virtueller Netzwerke und privater Endpunkte isoliert.
Da es sich um einen mehrinstanzenfähigen Dienst handelt, teilt sich der von Ihrer App Service-App an andere Azure-Dienste ausgehende Datenverkehr die gleiche Umgebung mit anderen Apps oder sogar anderen Abonnements. Während der Datenverkehr selbst verschlüsselt werden kann, ist in bestimmten Szenarien möglicherweise eine zusätzliche Sicherheitsstufe erforderlich, indem die Back-End-Kommunikation vom übrigen Netzwerkdatenverkehr isoliert wird. Diese Szenarien sind in der Regel nur für große Unternehmen mit einem hohen Maß an Fachwissen zugänglich, aber App Service bietet diese Möglichkeit mithilfe der Integration virtueller Netzwerke.
Mit dieser Architektur:
- Öffentlicher Datenverkehr zu den Back-End-Diensten wird blockiert.
- Ausgehender Datenverkehr von App Service wird an das virtuelle Netzwerk weitergeleitet und kann die Back-End-Dienste erreichen.
- App Service ist in der Lage, die DNS-Auflösung für die Back-End-Dienste über die privaten DNS-Zonen durchzuführen.
Sie lernen Folgendes:
- Erstellen eines virtuellen Netzwerks und von Subnetzen für die Integration virtueller Netzwerke in App Service
- Create private DNS zones (Erstellen von privaten DNS-Zonen)
- Erstellen privater Endpunkte
- Konfigurieren der Integration virtueller Netzwerke in App Service
Voraussetzungen
Das Tutorial setzt voraus, dass Sie das Tutorial: Sichere Verbindung des Cognitive Service vom App Service aus mit Key Vault befolgt und die Spracherkennungs-App erstellt haben.
Im Tutorial werden weiterhin die folgenden Umgebungsvariablen aus dem vorherigen Tutorial verwendet. Stellen Sie sicher, dass Sie sie ordnungsgemäß festlegen.
groupName=myKVResourceGroup
region=westeurope
csResourceName=<cs-resource-name>
appName=<app-name>
vaultName=<vault-name>
Erstellen des virtuellen Netzwerks und der Subnetze
Erstellen Sie ein virtuelles Netzwerk. Ersetzen Sie <virtual-network-name> durch einen eindeutigen Namen.
# 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
Erstellen Sie ein Subnetz für die Integration virtueller Netzwerke in 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
Für App Service wird empfohlen, dass das Subnetz für die Integration virtueller Netzwerke einen CIDR-Block von mindestens
/26
besitzt (siehe Voraussetzungen für das Subnetz der Integration virtueller Netzwerke)./24
ist mehr als ausreichend.--delegations Microsoft.Web/serverfarms
gibt an, dass das Subnetz für die Integration virtueller Netzwerke in App Service delegiert ist.Erstellen Sie ein weiteres Subnetz für die privaten Endpunkte.
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 Subnetze privater Endpunkte müssen Sie die Netzwerkrichtlinien für private Endpunkte deaktivieren.
Create private DNS zones (Erstellen von privaten DNS-Zonen)
Da Ihre Key Vault- und Azure KI Services-Ressourcen sich hinter privaten Endpunkten befinden, müssen Sie für sie private DNS-Zonen definieren. Diese Zonen werden verwendet, um die DNS-Einträge für private Endpunkte zu hosten und es den Clients zu ermöglichen, die Back-End-Dienste anhand ihres Namens zu finden.
Erstellen Sie zwei private DNS-Zonen, eine für Ihre Azure KI Services-Ressource und eine für Ihren Schlüsseltresor.
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
Weitere Informationen zu diesen Einstellungen finden Sie unter DNS-Konfiguration für private Azure-Endpunkte.
Verknüpfen Sie die privaten DNS-Zonen mit dem virtuellen Netzwerk.
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
Erstellen privater Endpunkte
Erstellen Sie im Subnetz der privaten Endpunkte Ihres virtuellen Netzwerks einen privaten Endpunkt für Ihren 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
Erstellen Sie eine DNS-Zonengruppe für den privaten Azure KI Services-Endpunkt. Die DNS-Zonengruppe ist eine Verknüpfung zwischen der privaten DNS-Zone und dem privaten Endpunkt. Mit diesem Link können Sie die private DNS-Zone automatisch aktualisieren, wenn ein Update für den privaten Endpunkt vorliegt.
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
Blockieren Sie öffentlichen Datenverkehr für die Azure KI Services-Ressource.
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
Hinweis
Stellen Sie sicher, dass der Bereitstellungsstatus Ihrer Änderung
"Succeeded"
lautet. Anschließend können Sie die Behavior Change in der Beispiel-App beobachten. Sie können die App immer noch laden, aber wenn Sie versuchen, auf die Schaltfläche Erkennen zu klicken, erhalten Sie einenHTTP 500
-Fehler. Die Verbindung der App mit der Azure KI Services-Ressource über das freigegebene Netzwerk wurde getrennt.Wiederholen Sie die angegebenen Schritte für den Schlüsseltresor.
# 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
Erzwingen Sie einen sofortigen Neuabruf der Schlüssltresorverweise in Ihrer App, indem Sie die App-Einstellungen zurücksetzen (weitere Informationen finden Sie unter 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)"
Hinweis
Auch hier können Sie die Behavior Change in der Beispiel-App beobachten. Sie können die App nicht mehr laden, da sie nicht mehr auf die Schlüsseltresorverweise zugreifen kann. Die Verbindung der App mit dem Schlüsseltresor über das freigegebene Netzwerk wurde getrennt.
Die beiden privaten Endpunkte sind nur für Clients innerhalb des von Ihnen erstellten virtuellen Netzwerks zugänglich. Sie können nicht einmal über die Seite Geheimnisse im Azure-Portal auf die Geheimnisse im Schlüsseltresor zugreifen, da das Portal über das öffentliche Internet auf sie zugreift (weitere Informationen finden Sie unter Verwalten gesperrter Ressourcen).
Konfigurieren der Integration virtueller Netzwerke in Ihrer App
Skalieren Sie die App auf einen unterstützten Tarif hoch (siehe Integrieren Ihrer App in ein virtuelles Azure-Netzwerk).
az appservice plan update --name $appName --resource-group $groupName --sku S1
Unabhängig von unserem Szenario, aber auch wichtig, erzwingen Sie HTTPS für eingehende Anforderungen.
az webapp update --resource-group $groupName --name $appName --https-only
Aktivieren Sie die Integration virtueller Netzwerke in Ihrer App.
az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet
Die Integration virtueller Netzwerke ermöglicht ausgehendem Datenverkehr, direkt in das virtuelle Netzwerk zu fließen. Standardmäßig wird nur der in RFC-1918 definierte lokale IP-Datenverkehr an das virtuelle Netzwerk weitergeleitet, was für die privaten Endpunkte erforderlich ist. Informationen zum Weiterleiten des gesamten Datenverkehrs an das virtuelle Netzwerk finden Sie unter Verwalten des Routings der Integration virtueller Netzwerke. Das Routing des gesamten Datenverkehrs kann auch verwendet werden, wenn Sie den Internetdatenverkehr durch Ihr virtuelles Netzwerk leiten möchten, z. B. durch eine Azure Virtual Network NAT oder eine Azure Firewall.
Navigieren Sie im Browser erneut zu
<app-name>.azurewebsites.net
und warten Sie, bis die Integration wirksam wird. Wenn Sie einen HTTP 500-Fehler erhalten, warten Sie ein paar Minuten, und versuchen Sie es erneut. Wenn Sie die Seite laden können und Erkennungsergebnisse erhalten, stellen Sie mithilfe von Key Vault-Verweisen eine Verbindung mit dem Azure KI Services-Endpunkt her.Hinweis
Wenn Sie nach langer Zeit immer wieder HTTP-500-Fehler erhalten, kann es helfen, wie folgt einen erneuten Abruf der Schlüsseltresorverweise zu erzwingen:
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)"
Verwalten gesperrter Ressourcen
Abhängig von Ihren Szenarien können Sie die durch einen privaten Endpunkt geschützten Ressourcen möglicherweise nicht über das Azure-Portal, die Azure CLI oder Azure PowerShell (z. B. Key Vault) verwalten. Diese Tools führen alle REST-API-Aufrufe durch, um über das öffentliche Internet auf die Ressourcen zuzugreifen, und werden durch Ihre Konfiguration blockiert. Hier sind einige Optionen für den Zugriff auf die gesperrten Ressourcen:
- Für Key Vault fügen Sie die öffentliche IP-Adresse Ihres lokalen Computers hinzu, um die Geheimnisse des privaten Endpunkts anzuzeigen oder zu aktualisieren.
- Wenn Ihr lokales Netzwerk über ein VPN Gateway oder ExpressRoute in das virtuelle Azure-Netzwerk erweitert wird, können Sie die durch einen privaten Endpunkt geschützten Ressourcen direkt über Ihr lokales Netzwerk verwalten.
- Verwalten Sie die durch private Endpunkte geschützten Ressourcen von einem Jumpserver im virtuellen Netzwerk aus.
- Stellen Sie Cloud Shell im virtuellen Netzwerk bereit.
Bereinigen von Ressourcen
In den vorherigen Schritten haben Sie Azure-Ressourcen in einer Ressourcengruppe erstellt. Wenn Sie diese Ressourcen in Zukunft nicht mehr benötigen, löschen Sie die Ressourcengruppe, indem Sie den folgenden Befehl in Cloud Shell ausführen:
az group delete --name $groupName
Die Ausführung dieses Befehls kann eine Minute in Anspruch nehmen.