Integre o gerenciamento de API em uma rede virtual interna com o Application Gateway

APLICA-SE A: Developer | Prémio

Você pode configurar o Gerenciamento de API do Azure em uma rede virtual no modo interno, o que o torna acessível somente dentro da rede virtual. O Azure Application Gateway é uma plataforma como serviço (PaaS) que atua como um balanceador de carga de Camada 7. Atua como um serviço de proxy inverso e fornece entre as suas ofertas o Azure Firewall de Aplicações Web (WAF).

Ao combinar Gestão de API aprovisionadas numa rede virtual interna com o front-end Gateway de Aplicação, pode:

  • Utilize o mesmo recurso Gestão de API para consumo pelos consumidores internos e pelos consumidores externos.
  • Utilize um único recurso Gestão de API e tenha um subconjunto de APIs definido no Gestão de API disponível para consumidores externos.
  • Forneça uma forma chave na mão de mudar o acesso para Gestão de API a partir da Internet pública ativada e desativada.

Para orientação arquitetônica, consulte:

Nota

Este artigo foi atualizado para usar o Application Gateway WAF_v2 SKU.

Pré-requisitos

Nota

Recomendamos que utilize o módulo do Azure Az PowerShell para interagir com o Azure. Veja Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

Para seguir as etapas descritas neste artigo, você deve ter:

  • Uma subscrição ativa do Azure

    Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.

  • Certificados

    • Arquivos PFX (Personal Information Exchange) para nomes de host personalizados do Gerenciamento de API: gateway, portal do desenvolvedor e ponto de extremidade de gerenciamento.
    • Um arquivo de certificado (CER) para o certificado raiz dos certificados PFX.

    Para obter mais informações, consulte Certificados para o back-end. Para fins de teste, opcionalmente, gere certificados autoassinados.

  • A versão mais recente do Azure PowerShell

Cenário

Neste artigo, você aprenderá a usar uma única instância de Gerenciamento de API para consumidores internos e externos e fazê-la agir como um único front-end para APIs locais e na nuvem. Você cria uma instância de gerenciamento de API do tipo mais recente de locatário único versão 2 (stv2). Você aprende a usar ouvintes públicos e privados no Application Gateway. Você entende como expor apenas um subconjunto de suas APIs para consumo externo usando a funcionalidade de roteamento disponível no Application Gateway. No exemplo, as APIs são destacadas em verde.

No primeiro exemplo de configuração, todas as suas APIs são gerenciadas somente de dentro da sua rede virtual. Os consumidores internos podem acessar todas as suas APIs internas e externas. O tráfego nunca sai para a internet. A conectividade de alto desempenho pode ser fornecida através dos circuitos do Azure ExpressRoute. No exemplo, os consumidores internos são destacados em laranja.

Diagrama que mostra a rota da URL.

O que é necessário para integrar o Gerenciamento de API e o Application Gateway?

  • Conjunto de servidores de back-end: este conjunto de servidores é o endereço IP virtual interno do Gestão de API.
  • Definições do conjunto de servidores de back-end: Cada conjunto tem definições como a porta, o protocolo e a afinidade com base em cookies. Estas definições são aplicadas a todos os servidores do agrupamento.
  • Porta front-end: esta porta pública é aberta no gateway de aplicativo. O tráfego que o atinge é redireccionado para um dos servidores back-end.
  • Ouvinte: O ouvinte tem uma porta front-end, um protocolo (Http ou Https, esses valores diferenciam maiúsculas de minúsculas) e o nome do certificado TLS (Transport Layer Security) (se configurar o descarregamento de TLS).
  • Regra: a regra vincula um serviço de escuta a um conjunto de servidores de back-end.
  • Sonda de integridade personalizada: o Application Gateway, por padrão, usa testes baseados em endereço IP para descobrir quais servidores estão BackendAddressPool ativos. Gestão de API só responde a pedidos com o cabeçalho do anfitrião correto, pelo que as sondas predefinidas falham. Define uma pesquisa de estado de funcionamento personalizada para ajudar o gateway de aplicação a determinar que o serviço está ativo e deve reencaminhar pedidos.
  • Certificados de domínio personalizados: para acessar o Gerenciamento de API pela Internet, crie registros DNS (Sistema de Nomes de Domínio) para mapear seus nomes de host para o endereço IP front-end do Application Gateway. Este mapeamento garante que o cabeçalho do anfitrião e o certificado enviados para Gestão de API são válidos. Neste exemplo, utilizamos três certificados. São para o gateway de Gestão de API (o back-end), o portal do programador e o ponto final de gestão.

Expor o portal do desenvolvedor e o ponto de extremidade de gerenciamento externamente por meio do Application Gateway

Neste artigo, também expomos o portal do desenvolvedor e o ponto de extremidade de gerenciamento para públicos externos por meio do gateway de aplicativo. São necessárias etapas adicionais para criar um ouvinte, uma sonda, configurações e regras para cada ponto de extremidade. Todos os detalhes são fornecidos em suas respetivas etapas.

Se você usar o Microsoft Entra ID ou autenticação de terceiros, habilite o recurso de afinidade de sessão baseado em cookie no Application Gateway.

Aviso

Para impedir que o WAF do Application Gateway interrompa o download das especificações OpenAPI no portal do desenvolvedor, desative a regra 942200 - "Detects MySQL comment-/space-obfuscated injections and backtick termination"de firewall .

As regras WAF do Application Gateway que podem interromper a funcionalidade do portal incluem:

  • 920300, 920330, 931130, 942100, 942110, 942180, 942200, 942260, para 942370942340o modo administrativo
  • 942200, 942260, 942370, 942430, para 942440 o portal publicado

Definindo variáveis

Ao longo deste guia, você precisa definir várias variáveis. A nomenclatura é baseada na orientação de abreviatura do 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

Criar um grupo de recursos para o Resource Manager

Para criar um grupo de recursos para o Azure Resource Manager:

  1. Inicie sessão no Azure.

    Connect-AzAccount
    
  2. Autentique-se com suas credenciais.

  3. Selecione a assinatura desejada.

    Get-AzSubscription -Subscriptionid $subscriptionId | Select-AzSubscription
    
  4. Crie um grupo de recursos. Pode ignorar este passo se estiver a utilizar um grupo de recursos existente.

    New-AzResourceGroup -Name $resGroupName -Location $location
    

O Resource Manager requer que todos os grupos de recursos especifiquem um local. que é utilizada como a predefinição para os recursos nesse grupo de recursos. Certifique-se de que todos os comandos para criar um gateway de aplicativo usem o mesmo grupo de recursos.

Criar uma rede virtual e uma sub-rede para o gateway de aplicação

O exemplo que se segue mostra como criar uma rede virtual com o Resource Manager. A rede virtual neste exemplo consiste em sub-redes separadas para o Application Gateway e o Gerenciamento de API.

  1. Defina os endereços IP do Application Gateway.

    Nota

    Como haverá ouvintes públicos e privados, precisamos de um endereço IP público e privado. O endereço IP estático e público deve ser criado, enquanto o endereço IP privado deve ser selecionado na sub-rede associada ao gateway de aplicativo. O endereço IP privado foi selecionado 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. Crie um grupo de segurança de rede (NSG) e regras NSG para a sub-rede do Application Gateway.

    $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. Crie um grupo de segurança de rede (NSG) e regras NSG para a sub-rede de Gerenciamento de API. O API Management stv2 requer várias regras NSG específicas.

    $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. Atribua o intervalo de endereços 10.0.0.0/24 à variável de sub-rede a ser usada para o Application Gateway enquanto você cria uma rede virtual.

    $appGatewaySubnet = New-AzVirtualNetworkSubnetConfig -Name "appGatewaySubnet" -NetworkSecurityGroup $appGwNsg -AddressPrefix "10.0.0.0/24"
    
  5. Atribua o intervalo de endereços 10.0.1.0/24 à variável de sub-rede a ser usada para o Gerenciamento de API enquanto você cria uma rede virtual.

    $apimSubnet = New-AzVirtualNetworkSubnetConfig -Name "apimSubnet" -NetworkSecurityGroup $apimNsg -AddressPrefix "10.0.1.0/24"
    
  6. Crie uma rede virtual chamada vnet-contoso. Use o prefixo 10.0.0.0/16 com as sub-redes 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. Atribua variáveis de sub-rede para as próximas etapas.

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

Criar uma instância de Gerenciamento de API dentro de uma rede virtual

O exemplo a seguir mostra como criar uma instância de Gerenciamento de API em uma rede virtual configurada apenas para acesso interno.

  1. API Management stv2 requer um IP público com um arquivo DomainNameLabel.

    $apimPublicIpAddressId = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-apim" -location $location `
        -AllocationMethod Static -Sku Standard -Force -DomainNameLabel $apimDomainNameLabel
    
  2. Crie um objeto de rede virtual de Gerenciamento de API usando a sub-rede $apimSubnetData que você criou.

    $apimVirtualNetwork = New-AzApiManagementVirtualNetwork -SubnetResourceId $apimSubnetData.Id
    
  3. Crie uma instância de Gerenciamento de API dentro da rede virtual. Este exemplo cria o serviço na camada de serviço Developer. Substitua um nome exclusivo para sua instância de Gerenciamento de API.

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

Pode levar entre 30 e 40 minutos para criar e ativar uma instância de Gerenciamento de API nessa camada. Depois que o comando anterior for bem-sucedido, consulte Configuração de DNS necessária para acessar o serviço de Gerenciamento de API de rede virtual interna para confirmar o acesso a ele.

Configurar nomes de domínio personalizados no Gerenciamento de API

Para configurar nomes de domínio personalizados no Gerenciamento de API:

  1. Inicialize as variáveis a seguir com os detalhes dos certificados com chaves privadas para os domínios e o certificado raiz confiável. Neste exemplo, usamos api.contoso.net, portal.contoso.nete 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. Crie e defina os objetos de Hostname configuração para os pontos de extremidade de Gerenciamento de 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
    

Configurar uma zona privada para resolução DNS na rede virtual

Para configurar uma zona DNS privada para resolução DNS na rede virtual:

  1. Crie uma zona DNS privada e vincule a rede virtual.

    $myZone = New-AzPrivateDnsZone -Name $domain -ResourceGroupName $resGroupName
    
    $link = New-AzPrivateDnsVirtualNetworkLink -ZoneName $domain `
      -ResourceGroupName $resGroupName -Name "mylink" `
      -VirtualNetworkId $vnet.id
    
  2. Crie registros A para os nomes de host de domínio personalizados que mapeiam para o endereço IP privado do Gerenciamento de 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)
    

Criar configuração de gateway de aplicativo

Todos os itens de configuração devem ser configurados antes de criar o gateway de aplicativo. As etapas a seguir criam os itens de configuração necessários para um recurso do Gateway de Aplicativo.

  1. Crie uma configuração IP do Application Gateway chamada gatewayIP01. Quando é iniciado, o Gateway de Aplicação escolhe um endereço IP na sub-rede configurada e encaminha o tráfego da rede para os endereços IP no conjunto de IPs do back-end. Note que cada instância terá um endereço IP.

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appGatewaySubnetData
    
  2. Configure a mesma porta frontend para o ponto de extremidade IP público e privado. Esta porta é aquela à qual os usuários se conectam. Ao usar a mesma porta para ambos, garantimos que solicitações internas e externas possam ser feitas para a mesma porta.

    $fp01 = New-AzApplicationGatewayFrontendPort -Name "port01"  -Port 443
    
  3. Configure dois endereços IP frontend - um público e um privado. O endereço IP privado é retirado da sub-rede do gateway de aplicativo, que foi a primeira a ser criada no índice 0.

    $fipconfig01 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-public-ip" -PublicIPAddress $appGatewayExternalIP
    
    $fipconfig02 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-private-ip" -PrivateIPAddress $appGatewayInternalIP `
      -Subnet $vnet.Subnets[0]
    
  4. Configure os certificados para o gateway de aplicativo. São usados para desencriptar e encriptar novamente o tráfego que passa.

    Nota

    O Application Gateway suporta a definição de opções TLS personalizadas, a desativação de determinadas versões do protocolo TLS e a especificação de pacotes de codificação e a ordem de preferência. Para saber mais sobre as opções configuráveis de TLS, consulte a visão geral da política de 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. Crie os ouvintes HTTP para o gateway de aplicativo. Atribua-lhes a configuração IP front-end, a porta e os certificados TLS/SSL.

    # 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. Crie testes personalizados para o ponto de extremidade de domínio do gateway de Gerenciamento de ContosoApi API. O caminho /status-0123456789abcdef é um ponto de extremidade de integridade padrão hospedado em todas as instâncias do Gerenciamento de API. Defina api.contoso.net como um nome de host de sonda personalizado para protegê-lo com o certificado TLS/SSL.

    Nota

    O nome contosoapi.azure-api.net do host é o nome de host proxy padrão configurado quando um serviço nomeado contosoapi é criado no Azure público.

    $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. Configure o certificado raiz confiável dos certificados de back-end. Este certificado verifica a autenticidade dos certificados de back-end.

    $trustedRootCert = New-AzApplicationGatewayTrustedRootCertificate `
      -Name "allowlistcert1" -CertificateFile $trustedRootCertCerPath
    
  8. Configure as configurações de back-end HTTP para o gateway de aplicativo, incluindo um limite de tempo limite para solicitações de back-end, após o qual elas serão canceladas. Esse valor é diferente do tempo limite da sonda.

    $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. Configure um pool de endereços IP de back-end para cada ponto de extremidade do Gerenciamento de API usando seu respetivo nome de domínio.

    $apimGatewayBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "gatewaybackend" `
      -BackendFqdns $gatewayHostname
    
    $apimPortalBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "portalbackend" `
      -BackendFqdns $portalHostname
    
    $apimManagementBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "managementbackend" `
      -BackendFqdns $managementHostname
    
  10. Crie regras de roteamento para que o gateway de aplicativo use o roteamento básico.

    # 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
    

    Gorjeta

    Alteração -RuleType e roteamento para restringir o acesso a determinadas páginas do portal do desenvolvedor.

  11. Configure o número de instâncias e o tamanho do gateway de aplicação. Neste exemplo, usamos WAF_v2 SKU para aumentar a segurança do recurso de Gerenciamento de API.

    Use um mínimo de duas instâncias (Capacidade) para cargas de trabalho de produção. Talvez você queira usar apenas uma instância para cenários de não produção ou para experimentação geral. Para obter mais informações, consulte Preços do Gateway de Aplicativo do Azure.

    $sku = New-AzApplicationGatewaySku -Name "WAF_v2" -Tier "WAF_v2" -Capacity 2
    
  12. Configure o modo WAF.

    Gorjeta

    Por um curto período durante a configuração e para testar as regras de firewall, convém configurar o modo "Deteção", que monitora e registra alertas de ameaças, mas não bloqueia o tráfego. Em seguida, você pode fazer atualizações nas regras de firewall antes de fazer a transição para o modo "Prevenção", que bloqueia invasões e ataques detetados pelas regras.

    $config = New-AzApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"
    
  13. Como o TLS 1.0 atualmente é o padrão, defina o gateway de aplicativo para usar uma das políticas recentes do TLS 1.2.

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

Criar um gateway de aplicação

  1. Crie um gateway de aplicativo com todos os objetos de configuração das etapas anteriores. Pode levar 15 minutos para criar uma instância.

    $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. Confirme o status de integridade dos back-ends do Gerenciamento de API.

    Get-AzApplicationGatewayBackendHealth -Name $appgwName -ResourceGroupName $resGroupName
    

Verifique se o status de integridade de cada pool de back-end está Íntegro. Se você precisar solucionar problemas de um back-end não íntegro ou um back-end com status de integridade desconhecido, consulte Solucionar problemas de integridade de back-end no Application Gateway.

Criar registos DNS para aceder a pontos de extremidade de Gestão de API a partir da Internet

Depois que o gateway de aplicativo for criado, configure a comunicação com o Gerenciamento de API a partir da Internet. Crie registros DNS A que mapeiam cada um dos nomes de host de ponto de extremidade do Gerenciamento de API que você configurou para o endereço IP público estático do gateway de aplicativo. Neste artigo, exemplos de nomes de host são api.contoso.net, portal.contoso.nete management.contoso.net.

Verificação de conectividade

Para fins de teste rápido, considere alterar temporariamente o arquivo de hosts do computador com entradas que mapeiam o endereço IP público do gateway de aplicativo para os nomes de host de ponto de extremidade do Gerenciamento de API:

  1. Modifique os arquivos hosts. Por exemplo, se o IP público do gateway de aplicativo for 172.203.129.101, a entrada pode ser 172.203.129.101 api.contoso.net.
  2. Execute um comando curl no ponto de extremidade de status do Gerenciamento de API (o mesmo caminho que foi usado para a investigação de integridade anteriormente): curl -v https://api.contoso.net/status-0123456789abcdef Isso deve retornar um status, que indica uma 200 Service Operational comunicação bem-sucedida com o Gerenciamento de API por meio do Application Gateway.

Considerações sobre DNS

O Application Gateway agora tem caminhos privados e públicos. O uso dos mesmos domínios e portas cria uma situação de DNS split-brain na qual um resolvedor de DNS externo deve ser definido para resolver api.contoso.net para o endereço IP externo do gateway de aplicativo, enquanto um resolvedor de DNS interno deve resolver o mesmo domínio para o endereço IP interno do gateway de aplicativo. Essa configuração oferece uma vantagem na medida em que os aplicativos não precisam alterar o domínio ou a porta para direcionamento interno ou externo de aplicativos e APIs. A responsabilidade pela segmentação é devidamente adiada para os resolvedores de DNS.

Resumo

O Gerenciamento de API configurado em uma rede virtual fornece uma interface de gateway único para todas as APIs configuradas, sejam elas hospedadas no local ou na nuvem. A integração do Application Gateway com o Gerenciamento de API oferece a flexibilidade de permitir seletivamente que APIs específicas sejam acessíveis na Internet. A integração também fornece um WAF como um front-end para sua instância de Gerenciamento de API.

Próximos passos