Integrieren von API Management in ein internes virtuelles Netzwerk mit Application Gateway

GILT FÜR: Developer | Premium

Azure API Management kann in einem virtuellen Netzwerk im internen Modus konfiguriert werden, sodass nur innerhalb des virtuellen Netzwerks darauf zugegriffen werden kann. Azure Application Gateway ist ein PaaS (Platform-as-a-Service), der als Layer-7-Lastenausgleich fungiert. Er fungiert als Reverseproxydienst und bietet unter anderem eine Azure Web Application Firewall (WAF).

Die Kombination aus API Management in einem internen virtuellen Netzwerk und Application Gateway-Front-End ermöglicht Folgendes:

  • Verwenden Sie dieselbe API Management-Ressource für die Nutzung durch interne und externe Consumer.
  • Verwenden Sie nur eine API Management-Ressource, und halten Sie eine Teilmenge der in API Management definierten APIs für externe Consumer bereit.
  • Schaffen Sie eine einfache Möglichkeit zum Aktivieren und Deaktivieren des Zugriffs auf API Management über das öffentliche Internet.

Einen Architekturleitfaden finden Sie unter:

Hinweis

Dieser Artikel wurde für die Verwendung der WAF_v2-SKU für Application Gateway aktualisiert.

Voraussetzungen

Hinweis

Es wird empfohlen, das Azure Az PowerShell-Modul für die Interaktion mit Azure zu verwenden. Informationen zu den ersten Schritten finden Sie unter Installieren des Azure Az PowerShell-Moduls. Informationen zum Migrieren zum Az PowerShell-Modul finden Sie unter Migrieren von Azure PowerShell von AzureRM zum Az-Modul.

Zum Ausführen der in diesem Artikel beschriebenen Schritte benötigen Sie Folgendes:

Szenario

In diesem Artikel erfahren Sie, wie Sie eine einzelne API Management-Instanz sowohl für interne als auch externe Consumer verwenden und als einzelnes Front-End für lokale und cloudbasierte APIs einrichten. Sie erstellen eine API Management-Instanz des neueren Typs für Einzelmandanten Version 2 (stv2). Sie erfahren, wie Sie öffentliche und private Listener im Application Gateway verwenden. Sie verstehen, wie Sie mit den in Application Gateway verfügbaren Routingfunktionen nur eine Teilmenge Ihrer APIs für die externe Nutzung verfügbar machen können. Im Beispiel sind die APIs grün hervorgehoben.

Im ersten Setupbeispiel werden alle APIs ausschließlich innerhalb Ihres virtuellen Netzwerks verwaltet. Interne Consumer können auf alle Ihre internen und externen APIs zugreifen. Der Datenverkehr gelangt nie ins Internet. Hochleistungskonnektivität kann über Azure ExpressRoute-Verbindungen bereitgestellt werden. In diesem Beispiel sind die internen Consumer orange hervorgehoben.

Diagramm, das die URL-Route zeigt.

Was ist für die Integration von API Management und Application Gateway erforderlich?

  • Back-End-Serverpool: Dies ist die interne virtuelle IP-Adresse von API Management.
  • Einstellungen für den Back-End-Serverpool: Jeder Pool besitzt Einstellungen wie Port, Protokoll und cookiebasierte Affinität. Diese Einstellungen werden auf alle Server innerhalb des Pools angewendet.
  • Front-End-Port: Der öffentliche Port, der im Anwendungsgateway geöffnet ist. Datenverkehr, der an diesem Port eintrifft, wird an einen der Back-End-Server umgeleitet.
  • Listener: Der Listener verfügt über einen Front-End-Port, ein Protokoll (Http oder Https, jeweils unter Beachtung der Groß-/Kleinschreibung) und den Namen des TLS (Transport Layer Security)-Zertifikats (falls die TLS-Auslagerung konfiguriert wird).
  • Regel: Mit der Regel wird ein Listener an einen Back-End-Serverpool gebunden.
  • Benutzerdefinierter Integritätstest: Für Application Gateway werden standardmäßig auf IP-Adressen basierende Tests verwendet, um zu ermitteln, welche Server im BackendAddressPool aktiv sind. API Management reagiert nur auf Anforderungen mit den richtigen Hostheadern, sodass bei den Standardtests ein Fehler auftritt. Ein benutzerdefinierter Integritätstest wird definiert, damit vom Anwendungsgateway ermittelt werden kann, ob der Dienst aktiv ist und Anforderungen weitergeleitet werden.
  • Benutzerdefinierte Domänenzertifikate: Zum Zugreifen auf API Management über das Internet müssen Sie DNS (Domain Name System)-Einträge erstellen, um die Hostnamen der IP-Adresse des Application Gateway-Front-Ends zuzuordnen. Diese Zuordnung stellt die Gültigkeit des Host-Headers und des Zertifikats sicher, die an API Management gesendet werden. In diesem Beispiel verwenden wir drei Zertifikate. Sie sind für das Gateway (Back-End), das Entwicklerportal und den Verwaltungsendpunkt von API Management vorgesehen.

Externes Verfügbarmachen des Entwicklerportals und des Verwaltungsendpunkts über Application Gateway

In diesem Artikel werden das Entwicklerportal und der Verwaltungsendpunkt über das Anwendungsgateway auch externen Zielgruppen verfügbar gemacht. Hierzu müssen zusätzliche Schritte ausgeführt werden, um einen Listener, einen Test, Einstellungen und Regeln für die einzelnen Endpunkte zu erstellen. Alle Details finden Sie in den entsprechenden Schritten.

Wenn Sie Microsoft Entra ID oder die Authentifizierung eines Drittanbieters verwenden, aktivieren Sie in Application Gateway das Feature Cookiebasierte Sitzungsaffinität.

Warnung

Um zu verhindern, dass das Herunterladen von OpenAPI-Spezifikationen im Entwicklerportal durch die Application Gateway-WAF unterbrochen wird, muss die Firewallregel 942200 - "Detects MySQL comment-/space-obfuscated injections and backtick termination" deaktiviert werden.

Folgende Application Gateway-WAF-Regeln können die Funktionalität des Portals beeinträchtigen:

  • 920300, 920330, 931130, 942100, 942110, 942180, 942200, 942260, 942340, 942370 für den Verwaltungsmodus
  • 942200, 942260, 942370, 942430, 942440 für das veröffentlichte Portal

Festlegen von Variablen

In dieser Anleitung müssen Sie mehrere Variablen definieren. Die Benennung basiert auf dem Leitfaden Cloud Adoption Framework-Abkürzungen.

# These variables must be changed.
$subscriptionId = "00000000-0000-0000-0000-000000000000"      # GUID of your Azure subscription
$domain = "contoso.net"                                       # The custom domain for your certificate
$apimServiceName = "apim-contoso"                             # API Management service instance name, must be globally unique    
$apimDomainNameLabel = $apimServiceName                       # Domain name label for API Management's public IP address, must be globally unique
$apimAdminEmail = "admin@contoso.net"                         # Administrator's email address - use your email address

$gatewayHostname = "api.$domain"                              # API gateway host
$portalHostname = "portal.$domain"                            # API developer portal host
$managementHostname = "management.$domain"                    # API management endpoint host

$baseCertPath = "C:\Users\Contoso\"                           # The base path where all certificates are stored
$trustedRootCertCerPath = "${baseCertPath}trustedroot.cer"    # Full path to contoso.net trusted root .cer file
$gatewayCertPfxPath = "${baseCertPath}gateway.pfx"            # Full path to api.contoso.net .pfx file
$portalCertPfxPath = "${baseCertPath}portal.pfx"              # Full path to portal.contoso.net .pfx file
$managementCertPfxPath = "${baseCertPath}management.pfx"      # Full path to management.contoso.net .pfx file

$gatewayCertPfxPassword = "certificatePassword123"            # Password for api.contoso.net pfx certificate
$portalCertPfxPassword = "certificatePassword123"             # Password for portal.contoso.net pfx certificate
$managementCertPfxPassword = "certificatePassword123"         # Password for management.contoso.net pfx certificate

# These variables may be changed.
$resGroupName = "rg-apim-agw"                                 # Resource group name that will hold all assets
$location = "West US"                                         # Azure region that will hold all assets
$apimOrganization = "Contoso"                                 # Organization name    
$appgwName = "agw-contoso"                                    # The name of the Application Gateway

Erstellen einer Ressourcengruppe für den Resource Manager

So erstellen Sie eine Ressourcengruppe für Azure Resource Manager:

  1. Melden Sie sich bei Azure an.

    Connect-AzAccount
    
  2. Authentifizieren Sie sich mit Ihren Anmeldeinformationen.

  3. Wählen Sie das gewünschte Abonnement aus.

    Get-AzSubscription -Subscriptionid $subscriptionId | Select-AzSubscription
    
  4. Erstellen Sie eine Ressourcengruppe. Sie können diesen Schritt überspringen, wenn Sie eine vorhandene Ressourcengruppe verwenden.

    New-AzResourceGroup -Name $resGroupName -Location $location
    

Resource Manager erfordert, dass alle Ressourcengruppen einen Speicherort angeben. Dieser Speicherort wird als Standardspeicherort für die Ressourcen dieser Ressourcengruppe verwendet. Stellen Sie sicher, dass alle Befehle, mit denen ein Anwendungsgateway erstellt wird, die gleiche Ressourcengruppe verwenden.

Erstellen eines virtuelles Netzwerkes und eines Subnetzes für das Application Gateway.

Das folgende Beispiel zeigt, wie Sie mit dem Ressourcen-Manager ein virtuelles Netzwerk erstellen: Das virtuelle Netzwerk in diesem Beispiel besteht aus separaten Subnetzen für Application Gateway und API Management.

  1. Legen Sie die Application Gateway-IP-Adressen fest.

    Hinweis

    Da öffentliche und private Listener vorhanden sein werden, benötigen wir eine öffentliche und eine private IP-Adresse. Die statische, öffentliche IP-Adresse muss erstellt werden, während die private IP-Adresse aus dem Subnetz ausgewählt werden muss, das dem Anwendungsgateway zugeordnet ist. Die private IP-Adresse wurde willkürlich ausgewählt.

    $appGatewayExternalIP = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-ag" -location $location -AllocationMethod Static -Sku Standard -Force
    $appGatewayInternalIP = "10.0.0.100"
    
    [String[]]$appGwNsgDestIPs = $appGatewayInternalIP, $appGatewayExternalIP.IpAddress
    
  2. Erstellen Sie eine Netzwerksicherheitsgruppe (NSG) und NSG-Regeln für das Application Gateway Subnetz.

    $appGwRule1 = New-AzNetworkSecurityRuleConfig -Name appgw-in -Description "AppGw inbound" `
        -Access Allow -Protocol * -Direction Inbound -Priority 100 -SourceAddressPrefix `
        GatewayManager -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 65200-65535
    
    $appGwRule2 = New-AzNetworkSecurityRuleConfig -Name appgw-in-internet -Description "AppGw inbound Internet" `
        -Access Allow -Protocol "TCP" -Direction Inbound -Priority 110 -SourceAddressPrefix `
        Internet -SourcePortRange * -DestinationAddressPrefix $appGwNsgDestIPs -DestinationPortRange 443
    
    $appGwNsg = New-AzNetworkSecurityGroup -ResourceGroupName $resGroupName -Location $location -Name `
        "nsg-agw" -SecurityRules $appGwRule1, $appGwRule2
    
  3. Erstellen Sie eine Netzwerksicherheitsgruppe (NSG) und NSG-Regeln für das API Management Subnetz. API Management stv2 erfordert mehrere spezifische NSG-Regeln.

    $apimRule1 = New-AzNetworkSecurityRuleConfig -Name APIM-Management -Description "APIM inbound" `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix ApiManagement `
        -SourcePortRange * -DestinationAddressPrefix VirtualNetwork -DestinationPortRange 3443
    
    $apimRule2 = New-AzNetworkSecurityRuleConfig -Name AllowAppGatewayToAPIM -Description "Allows inbound App Gateway traffic to APIM" `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 110 -SourceAddressPrefix "10.0.0.0/24" `
        -SourcePortRange * -DestinationAddressPrefix "10.0.1.0/24" -DestinationPortRange 443
    
    $apimRule3 = New-AzNetworkSecurityRuleConfig -Name AllowAzureLoadBalancer -Description "Allows inbound Azure Infrastructure Load Balancer traffic to APIM" `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 120 -SourceAddressPrefix AzureLoadBalancer `
        -SourcePortRange * -DestinationAddressPrefix "10.0.1.0/24" -DestinationPortRange 6390
    
    $apimRule4 = New-AzNetworkSecurityRuleConfig -Name AllowKeyVault -Description "Allows outbound traffic to Azure Key Vault" `
        -Access Allow -Protocol Tcp -Direction Outbound -Priority 100 -SourceAddressPrefix "10.0.1.0/24" `
        -SourcePortRange * -DestinationAddressPrefix AzureKeyVault -DestinationPortRange 443
    
    $apimNsg = New-AzNetworkSecurityGroup -ResourceGroupName $resGroupName -Location $location -Name `
        "nsg-apim" -SecurityRules $apimRule1, $apimRule2, $apimRule3, $apimRule4
    
  4. Weisen Sie der für Application Gateway vorgesehenen Subnetzvariablen beim Erstellen eines virtuellen Netzwerks den Adressbereich 10.0.0.0/24 zu.

    $appGatewaySubnet = New-AzVirtualNetworkSubnetConfig -Name "appGatewaySubnet" -NetworkSecurityGroup $appGwNsg -AddressPrefix "10.0.0.0/24"
    
  5. Weisen Sie der für API Management vorgesehenen Subnetzvariablen beim Erstellen eines virtuellen Netzwerks den Adressbereich 10.0.1.0/24 zu.

    $apimSubnet = New-AzVirtualNetworkSubnetConfig -Name "apimSubnet" -NetworkSecurityGroup $apimNsg -AddressPrefix "10.0.1.0/24"
    
  6. Erstellen Sie ein virtuelles Netzwerk namens vnet-contoso. Verwenden Sie das Präfix „10.0.0.0/16“ mit den Subnetzen „10.0.0.0/24“ und „10.0.1.0/24“.

    $vnet = New-AzVirtualNetwork -Name "vnet-contoso" -ResourceGroupName $resGroupName `
      -Location $location -AddressPrefix "10.0.0.0/16" -Subnet $appGatewaySubnet,$apimSubnet
    
  7. Weisen Sie Subnetzvariablen für die nächsten Schritte zu.

    $appGatewaySubnetData = $vnet.Subnets[0]
    $apimSubnetData = $vnet.Subnets[1]
    

Erstellen einer API Management-Instanz in einem virtuellen Netzwerk

Im folgenden Beispiel wird veranschaulicht, wie Sie einen API Management-Instanz in einem virtuellen Netzwerk erstellen, das nur für internen Zugriff konfiguriert ist.

  1. API Management stv2 erfordert eine öffentliche IP-Adresse mit einem eindeutigen DomainNameLabel.

    $apimPublicIpAddressId = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-apim" -location $location `
        -AllocationMethod Static -Sku Standard -Force -DomainNameLabel $apimDomainNameLabel
    
  2. Erstellen Sie ein Objekt vom Typ „Virtuelles API Management-Netzwerk“ unter Verwendung des von Ihnen erstellten Subnetzes $apimSubnetData.

    $apimVirtualNetwork = New-AzApiManagementVirtualNetwork -SubnetResourceId $apimSubnetData.Id
    
  3. Erstellen Sie eine API Management-Instanz in einem virtuellen Netzwerk. In diesem Beispiel wird der Dienst auf der Dienstebene „Developer“ erstellt. Geben Sie einen eindeutigen Namen für Ihre API Management-Instanz an.

    $apimService = New-AzApiManagement -ResourceGroupName $resGroupName -Location $location -Name $apimServiceName -Organization $apimOrganization `
        -AdminEmail $apimAdminEmail -VirtualNetwork $apimVirtualNetwork -VpnType "Internal" -Sku "Developer" -PublicIpAddressId $apimPublicIpAddressId.Id
    

Es dauert in der Regel zwischen 30 und 40 Minuten, eine API Management-Instanz mit diesem Tarif zu erstellen und zu aktivieren. Nachdem der vorherige Befehl erfolgreich ausgeführt wurde, lesen Sie DNS-Konfiguration für den Zugriff auf den API Management-Dienst des internen virtuellen Netzwerks, um den Zugriff darauf zu bestätigen.

Einrichten benutzerdefinierter Domänennamen in API Management

So richten Sie benutzerdefinierte Domänennamen in API Management ein:

  1. Initialisieren Sie die folgenden Variablen mit den Details der Zertifikate mit privaten Schlüsseln für die Domänen und des vertrauenswürdigen Stammzertifikats. In diesem Beispiel werden api.contoso.net, portal.contoso.net und management.contoso.net verwendet.

    $certGatewayPwd = ConvertTo-SecureString -String $gatewayCertPfxPassword -AsPlainText -Force
    $certPortalPwd = ConvertTo-SecureString -String $portalCertPfxPassword -AsPlainText -Force
    $certManagementPwd = ConvertTo-SecureString -String $managementCertPfxPassword -AsPlainText -Force
    
  2. Erstellen Sie die Hostname-Konfigurationsobjekte für die API Management-Endpunkte, und legen Sie sie fest.

    $gatewayHostnameConfig = New-AzApiManagementCustomHostnameConfiguration -Hostname $gatewayHostname `
      -HostnameType Proxy -PfxPath $gatewayCertPfxPath -PfxPassword $certGatewayPwd
    
    $portalHostnameConfig = New-AzApiManagementCustomHostnameConfiguration -Hostname $portalHostname `
      -HostnameType DeveloperPortal -PfxPath $portalCertPfxPath -PfxPassword $certPortalPwd
    
    $managementHostnameConfig = New-AzApiManagementCustomHostnameConfiguration -Hostname $managementHostname `
      -HostnameType Management -PfxPath $managementCertPfxPath -PfxPassword $certManagementPwd
    
    $apimService.ProxyCustomHostnameConfiguration = $gatewayHostnameConfig
    $apimService.PortalCustomHostnameConfiguration = $portalHostnameConfig
    $apimService.ManagementCustomHostnameConfiguration = $managementHostnameConfig
    
    Set-AzApiManagement -InputObject $apimService
    

Konfigurieren einer privaten Zone für die DNS-Auflösung im virtuellen Netzwerk

So konfigurieren Sie eine private DNS-Zone für die DNS-Auflösung im virtuellen Netzwerk:

  1. Erstellen Sie eine private DNS-Zone, und verknüpfen Sie das virtuelle Netzwerk.

    $myZone = New-AzPrivateDnsZone -Name $domain -ResourceGroupName $resGroupName
    
    $link = New-AzPrivateDnsVirtualNetworkLink -ZoneName $domain `
      -ResourceGroupName $resGroupName -Name "mylink" `
      -VirtualNetworkId $vnet.id
    
  2. Erstellen Sie A-Einträge für die benutzerdefinierten Domänenhostnamen, die der privaten IP-Adresse von API Management zugeordnet werden.

    $apimIP = $apimService.PrivateIPAddresses[0]
    
    New-AzPrivateDnsRecordSet -Name api -RecordType A -ZoneName $domain `
      -ResourceGroupName $resGroupName -Ttl 3600 `
      -PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address $apimIP)
    
    New-AzPrivateDnsRecordSet -Name portal -RecordType A -ZoneName $domain `
      -ResourceGroupName $resGroupName -Ttl 3600 `
      -PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address $apimIP)
    
    New-AzPrivateDnsRecordSet -Name management -RecordType A -ZoneName $domain `
      -ResourceGroupName $resGroupName -Ttl 3600 `
      -PrivateDnsRecords (New-AzPrivateDnsRecordConfig -IPv4Address $apimIP)
    

Erstellen einer Application Gateway-Konfiguration

Sie müssen alle Konfigurationselemente einrichten, bevor Sie das Anwendungsgateway erstellen. Die folgenden Schritten erstellen die Konfigurationselemente, die für eine Application Gateway-Ressource benötigt werden.

  1. Erstellen Sie eine Application Gateway-IP-Konfiguration mit dem Namen gatewayIP01. Beim Starten des Anwendungsgateways wird eine IP-Adresse aus dem konfigurierten Subnetz ausgewählt, und der Netzwerkdatenverkehr wird an die IP-Adressen im Back-End-IP-Pool weitergeleitet. Beachten Sie, dass jede Instanz eine eigene IP-Adresse benötigt.

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appGatewaySubnetData
    
  2. Konfigurieren Sie den gleichen Front-End-Port für den öffentlichen und privaten IP-Endpunkt. Mit diesem Port stellen Benutzer eine Verbindung her. Durch die Verwendung desselben Ports für beide Endpunkte stellen wir sicher, dass interne und externe Anforderungen an denselben Port vorgenommen werden können.

    $fp01 = New-AzApplicationGatewayFrontendPort -Name "port01"  -Port 443
    
  3. Konfigurieren Sie zwei Front-End-IP-Adressen – eine öffentliche und eine private. Die private IP-Adresse stammt aus dem Anwendungsgateway-Subnetz, das als erstes bei Index 0 erstellt wurde.

    $fipconfig01 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-public-ip" -PublicIPAddress $appGatewayExternalIP
    
    $fipconfig02 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-private-ip" -PrivateIPAddress $appGatewayInternalIP `
      -Subnet $vnet.Subnets[0]
    
  4. Konfigurieren Sie die Zertifikate für das Anwendungsgateway. Sie werden verwendet, um den durchlaufenden Datenverkehr zu entschlüsseln und erneut zu verschlüsseln.

    Hinweis

    Application Gateway unterstützt das Definieren benutzerdefinierter TLS-Optionen, das Deaktivieren bestimmter TLS-Protokollversionen sowie das Angeben von Verschlüsselungssammlungen und der bevorzugten Reihenfolge. Weitere Informationen zu konfigurierbaren TLS-Optionen finden Sie in der Übersicht über TLS-Richtlinien.

    $certGateway = New-AzApplicationGatewaySslCertificate -Name "gatewaycert" `
      -CertificateFile $gatewayCertPfxPath -Password $certGatewayPwd
    
    $certPortal = New-AzApplicationGatewaySslCertificate -Name "portalcert" `
      -CertificateFile $portalCertPfxPath -Password $certPortalPwd
    
    $certManagement = New-AzApplicationGatewaySslCertificate -Name "managementcert" `
      -CertificateFile $managementCertPfxPath -Password $certManagementPwd
    
  5. Erstellen Sie die HTTP-Listener für das Anwendungsgateway. Weisen Sie ihnen die Front-End-IP-Konfiguration, den Port und die TLS/SSL-Zertifikate zu.

    # Public/external listeners
    $gatewayListener = New-AzApplicationGatewayHttpListener -Name "gatewaylistener" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01 `
      -SslCertificate $certGateway -HostName $gatewayHostname -RequireServerNameIndication true
    
    $portalListener = New-AzApplicationGatewayHttpListener -Name "portallistener" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01 `
      -SslCertificate $certPortal -HostName $portalHostname -RequireServerNameIndication true
    
    $managementListener = New-AzApplicationGatewayHttpListener -Name "managementlistener" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01 `
      -SslCertificate $certManagement -HostName $managementHostname -RequireServerNameIndication true
    
    # Private/internal listeners
    $gatewayListenerPrivate = New-AzApplicationGatewayHttpListener -Name "gatewaylistener-private" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig02 -FrontendPort $fp01 `
      -SslCertificate $certGateway -HostName $gatewayHostname -RequireServerNameIndication true
    
    $portalListenerPrivate = New-AzApplicationGatewayHttpListener -Name "portallistener-private" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig02 -FrontendPort $fp01 `
      -SslCertificate $certPortal -HostName $portalHostname -RequireServerNameIndication true
    
    $managementListenerPrivate = New-AzApplicationGatewayHttpListener -Name "managementlistener-private" `
      -Protocol "Https" -FrontendIPConfiguration $fipconfig02 -FrontendPort $fp01 `
      -SslCertificate $certManagement -HostName $managementHostname -RequireServerNameIndication true
    
  6. Erstellen Sie benutzerdefinierte Tests für den Gatewaydomänenendpunkt ContosoApi von API Management. Der Pfad /status-0123456789abcdef ist ein Standard-Integritätsendpunkt, der von allen API Management-Instanzen gehostet wird. Legen Sie api.contoso.net als benutzerdefinierten Testhostnamen fest, den Sie mit dem TLS/SSL-Zertifikat schützen möchten.

    Hinweis

    Der Hostname contosoapi.azure-api.net ist der Proxy-Standardhostname, der konfiguriert wird, wenn im öffentlichen Azure-Bereich der Dienst contosoapi erstellt wird.

    $apimGatewayProbe = New-AzApplicationGatewayProbeConfig -Name "apimgatewayprobe" `
      -Protocol "Https" -HostName $gatewayHostname -Path "/status-0123456789abcdef" `
      -Interval 30 -Timeout 120 -UnhealthyThreshold 8
    
    $apimPortalProbe = New-AzApplicationGatewayProbeConfig -Name "apimportalprobe" `
      -Protocol "Https" -HostName $portalHostname -Path "/signin" `
      -Interval 60 -Timeout 300 -UnhealthyThreshold 8
    
    $apimManagementProbe = New-AzApplicationGatewayProbeConfig -Name "apimmanagementprobe" `
      -Protocol "Https" -HostName $managementHostname -Path "/ServiceStatus" `
      -Interval 60 -Timeout 300 -UnhealthyThreshold 8
    
  7. Konfigurieren Sie das vertrauenswürdige Stammzertifikat der Back-End-Zertifikate. Dieses Zertifikat überprüft die Authentizität der Back-End-Zertifikate.

    $trustedRootCert = New-AzApplicationGatewayTrustedRootCertificate `
      -Name "allowlistcert1" -CertificateFile $trustedRootCertCerPath
    
  8. Konfigurieren Sie HTTP-Back-End-Einstellungen für das Anwendungsgateway, und schließen Sie ein Timeout für Back-End-Anforderungen ein, nach dem die Anforderungen abgebrochen werden. Dieser Wert unterscheidet sich vom Testtimeout.

    $apimPoolGatewaySetting = New-AzApplicationGatewayBackendHttpSettings -Name "apimPoolGatewaySetting" `
      -Port 443 -Protocol "Https" -CookieBasedAffinity "Disabled" -Probe $apimGatewayProbe `
      -TrustedRootCertificate $trustedRootCert -PickHostNameFromBackendAddress -RequestTimeout 180
    
    $apimPoolPortalSetting = New-AzApplicationGatewayBackendHttpSettings -Name "apimPoolPortalSetting" `
      -Port 443 -Protocol "Https" -CookieBasedAffinity "Disabled" -Probe $apimPortalProbe `
      -TrustedRootCertificate $trustedRootCert -PickHostNameFromBackendAddress -RequestTimeout 180
    
    $apimPoolManagementSetting = New-AzApplicationGatewayBackendHttpSettings -Name "apimPoolManagementSetting" `
      -Port 443 -Protocol "Https" -CookieBasedAffinity "Disabled" -Probe $apimManagementProbe `
      -TrustedRootCertificate $trustedRootCert -PickHostNameFromBackendAddress -RequestTimeout 180
    
  9. Konfigurieren Sie einen Back-End-IP-Adresspool für jeden API Management-Endpunkt unter Verwendung des jeweiligen Domänennamens.

    $apimGatewayBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "gatewaybackend" `
      -BackendFqdns $gatewayHostname
    
    $apimPortalBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "portalbackend" `
      -BackendFqdns $portalHostname
    
    $apimManagementBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "managementbackend" `
      -BackendFqdns $managementHostname
    
  10. Erstellen Sie Routingregeln für das Anwendungsgateway zur Verwendung von grundlegendem Routing.

    # Public/external gateway rules
    $gatewayRule = New-AzApplicationGatewayRequestRoutingRule -Name "gatewayrule" `
      -RuleType Basic -HttpListener $gatewayListener -BackendAddressPool $apimGatewayBackendPool `
      -BackendHttpSettings $apimPoolGatewaySetting -Priority 10
    
    $portalRule = New-AzApplicationGatewayRequestRoutingRule -Name "portalrule" `
      -RuleType Basic -HttpListener $portalListener -BackendAddressPool $apimPortalBackendPool `
      -BackendHttpSettings $apimPoolPortalSetting -Priority 20
    
    $managementRule = New-AzApplicationGatewayRequestRoutingRule -Name "managementrule" `
      -RuleType Basic -HttpListener $managementListener -BackendAddressPool $apimManagementBackendPool `
      -BackendHttpSettings $apimPoolManagementSetting -Priority 30
    
    # Private/internal gateway rules
    $gatewayRulePrivate = New-AzApplicationGatewayRequestRoutingRule -Name "gatewayrule-private" `
      -RuleType Basic -HttpListener $gatewayListenerPrivate -BackendAddressPool $apimGatewayBackendPool `
      -BackendHttpSettings $apimPoolGatewaySetting -Priority 11
    
    $portalRulePrivate = New-AzApplicationGatewayRequestRoutingRule -Name "portalrule-private" `
      -RuleType Basic -HttpListener $portalListenerPrivate -BackendAddressPool $apimPortalBackendPool `
      -BackendHttpSettings $apimPoolPortalSetting -Priority 21
    
    $managementRulePrivate = New-AzApplicationGatewayRequestRoutingRule -Name "managementrule-private" `
      -RuleType Basic -HttpListener $managementListenerPrivate -BackendAddressPool $apimManagementBackendPool `
      -BackendHttpSettings $apimPoolManagementSetting -Priority 31
    

    Tipp

    Ändern Sie -RuleType und das Routing, um den Zugriff auf bestimmte Seiten im Entwicklerportal zu beschränken.

  11. Konfigurieren Sie die Anzahl der Instanzen und die Größe für das Application Gateway. In diesem Beispiel wird die WAF_v2 SKU verwendet, um eine höhere Sicherheit für die API Management-Ressource zu erzielen.

    Verwenden Sie mindestens zwei Instanzen (Kapazität) für Produktionsworkloads. Für Nichtproduktionsszenarien oder allgemeine Experimente dürfte eine Instanz ausreichen. Weitere Informationen finden Sie unter Azure Application Gateway – Preise.

    $sku = New-AzApplicationGatewaySku -Name "WAF_v2" -Tier "WAF_v2" -Capacity 2
    
  12. Konfigurieren Sie den WAF-Modus.

    Tipp

    Für einen kurzen Zeitraum während des Setups sowie zum Testen Ihrer Firewallregeln können Sie den Modus „Erkennung“ konfigurieren, der Bedrohungswarnungen überwacht und protokolliert, aber keinen Datenverkehr blockiert. Sie können dann alle Updates an Firewallregeln vornehmen, bevor Sie zum Modus „Prävention“ wechseln, der Eindringversuche und Angriffe blockiert, die von den Regeln erkannt werden.

    $config = New-AzApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"
    
  13. Da TLS 1.0 derzeit die Standardeinstellung ist, legen Sie das Anwendungsgateway auf die Verwendung einer der neuesten TLS 1.2-Richtlinien fest.

    $policy = New-AzApplicationGatewaySslPolicy -PolicyType Predefined -PolicyName AppGwSslPolicy20220101
    

Erstellen eines Anwendungsgateways

  1. Erstellen Sie ein Anwendungsgateway mit allen Konfigurationsobjekten aus den vorherigen Schritten. Das Erstellen einer Instanz kann bis zu 15 Minuten dauern.

    $appgw = New-AzApplicationGateway `
      -Name $appgwName `
      -ResourceGroupName $resGroupName `
      -Location $location `
      -Sku $sku `
      -SslPolicy $policy `
      -SslCertificates $certGateway, $certPortal, $certManagement `
      -TrustedRootCertificate $trustedRootCert `
      -BackendAddressPools $apimGatewayBackendPool, $apimPortalBackendPool, $apimManagementBackendPool `
      -BackendHttpSettingsCollection $apimPoolGatewaySetting, $apimPoolPortalSetting, $apimPoolManagementSetting `
      -GatewayIpConfigurations $gipconfig `
      -FrontendIpConfigurations $fipconfig01, $fipconfig02 `
      -FrontendPorts $fp01 `
      -HttpListeners $gatewayListener, $portalListener, $managementListener, $gatewayListenerPrivate, $portalListenerPrivate, $managementListenerPrivate `
      -RequestRoutingRules $gatewayRule, $portalRule, $managementRule, $gatewayRulePrivate, $portalRulePrivate, $managementRulePrivate `
      -Probes $apimGatewayProbe, $apimPortalProbe, $apimManagementProbe `
      -WebApplicationFirewallConfig $config
    
  2. Bestätigen Sie den Integritätsstatus der API Management-Back-Ends.

    Get-AzApplicationGatewayBackendHealth -Name $appgwName -ResourceGroupName $resGroupName
    

Vergewissern Sie sich, dass die einzelnen Back-End-Pools jeweils fehlerfrei sind. Informationen zur Problembehandlung für fehlerhafte Back-Ends oder für Back-Ends mit unbekanntem Integritätsstatus finden Sie unter Behandeln von Problemen mit der Back-End-Integrität in Application Gateway.

Erstellen von DNS-Einträgen zum Zugriff auf API Management-Endpunkte aus dem Internet

Nachdem das Anwendungsgateway erstellt wurde, konfigurieren Sie die Kommunikation mit API Management aus dem Internet. Erstellen Sie DNS-A-Einträge, die jeden der API Management-Endpunkt-Hostnamen zuordnen, die Sie für die statische öffentliche IP-Adresse des Anwendungsgateways konfiguriert haben. In diesem Artikel sind die Beispielhostnamen api.contoso.net, portal.contoso.net und management.contoso.net.

Konnektivitätsüberprüfung

Für schnelle Tests sollten Sie die Hostdatei Ihres Computers vorübergehend mit Einträgen ändern, welche die öffentliche IP-Adresse des Anwendungsgateways den Hostnamen des API Management-Endpunkts zuordnen:

  1. Ändern Sie die Hostdateien. Wenn beispielsweise die öffentliche IP-Adresse des Anwendungsgateways 172.203.129.101 lautet, kann der Eintrag 172.203.129.101 api.contoso.net lauten.
  2. Führen Sie einen curl-Befehl für den Statusendpunkt von API Management aus (derselbe Pfad, der zuvor für den Integritätstest verwendet wurde): curl -v https://api.contoso.net/status-0123456789abcdef Dies sollte einen 200 Service Operational-Status zurückgeben, der die erfolgreiche Kommunikation mit API Management über Application Gateway angibt.

DNS Überlegungen

Der Application Gateway verfügt jetzt über private und öffentliche Pfade. Durch die Verwendung derselben Domänen und Ports wird eine Split-Brain-DNS-Situation erstellt, in der ein externer DNS-Auflöser so festgelegt werden sollte, dass er api.contoso.net auf die externe IP-Adresse des Anwendungsgateways auflöst, während ein interner DNS-Auflöser dieselbe Domäne in die interne IP-Adresse des Anwendungsgateways auflösen sollte. Dieses Setup bietet den Vorteil, dass Anwendungen die Domäne oder den Port für die interne oder externe Ausrichtung von Anwendungen und APIs nicht ändern müssen. Die Verantwortung für die Ausrichtung wird entsprechend an den DNS-Auflöser delegiert.

Zusammenfassung

Wenn  API Management in einem virtuellen Netzwerk konfiguriert wird, steht eine einzelne Gatewayschnittstelle für alle konfigurierten APIs zur Verfügung – ganz gleich, ob sie lokal oder in der Cloud gehostet werden. Die Integration von Application Gateway in API Management bietet Ihnen die Flexibilität, bestimmte APIs selektiv im Internet zugänglich zu machen. Die Integration bietet auch eine WAF als Front-End für Ihre API Management-Instanz.

Nächste Schritte