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

Panoramica

Il servizio Gestione API può essere configurato in una rete virtuale in modalità interna, rendendolo così accessibile solo dall'interno della rete virtuale. Il gateway applicazione di Azure è un servizio PAAS con bilanciamento del carico di livello 7. Funge da servizio proxy inverso e offre anche un Web application firewall (WAF).

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

  • 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.
  • Predisposizione di un modo veloce per attivare e disattivare l'accesso a Gestione API dalla rete Internet pubblica.

Scenario

Questo articolo illustra come usare un singolo servizio Gestione API per gli utenti sia interni che esterni e fare in modo che funga da singolo front-end per le API sia locali che cloud. Verrà anche descritto come esporre solo un sottoinsieme delle API (evidenziato in verde nell'esempio) per l'utilizzo esterno con la funzionalità PathBasedRouting disponibile nel gateway applicazione.

Nel primo esempio di configurazione, tutte le API sono gestite solo dall'interno della rete virtuale. Gli utenti interni (evidenziati in arancione) possono accedere a tutte le API interne ed esterne. Il traffico non esce mai in Internet e circuiti ExpressRoute garantiscono prestazioni elevate.

route dell'URL

Prima di iniziare

  1. Installare la versione più recente dei cmdlet di Azure PowerShell usando l'Installazione guidata piattaforma Web. È possibile scaricare e installare la versione più recente dalla sezione Windows PowerShell della Pagina di download.
  2. Creare una rete virtuale e subnet separate per Gestione API e il gateway applicazione.
  3. Se si intende creare un server DNS personalizzato per la rete virtuale, eseguire tale operazione prima di iniziare la distribuzione. Controllarne il funzionamento verificando che una macchina virtuale creata in una nuova subnet della rete virtuale possa risolvere tutti gli endpoint di servizio di Azure e accedervi.

Elementi necessari per creare un'integrazione tra Gestione API e il gateway applicazione

  • Pool di server back-end: costituisce l'indirizzo IP virtuale interno del servizio Gestione API.
  • Impostazioni del pool di server back-end: ogni pool ha impostazioni quali porta, protocollo e affinità basata sui cookie. Queste impostazioni vengono applicate a tutti i server nel pool.
  • Porta front-end: porta pubblica aperta sul gateway applicazione. Il traffico che raggiunge questa porta viene reindirizzato a uno dei server back-end.
  • Listener : ha una porta front-end, un protocollo (Http o Https, con distinzione tra maiuscole e minuscole) e il nome del certificato SSL (se si configura l'offload SSL).
  • Regola: associa un listener a un pool di server back-end.
  • Probe di integrità personalizzato: per impostazione predefinita, il gateway applicazione usa probe basati su indirizzi IP per individuare i server attivi in BackendAddressPool. Il servizio Gestione API risponde solo alle richieste con l'intestazione host corretta, quindi i probe predefiniti hanno esito negativo. È necessario definire un probe di integrità personalizzato per consentire al gateway applicazione di determinare che il servizio è attivo e deve inoltrare le richieste.
  • Certificato di dominio personalizzato: per accedere a Gestione API da Internet è necessario creare un mapping CNAME del nome host al nome DNS del front-end del gateway applicazione. Ciò garantisce che l'intestazione del nome host e il certificato inviati al gateway applicazione e inoltrati a Gestione API siano riconoscibili come validi da Gestione API.

Passaggi necessari per l'integrazione di Gestione API e il gateway applicazione

  1. Creare un gruppo di risorse per Gestione risorse.
  2. Creare una rete virtuale, una subnet e un indirizzo IP pubblico per il gateway applicazione. Creare un'altra subnet per Gestione API.
  3. Creare un servizio Gestione API nella subnet della rete virtuale creata in precedenza e assicurarsi di usare la modalità interna.
  4. Configurare il nome di dominio personalizzato nel servizio Gestione API.
  5. Creare un oggetto di configurazione del gateway applicazione.
  6. Creare una risorsa gateway applicazione.
  7. Creare un mapping CNAME dal nome DNS pubblico del gateway applicazione al nome host proxy di Gestione API.

Creare un gruppo di risorse per Gestione risorse

Assicurarsi di usare la versione più recente di Azure PowerShell. Altre informazioni sono disponibili in Uso di Azure PowerShell con Azure Resource Manager.

Passaggio 1

Accedere ad Azure

Login-AzureRmAccount

Eseguire l'autenticazione con le proprie credenziali.

Passaggio 2

Controllare le sottoscrizioni per l'account e selezionarlo.

Get-AzureRmSubscription -Subscriptionid "GUID of subscription" | Select-AzureRmSubscription

Passaggio 3

Creare un gruppo di risorse. Ignorare questo passaggio se si usa un gruppo di risorse esistente.

New-AzureRmResourceGroup -Name "apim-appGw-RG" -Location "West US"

Gestione risorse di Azure richiede che tutti i gruppi di risorse specifichino un percorso che viene usato come percorso predefinito per le risorse presenti in tale 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 Resource Manager.

Passaggio 1

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-AzureRmVirtualNetworkSubnetConfig -Name "apim01" -AddressPrefix "10.0.0.0/24"

Passaggio 2

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-AzureRmVirtualNetworkSubnetConfig -Name "apim02" -AddressPrefix "10.0.1.0/24"

Passaggio 3

Creare una rete virtuale denominata appgwvnet nel gruppo di risorse apim-appGw-RG per l'area Stati Uniti occidentali usando il prefisso 10.0.0.0/16 con le subnet 10.0.0.0/24 e 10.0.1.0/24.

$vnet = New-AzureRmVirtualNetwork -Name "appgwvnet" -ResourceGroupName "apim-appGw-RG" -Location "West US" -AddressPrefix "10.0.0.0/16" -Subnet $appgatewaysubnet,$apimsubnet

Passaggio 4

Assegnare una variabile subnet per i passaggi successivi

$appgatewaysubnetdata=$vnet.Subnets[0]
$apimsubnetdata=$vnet.Subnets[1]

Creare un servizio Gestione API in una rete virtuale configurata in modalità interna

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

Passaggio 1

Creare un oggetto rete virtuale di Gestione API usando la subnet $apimsubnetdata creata in precedenza.

$apimVirtualNetwork = New-AzureRmApiManagementVirtualNetwork -Location "West US" -SubnetResourceId $apimsubnetdata.Id

Passaggio 2

Creare un servizio Gestione API all'interno della rete virtuale.

$apimService = New-AzureRmApiManagement -ResourceGroupName "apim-appGw-RG" -Location "West US" -Name "ContosoApi" -Organization "Contoso" -AdminEmail "admin@contoso.com" -VirtualNetwork $apimVirtualNetwork -VpnType "Internal" -Sku "Premium"

Dopo il completamento del comando precedente, per l'accesso vedere la configurazione DNS necessaria per accedere al servizio Gestione API su una rete virtuale interna.

Configurare un nome di dominio personalizzato in Gestione API

Passaggio 1

Caricare il certificato con chiave privata per il dominio. Per questo esempio sarà *.contoso.net.

$certUploadResult = Import-AzureRmApiManagementHostnameCertificate -ResourceGroupName "apim-appGw-RG" -Name "ContosoApi" -HostnameType "Proxy" -PfxPath <full path to .pfx file> -PfxPassword <password for certificate file> -PassThru

Passaggio 2

Dopo aver caricato il certificato, creare un oggetto di configurazione del nome host per il proxy con il nome host api.contoso.net, perché il certificato di esempio fornisce l'autorità per il dominio *.contoso.net.

$proxyHostnameConfig = New-AzureRmApiManagementHostnameConfiguration -CertificateThumbprint $certUploadResult.Thumbprint -Hostname "api.contoso.net"
$result = Set-AzureRmApiManagementHostnames -Name "ContosoApi" -ResourceGroupName "apim-appGw-RG" -ProxyHostnameConfiguration $proxyHostnameConfig

Creare un indirizzo IP pubblico per la configurazione front-end

Creare una risorsa IP pubblica denominata publicIP01 nel gruppo di risorse apim-appGw-RG per l'area Stati Uniti occidentali.

$publicip = New-AzureRmPublicIpAddress -ResourceGroupName "apim-appGw-RG" -name "publicIP01" -location "West US" -AllocationMethod Dynamic

All'avvio del servizio viene assegnato un indirizzo IP al gateway applicazione.

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 del gateway applicazione.

Passaggio 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-AzureRmApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appgatewaysubnetdata

Passaggio 2

Configurare la porta d indirizzo IP front-end con l'endpoint di indirizzo IP pubblico. Si tratta della porta a cui si connettono gli utenti finali.

$fp01 = New-AzureRmApplicationGatewayFrontendPort -Name "port01"  -Port 443

Passaggio 3

Configurare l'indirizzo IP front-end con l'endpoint di indirizzo IP pubblico.

$fipconfig01 = New-AzureRmApplicationGatewayFrontendIPConfig -Name "frontend1" -PublicIPAddress $publicip

Passaggio 4

Configurare il certificato per il gateway applicazione, che viene usato per decrittografare e ricrittografare il traffico gestito.

$cert = New-AzureRmApplicationGatewaySslCertificate -Name "cert01" -CertificateFile <full path to .pfx file> -Password <password for certificate file>

Passaggio 5

Creare il listener HTTP per il gateway applicazione. Assegnare la configurazione IP, la porta e il certificato SSL front-end da usare.

$listener = New-AzureRmApplicationGatewayHttpListener -Name "listener01" -Protocol "Https" -FrontendIPConfiguration $fipconfig01 -FrontendPort $fp01 -SslCertificate $cert

Passaggio 6

Creare un probe personalizzato per l'endpoint del dominio proxy ContosoApi del servizio Gestione API. Il percorso /status-0123456789abcdef è un endpoint di integrità predefinito ospitato in tutti i servizi Gestione API. Impostare api.contoso.net come nome host probe personalizzato per assicurare la protezione con il certificato SSL.

Nota

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

$apimprobe = New-AzureRmApplicationGatewayProbeConfig -Name "apimproxyprobe" -Protocol "Https" -HostName "api.contoso.net" -Path "/status-0123456789abcdef" -Interval 30 -Timeout 120 -UnhealthyThreshold 8

Passaggio 7

Caricare il certificato da usare per le risorse del pool back-end abilitate per SSL. È lo stesso certificato configurato nel passaggio 4.

$authcert = New-AzureRmApplicationGatewayAuthenticationCertificate -Name "whitelistcert1" -CertificateFile <full path to .cer file>

Passaggio 8

Configurare le impostazioni di back-end HTTP per il gateway applicazione. Questo passaggio include l'impostazione di un limite di timeout per la richiesta del back-end, raggiunto il quale verrà annullata. Questo valore è diverso dal timeout del probe.

$apimPoolSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name "apimPoolSetting" -Port 443 -Protocol "Https" -CookieBasedAffinity "Disabled" -Probe $apimprobe -AuthenticationCertificates $authcert -RequestTimeout 180

Passaggio 9:

Configurare il pool di indirizzi IP back-end denominato apimbackend con l'indirizzo IP virtuale interno del servizio Gestione API creato in precedenza.

$apimProxyBackendPool = New-AzureRmApplicationGatewayBackendAddressPool -Name "apimbackend" -BackendIPAddresses $apimService.StaticIPs[0]

Passaggio 10

Creare le impostazioni per un back-end fittizio (inesistente). Le richieste ai percorsi dell'API che non si vogliono esporre da Gestione API tramite il gateway applicazione raggiungeranno questo back-end e restituiranno l'errore 404.

Configurare le impostazioni HTTP per il back-end fittizio.

$dummyBackendSetting = New-AzureRmApplicationGatewayBackendHttpSettings -Name "dummySetting01" -Port 80 -Protocol Http -CookieBasedAffinity Disabled

Configurare un back-end fittizio dummyBackendPool, con rifermento a un indirizzo FQDN dummybackend.com. Questo indirizzo FQDN non esiste nella rete virtuale.

$dummyBackendPool = New-AzureRmApplicationGatewayBackendAddressPool -Name "dummyBackendPool" -BackendFqdns "dummybackend.com"

Creare un'impostazione della regola che il gateway applicazione userà per impostazione predefinita e che fa riferimento al back-end inesistente dummybackend.com nella rete virtuale.

$dummyPathRule = New-AzureRmApplicationGatewayPathRuleConfig -Name "nonexistentapis" -Paths "/*" -BackendAddressPool $dummyBackendPool -BackendHttpSettings $dummyBackendSetting

Passaggio 11

Configurare i percorsi della regola per gli URL per i pool back-end. È così possibile selezionare solo alcune API di Gestione API da esporre al pubblico. Ad esempio, se esistono Echo API (/echo/), Calculator API (/calc/) e così via, è possibile rendere accessibile da Internet solo Echo API.

L'esempio seguente crea una semplice regola per il percorso "/echo/" che instrada il traffico al back-end "apimProxyBackendPool".

$echoapiRule = New-AzureRmApplicationGatewayPathRuleConfig -Name "externalapis" -Paths "/echo/*" -BackendAddressPool $apimProxyBackendPool -BackendHttpSettings $apimPoolSetting

In caso di mancata corrispondenza con le regole di percorso che devono essere abilitate da Gestione API, la configurazione del mapping dei percorsi della regola definisce anche un pool di indirizzi del back-end predefinito denominato dummyBackendPool. Ad esempio, http://api.contoso.net/calc/* accede a dummyBackendPool in quanto è definito come il pool predefinito per traffico senza corrispondenza.

$urlPathMap = New-AzureRmApplicationGatewayUrlPathMapConfig -Name "urlpathmap" -PathRules $echoapiRule, $dummyPathRule -DefaultBackendAddressPool $dummyBackendPool -DefaultBackendHttpSettings $dummyBackendSetting

Il passaggio precedente assicura che solo le richieste per il percorso "/echo" siano consentite attraverso il gateway applicazione. Le richieste ad altre API configurate in Gestione API genereranno errori 404 del gateway applicazione in caso di accesso da Internet.

Passaggio 12

Creare un'impostazione della regola per il gateway applicazione per usare il routing basato su percorso URL.

$rule01 = New-AzureRmApplicationGatewayRequestRoutingRule -Name "rule1" -RuleType PathBasedRouting -HttpListener $listener -UrlPathMap $urlPathMap

Passaggio 13

Configurare il numero di istanze e le dimensioni per il gateway applicazione. In questo caso si usa lo SKU del WAF per aumentare la sicurezza della risorsa di Gestione API.

$sku = New-AzureRmApplicationGatewaySku -Name "WAF_Medium" -Tier "WAF" -Capacity 2

Passaggio 14

Configurare il Web application firewall in modalità "prevenzione".

$config = New-AzureRmApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"

Creare il gateway applicazione

Creare un gateway applicazione con tutti gli oggetti di configurazione illustrati nei passaggi precedenti.

$appgw = New-AzureRmApplicationGateway -Name $applicationGatewayName -ResourceGroupName $resourceGroupName  -Location $location -BackendAddressPools $apimProxyBackendPool, $dummyBackendPool -BackendHttpSettingsCollection $apimPoolSetting, $dummyBackendSetting  -FrontendIpConfigurations $fipconfig01 -GatewayIpConfigurations $gipconfig -FrontendPorts $fp01 -HttpListeners $listener -UrlPathMaps $urlPathMap -RequestRoutingRules $rule01 -Sku $sku -WebApplicationFirewallConfig $config -SslCertificates $cert -AuthenticationCertificates $authcert -Probes $apimprobe

Creare un mapping CNAME del nome host proxy di Gestione API al nome DNS pubblico della risorsa gateway applicazione

Dopo avere creato il gateway, il passaggio successivo prevede la configurazione del front-end per la comunicazione. Quando si usa un IP pubblico, il gateway applicazione richiede un nome DNS assegnato in modo dinamico, che potrebbe non essere facile da usare.

Il nome DNS del gateway applicazione dovrà essere usato per creare un record CNAME che associa il nome host proxy di Gestione API (negli esempi precedenti, api.contoso.net) a questo nome DNS. Per configurare il record CNAME per l'IP front-end, recuperare i dettagli del gateway applicazione e il nome DNS e l'IP associati usando l'elemento PublicIPAddress. Non è consigliabile usare record A perché l'indirizzo VIP può cambiare al riavvio del gateway.

Get-AzureRmPublicIpAddress -ResourceGroupName "apim-appGw-RG" -Name "publicIP01"

Il servizio Gestione API di Azure configurato in una rete virtuale offre un'interfaccia a gateway singolo per tutte le API, che siano ospitate in locale o nel cloud. L'integrazione del gateway applicazione con Gestione API offre la possibilità di rendere accessibili su Internet determinate API in modo selettivo, nonché di fornire un Web application firewall come front-end all'istanza di Gestione API.

Passaggi successivi