Integrare Gestione API in una rete virtuale interna con un gateway applicazione

SI APPLICA A: Sviluppatore | Premium

È possibile configurare il servizio Gestione API di Azure in una rete virtuale in modalità interna, per renderlo accessibile solo nella rete virtuale. Gateway applicazione di Azure è una piattaforma distribuita come servizio (PaaS) che funge da servizio di bilanciamento del carico di livello 7. Funge da servizio proxy inverso e fornisce tra le sue offerte Web application firewall di Azure (WAF).

La combinazione di Gestione API in una rete virtuale interna con il gateway applicazione come front-end consente:

  • Uso della stessa risorsa di Gestione API sia da parte degli utenti interni che di quelli esterni.
  • Uso di una singola risorsa di Gestione API e disponibilità di un sottoinsieme di API definite in Gestione API per gli utenti esterni.
  • Fornire un modo veloce per attivare e disattivare l'accesso a Gestione API dalla rete Internet pubblica.

Per le linee guida per l'architettura vedere:

Nota

Questo articolo è stato aggiornato per l'uso del gateway applicazione WAF_v2 SKU.

Prerequisiti

Nota

È consigliabile usare il modulo Azure Az PowerShell per interagire con Azure. Per iniziare, vedere Installare Azure PowerShell. Per informazioni su come eseguire la migrazione al modulo AZ PowerShell, vedere Eseguire la migrazione di Azure PowerShell da AzureRM ad Az.

Per eseguire i passaggi descritti in questo articolo, è necessario quanto segue:

Scenario

Questo articolo illustra come usare una singola istanza di Gestione API per i consumer sia interni che esterni e fare in modo che funga da singolo front-end per le API sia locali che su cloud. Verrà creata un'istanza di Gestione API del tipo più recente a tenant singolo versione 2 (stv2). Si apprenderà come usare listener pubblici e privati in gateway applicazione. Si è appreso come esporre solo un subset delle API per l'utilizzo esterno usando la funzionalità di routing disponibile in gateway applicazione. Nell'esempio le API sono evidenziate in verde.

Nel primo esempio di configurazione, tutte le API sono gestite solo dall'interno della rete virtuale. I consumer interni possono accedere a tutte le API interne ed esterne. Il traffico non esce mai da Internet. La connettività ad alte prestazioni può essere distribuita tramite circuiti Azure ExpressRoute. Nell'esempio, i consumer interni sono evidenziati in arancione.

Diagramma che mostra la route URL.

Cosa è necessario per integrare Gestione API e gateway applicazione?

  • Pool di server back-end: costituisce l'indirizzo IP virtuale interno di Gestione API.
  • Impostazioni del pool di server back-end: ogni pool ha impostazioni come porta, protocollo e affinità basata sui cookie. Queste impostazioni vengono applicate a tutti i server nel pool.
  • Porta front-end: la porta pubblica aperta sul gateway applicazione. Il traffico che raggiunge questa porta viene reindirizzato a uno dei server back-end.
  • Listener: il listener ha una porta front-end, un protocollo (Http o Https, questi valori fanno distinzione tra maiuscole e minuscole) e il nome del certificato Transport Layer Security (TLS) (se si configura l'offload TLS).
  • Regola: associa un listener a un pool di server back-end.
  • Probe di integrità personalizzato: il gateway applicazione, per impostazione predefinita, usa probe basati su indirizzi IP per individuare quali server di BackendAddressPool sono attivi. Poiché Gestione API risponde solo alle richieste dotate di intestazione host corretta, i probe predefiniti non riescono. È necessario definire un probe di integrità personalizzato per consentire al gateway applicazione di determinare che il servizio è attivo e deve inoltrare le richieste.
  • Certificati di dominio personalizzati: per accedere Gestione API da Internet, creare record DNS (Domain Name System) per eseguire il mapping dei nomi host all'indirizzo IP front-end gateway applicazione. Questo mapping garantisce che l'intestazione host e il certificato inviati a Gestione API siano validi. In questo esempio vengono usati tre certificati. Sono destinati al gateway di Gestione API (back-end), al portale per sviluppatori e all'endpoint di gestione.

Esporre esternamente il portale per sviluppatori e l'endpoint di gestione attraverso il gateway applicazione

In questo articolo vengono anche esposti il portale per sviluppatori e l'endpoint di gestione a gruppi di destinatari esterni tramite il gateway applicazione. Sono necessari passaggi aggiuntivi per creare un listener, un probe, impostazioni e regole per ogni endpoint. Tutti i dettagli vengono specificati nei rispettivi passaggi.

Se si usa Microsoft Entra ID o un'autenticazione di terze parti, attivare la funzionalità affinità di sessione basata su cookie nel gateway applicazione.

Avviso

Per impedire che WAF del gateway applicazione interrompa il download delle specifiche OpenAPI nel portale per sviluppatori, disabilitare la regola del firewall 942200 - "Detects MySQL comment-/space-obfuscated injections and backtick termination".

Le regole WAF del gateway applicazione che potrebbero interrompere le funzionalità del portale includono:

  • 920300, 920330, 931130, 942100, 942110, 942180, 942200, 942260, 942340, 942370 per la modalità amministrativa
  • 942200, 942260, 942370, 942430, 942440 per il portale pubblicato

Impostazione delle variabili

In questa guida è necessario definire diverse variabili. La denominazione si basa sulla guida alle abbreviazioni di Cloud Adoption Framework.

# 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

Creare un gruppo di risorse per Gestione risorse

Per creare un gruppo di risorse per Azure Resource Manager:

  1. Accedere ad Azure.

    Connect-AzAccount
    
  2. Eseguire l'autenticazione con le proprie credenziali.

  3. Selezionare la sottoscrizione desiderata.

    Get-AzSubscription -Subscriptionid $subscriptionId | Select-AzSubscription
    
  4. Crea un gruppo di risorse. Se si usa un gruppo di risorse esistente, è possibile ignorare questo passaggio.

    New-AzResourceGroup -Name $resGroupName -Location $location
    

Resource Manager richiede che tutti i gruppi di risorse specifichino un percorso. che viene usato come percorso predefinito per le risorse in questo gruppo di risorse. Assicurarsi che tutti i comandi per creare un gateway applicazione usino lo stesso gruppo di risorse.

Creare una rete virtuale e una subnet per il gateway applicazione

L'esempio seguente illustra come creare una rete virtuale usando Gestione risorse. La rete virtuale in questo esempio è costituita da subnet separate per il gateway applicazione e Gestione API.

  1. Impostare gli indirizzi IP gateway applicazione.

    Nota

    Poiché saranno presenti listener pubblici e privati, è necessario un indirizzo IP pubblico e privato. L'indirizzo IP pubblico statico deve essere creato, mentre l'indirizzo IP privato deve essere selezionato dalla subnet associata al gateway applicazione. L'indirizzo IP privato è stato selezionato arbitrariamente.

    $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. Creare un gruppo di sicurezza di rete (NSG) e regole NSG per la subnet del gateway applicazione.

    $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. Creare un gruppo di sicurezza di rete (NSG) e regole NSG per la subnet di Gestione API. Gestione API stv2 richiede diverse regole NSG specifiche.

    $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. Assegnare l'intervallo di indirizzi 10.0.0.0/24 alla variabile subnet da usare per il gateway applicazione durante la creazione di una rete virtuale.

    $appGatewaySubnet = New-AzVirtualNetworkSubnetConfig -Name "appGatewaySubnet" -NetworkSecurityGroup $appGwNsg -AddressPrefix "10.0.0.0/24"
    
  5. Assegnare l'intervallo di indirizzi 10.0.1.0/24 alla variabile subnet da usare per Gestione API durante la creazione di una rete virtuale.

    $apimSubnet = New-AzVirtualNetworkSubnetConfig -Name "apimSubnet" -NetworkSecurityGroup $apimNsg -AddressPrefix "10.0.1.0/24"
    
  6. Creare una rete virtuale denominata vnet-contoso. Usare il prefisso 10.0.0.0/16 con le subnet 10.0.0.0/24 e 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. Assegnare variabili subnet per i passaggi successivi.

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

Creare un'istanza di Gestione API all'interno di una rete virtuale

L'esempio seguente illustra come creare un'istanza di Gestione API in una rete virtuale configurata per il solo accesso interno.

  1. Gestione API stv2 richiede un indirizzo IP pubblico con un oggetto univocoDomainNameLabel.

    $apimPublicIpAddressId = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-apim" -location $location `
        -AllocationMethod Static -Sku Standard -Force -DomainNameLabel $apimDomainNameLabel
    
  2. Creare un oggetto rete virtuale di Gestione API usando la subnet $apimSubnetData creata in precedenza.

    $apimVirtualNetwork = New-AzApiManagementVirtualNetwork -SubnetResourceId $apimSubnetData.Id
    
  3. Creare un'istanza di Gestione API all'interno della rete virtuale. In questo esempio viene creato il servizio nel livello di servizio Developer. Sostituire un nome univoco per l'istanza di Gestione API.

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

Possono essere necessari da 30 a 40 minuti per creare e attivare un'istanza di Gestione API in questo livello. Dopo il completamento del comando precedente, per confermare l'accesso vedere Configurazione DNS necessaria per accedere al servizio Gestione API su una rete virtuale interna.

Configurare nomi dominio personalizzati in Gestione API

Per configurare nomi dominio personalizzati in Gestione API:

  1. Inizializzare le variabili seguenti con i dettagli dei certificati con chiavi private per i domini e il certificato radice trusted. In questo esempio vengono usate le variabili api.contoso.net, portal.contoso.net e management.contoso.net.

    $certGatewayPwd = ConvertTo-SecureString -String $gatewayCertPfxPassword -AsPlainText -Force
    $certPortalPwd = ConvertTo-SecureString -String $portalCertPfxPassword -AsPlainText -Force
    $certManagementPwd = ConvertTo-SecureString -String $managementCertPfxPassword -AsPlainText -Force
    
  2. Creare e impostare gli oggetti di configurazione Hostname per gli endpoint di Gestione API.

    $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
    

Configurare una zona privata per la risoluzione DNS nella rete virtuale

Per configurare una zona DNS privata per la risoluzione DNS nella rete virtuale:

  1. Creare una zona DNS privata e collegare la rete virtuale.

    $myZone = New-AzPrivateDnsZone -Name $domain -ResourceGroupName $resGroupName
    
    $link = New-AzPrivateDnsVirtualNetworkLink -ZoneName $domain `
      -ResourceGroupName $resGroupName -Name "mylink" `
      -VirtualNetworkId $vnet.id
    
  2. Creare record A per i nomi host di dominio personalizzati che eseguono il mapping all'indirizzo IP privato di Gestione API.

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

Creare la configurazione del gateway applicazione

Prima di creare il gateway applicazione, è necessario impostare tutti gli elementi di configurazione. La procedura seguente consente di creare gli elementi di configurazione necessari per una risorsa gateway applicazione.

  1. Creare una configurazione IP del gateway applicazione denominata gatewayIP01. All'avvio, il gateway applicazione seleziona un indirizzo IP dalla subnet configurata e instrada il traffico di rete agli indirizzi IP nel pool di indirizzi IP back-end. Tenere presente che ogni istanza ha un indirizzo IP.

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appGatewaySubnetData
    
  2. Configurare la stessa porta front-end per l'endpoint IP pubblico e privato. Si tratta della porta a cui si connettono gli utenti. Usando la stessa porta per entrambi si garantisce che le richieste interne ed esterne possano essere effettuate alla stessa porta.

    $fp01 = New-AzApplicationGatewayFrontendPort -Name "port01"  -Port 443
    
  3. Configurare due indirizzi IP front-end: uno pubblico e uno privato. L'indirizzo IP privato viene ricavato dalla subnet del gateway applicazione, che è stato il primo a essere creato in corrispondenza dell'indice 0.

    $fipconfig01 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-public-ip" -PublicIPAddress $appGatewayExternalIP
    
    $fipconfig02 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-private-ip" -PrivateIPAddress $appGatewayInternalIP `
      -Subnet $vnet.Subnets[0]
    
  4. Configurare i certificati per il gateway applicazione. Vengono usati per decrittografare e ricrittografare il traffico che vi passa attraverso.

    Nota

    Il gateway applicazione supporta la definizione di opzioni TLS personalizzate, la disabilitazione di determinate versioni del protocollo TLS e la specifica di pacchetti di crittografia e l'ordine delle preferenze. Per altre informazioni sulle opzioni TLS configurabili, vedere Panoramica dei criteri TLS.

    $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. Creare i listener HTTP per il gateway applicazione. Assegnare ai listener HTTP la configurazione IP, la porta e i certificati TLS/SSL del front-end.

    # 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. Creare probe personalizzati per l'endpoint del dominio gateway ContosoApi del servizio Gestione API. Il percorso /status-0123456789abcdef è un endpoint di integrità predefinito ospitato in tutte le istanze di Gestione API. Impostare api.contoso.net come nome host probe personalizzato per assicurare la protezione con il certificato TLS/SSL.

    Nota

    Il nome host contosoapi.azure-api.net è il nome host proxy predefinito configurato quando un servizio denominato contosoapi viene creato nell'ambiente Azure pubblico.

    $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. Configurare il certificato radice attendibile dei certificati back-end. Questo certificato verifica l'autenticità dei certificati back-end.

    $trustedRootCert = New-AzApplicationGatewayTrustedRootCertificate `
      -Name "allowlistcert1" -CertificateFile $trustedRootCertCerPath
    
  8. Configurare le impostazioni back-end HTTP per il gateway applicazione, incluso un limite di timeout per le richieste back-end, dopo il quale vengono annullate. Questo valore è diverso dal timeout del probe.

    $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. Configurare un pool di indirizzi IP back-end per ogni endpoint Gestione API usando il rispettivo nome di dominio.

    $apimGatewayBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "gatewaybackend" `
      -BackendFqdns $gatewayHostname
    
    $apimPortalBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "portalbackend" `
      -BackendFqdns $portalHostname
    
    $apimManagementBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "managementbackend" `
      -BackendFqdns $managementHostname
    
  10. Creare regole di routing per il gateway applicazione per usare il routing di base.

    # 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
    

    Suggerimento

    Modificare -RuleType e il routing per limitare l'accesso a determinate pagine del portale per sviluppatori.

  11. Configurare il numero di istanze e le dimensioni per il gateway applicazione. In questo esempio si usa WAF_v2 SKU per aumentare la sicurezza della risorsa Gestione API.

    Usare almeno due istanze (Capacity) per i carichi di lavoro di produzione. È possibile usare una sola istanza per scenari di non produzione o per la sperimentazione generale. Per altre informazioni, vedere Prezzi del gateway applicazione.

    $sku = New-AzApplicationGatewaySku -Name "WAF_v2" -Tier "WAF_v2" -Capacity 2
    
  12. Configurare la modalità WAF.

    Suggerimento

    Per un breve periodo durante l'installazione e per testare le regole del firewall, è possibile configurare la modalità "Rilevamento", che monitora e registra gli avvisi delle minacce, ma non blocca il traffico. È possibile quindi apportare eventuali aggiornamenti alle regole del firewall prima di passare alla modalità "Prevenzione", che blocca intrusioni e attacchi rilevati dalle regole.

    $config = New-AzApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"
    
  13. Poiché TLS 1.0 è attualmente l'impostazione predefinita, impostare il gateway applicazione per usare uno dei criteri TLS 1.2 recenti.

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

Creare un gateway applicazione

  1. Creare un gateway applicazione con tutti gli oggetti di configurazione illustrati nei passaggi precedenti. La creazione di un'istanza può richiedere 15 minuti.

    $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. Confermare lo stato di integrità del back-end Gestione API.

    Get-AzApplicationGatewayBackendHealth -Name $appgwName -ResourceGroupName $resGroupName
    

Verificare che lo stato di integrità di ogni pool di back-end sia Integro. Se è necessario risolvere il problema di un back-end non integro o di un back-end con stato di integrità sconosciuto, vedere Risolvere i problemi di integrità di back-end nel gateway applicazione.

Creare record DNS per accedere agli endpoint di Gestione API da Internet

Dopo aver creato il gateway applicazione, configurare la comunicazione con Gestione API da Internet. Creare record DNS A che eseguono il mapping di ognuno dei nomi host dell'endpoint di Gestione API configurati per l'indirizzo IP pubblico statico del gateway applicazione. In questo articolo, i nomi host di esempio sono api.contoso.net, portal.contoso.net e management.contoso.net.

verifica Connessione ivity

Per scopi di test rapidi, prendere in considerazione la possibilità di modificare temporaneamente il file host del computer con voci che eseguono il mapping dell'indirizzo IP pubblico del gateway applicazione ai nomi host dell'endpoint Gestione API:

  1. Modificare i file hosts. Ad esempio, se l'indirizzo IP pubblico del gateway applicazione è 172.203.129.101, la voce potrebbe essere 172.203.129.101 api.contoso.net.
  2. Eseguire un comando curl sull'endpoint di stato di Gestione API (lo stesso percorso usato per il probe di integrità in precedenza): curl -v https://api.contoso.net/status-0123456789abcdef deve restituire uno stato, che indica la 200 Service Operational corretta comunicazione con Gestione API tramite gateway applicazione.

Considerazioni sul DNS

Il gateway applicazione ha ora percorsi privati e pubblici. L'uso degli stessi domini e porte crea una situazione DNS split-brain in cui un resolver DNS esterno deve essere impostato per risolvere api.contoso.net l'indirizzo IP esterno del gateway applicazione, mentre un resolver DNS interno deve risolvere lo stesso dominio nell'indirizzo IP interno del gateway applicazione. Questa configurazione offre un vantaggio in quanto le applicazioni non devono modificare il dominio o la porta per la destinazione interna o esterna di applicazioni e API. La responsabilità della destinazione è posticipata in modo appropriato ai resolver DNS.

Riepilogo

Il servizio Gestione API configurato in una rete virtuale offre un'interfaccia a gateway singolo per tutte le API configurate, che siano ospitate in locale o nel cloud. L'integrazione del gateway applicazione con Gestione API offre la flessibilità di abilitare selettivamente l'accesso a determinate API su Internet. L'integrazione fornisce anche un WAF come front-end all'istanza di Gestione API.

Passaggi successivi