Como integrar o Gerenciamento de API em uma rede virtual interna com o gateway de aplicativo

APLICA-SE A: Desenvolvedor | Premium

É possível configurar o Gerenciamento de API do Azure uma rede virtual no modo interno, que o torna acessível apenas dentro da rede virtual. Gateway de Aplicativo do Azure é uma PaaS (plataforma como serviço) que atua como um balanceador de carga de Camada 7. Ele atua como um serviço de proxy reverso e fornece entre suas ofertas o WAF (Firewall de Aplicativo Web do Azure).

Ao combinar o Gerenciamento de API provisionado em uma rede virtual interna com o front-end do gateway de aplicativo, você pode:

  • Usar o mesmo recurso de Gerenciamento de API para consumo por clientes internos e externos.
  • Usar um único recurso de Gerenciamento de API e ter uma sub-rede de APIs definida no Gerenciamento de API disponível para consumidores externos.
  • Fornecer uma maneira rápida de ativar e desativar o acesso ao Gerenciamento de API da Internet pública.

Para diretrizes de arquitetura, confira:

Observação

Este artigo foi atualizado para usar o gateway de aplicativo WAF_V2 SKU.

Pré-requisitos

Observação

Recomendamos que você use o módulo Az PowerShell do Azure para interagir com o Azure. Confira Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo Az PowerShell, confira Migrar o Azure PowerShell do AzureRM para o Az.

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

Cenário

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

No primeiro exemplo de instalaçã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 é exposto à Internet. A conectividade de alto desempenho pode ser fornecida por meio de circuitos de Azure ExpressRoute. No exemplo, os consumidores internos são realçadas em laranja.

Diagrama que mostra a rota da URL.

O que é necessário para integrar o Gerenciamento de API e o gateway de aplicativo?

  • Pool de servidor de back-end: esse pool de servidores é o endereço IP virtual interno do Gerenciamento de API.
  • Configurações do pool de servidores back-end: cada pool tem configurações como porta, protocolo e afinidade baseada em cookie. Essas configurações são aplicadas a todos os servidores no pool.
  • Porta front-end: essa porta pública é aberta no gateway de aplicativo. O tráfego que o atinge é redirecionado para um dos servidores de 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 estiver configurando o descarregamento do TLS).
  • Regra: a regra vincula um ouvinte para um pool de servidor de back-end.
  • Investigação de integridade personalizada: o Gateway de Aplicativo, por padrão, usa investigações baseadas em endereço IP para entender quais servidores no BackendAddressPool estão ativos. O Gerenciamento de API responde apenas às solicitações que têm o cabeçalho de host correto, portanto, as investigações padrão falham. Você define uma investigação de integridade personalizada para ajudar o gateway de aplicativo a determinar que o serviço está ativo e deve encaminhar as solicitações.
  • Certificados de domínio personalizados: para acessar o Gerenciamento de API da Internet, crie registros DNS (Sistema de Nomes de Domínio) para mapear seus nomes de host para o endereço IP de front-end do Gateway de Aplicativo. Esse mapeamento garante que o cabeçalho do host e o certificado enviados ao Gerenciamento de API sejam válidos. Neste exemplo, vamos usar três certificados. Eles são para o Gateway de Gerenciamento de API (o back-end), o portal do desenvolvedor e o ponto de extremidade de gerenciamento.

Expor o portal do desenvolvedor e o ponto de extremidade de gerenciamento externamente por meio do gateway de aplicativo

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

Se você usa o Microsoft Entra ID ou autenticação de terceiros, habilite o recurso afinidade de sessão baseada em cookie no Gateway de Aplicativo.

Aviso

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

As regras do WAF do Gateway de Aplicativo capazes de interromper a funcionalidade do portal incluem:

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

Definindo Variáveis

Ao longo deste guia, você precisa definir várias variáveis. A nomenclatura é baseada nas diretrizes de abreviação 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 Gerenciador de Recursos

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

  1. Entre no Azure.

    Connect-AzAccount
    
  2. Como autenticar com suas credenciais.

  3. Selecione a assinatura que você deseja.

    Get-AzSubscription -Subscriptionid $subscriptionId | Select-AzSubscription
    
  4. Crie um grupos de recursos. Você poderá ignorar esta etapa se estiver usando um grupo de recursos existente.

    New-AzResourceGroup -Name $resGroupName -Location $location
    

O Resource Manager requer que todos os grupos de recursos especifiquem um local. Esse local é usado como o padrão para os recursos do grupo de recursos em questão. Verifique se todos os comandos para criar um Gateway de Aplicativo usam o mesmo grupo de recursos.

Criar uma rede virtual e uma sub-rede para o gateway de aplicativo

O exemplo a seguir mostra como criar uma rede virtual usando o Gerenciador de Recursos. A rede virtual neste exemplo consiste em sub-redes separadas para o Gerenciamento de API e gateway de aplicativo.

  1. Defina os endereços IP do Gateway de Aplicativo.

    Observação

    Como haverá ouvintes públicos e privados, precisamos de um endereço IP público e privado. O endereço IP público estático 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 Gateway de Aplicativo.

    $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 Gerenciamento de API. O Gerenciamento de API stv2 requer várias regras de 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. Ao criar uma rede virtual, atribua o intervalo de endereço 10.0.0.0/24 à variável de sub-rede a ser usada para o Gateway de Aplicativo.

    $appGatewaySubnet = New-AzVirtualNetworkSubnetConfig -Name "appGatewaySubnet" -NetworkSecurityGroup $appGwNsg -AddressPrefix "10.0.0.0/24"
    
  5. Ao criar uma rede virtual, atribua o intervalo de endereço 10.0.1.0/24 à variável de sub-rede a ser usada para o Gerenciamento de API.

    $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 somente para acesso interno.

  1. O stv2 do Gerenciamento de API requer um IP público com um exclusivo 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 criada.

    $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 do desenvolvedor. Substitua um nome exclusivo para a 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
    

A criação e a ativação de uma instância de Gerenciamento de API nessa camada leva de 30 a 40 minutos. Depois que o comando anterior for bem-sucedido, confira a Configuração DNS necessária para acessar o serviço de Gerenciamento de API da rede virtual interna para confirmar o acesso a ele.

Configure 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 e com chaves privadas para os domínios e o certificado raiz confiável. Neste exemplo, usamos a 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. Crie e configure os objetos de configuração do Hostname 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 uma configuração do gateway de aplicativo

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

  1. Crie uma configuração de IP do Gateway de Aplicativo chamada gatewayIP01. Quando o Gateway de Aplicativo é iniciado, ele escolhe um endereço IP na sub-rede configurada e encaminha o tráfego de rede para os endereços IP no pool de IPs de back-end. Tenha em mente que cada instância usa um endereço IP.

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

    $fp01 = New-AzApplicationGatewayFrontendPort -Name "port01"  -Port 443
    
  3. Configure dois endereços IP de front-end : um público e outro privado. O endereço IP privado é obtido 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 o certificado para o gateway de aplicativo. Eles são usados para descriptografar e criptografar novamente o tráfego que passa.

    Observação

    O gateway de aplicativo dá suporte à definição de opções de TLS personalizada, à desabilitação de determinadas versões de protocolo TLS e à especificação de conjuntos de criptografia e à ordem de preferência. Para saber mais sobre as opções configuráveis de TLS, acesse 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 o ouvinte HTTP para o Gateway de Aplicativo. Atribua a eles a configuração de IP, a porta e o certificado TSL/SSL do 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. Crie uma investigação personalizada para o ponto de extremidade de domínio do gateway ContosoApi do Gerenciamento de 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 investigação personalizado para protegê-lo com o certificado TSL/SSL.

    Observação

    O nome do host contosoapi.azure-api.net é o nome do host do proxy padrão configurado quando um serviço 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. Esse certificado verifica a autenticidade dos certificados de back-end.

    $trustedRootCert = New-AzApplicationGatewayTrustedRootCertificate `
      -Name "allowlistcert1" -CertificateFile $trustedRootCertCerPath
    
  8. Defina 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 as quais elas são canceladas. Esse valor é diferente do tempo limite de investigação.

    $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 de Gerenciamento de API usando seu respectivo 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 o gateway de aplicativo usar 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
    

    Dica

    Altere o -RuleType e o 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 aplicativo. Neste exemplo, usamos o 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 do WAF.

    Dica

    Por um curto período durante a instalação e para testar suas regras de firewall, o ideal é configurar o modo "Detecção", que monitora e registra os alertas de ameaças em log, 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 detectados 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 TLS 1.2 recentes.

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

Criar um Gateway de Aplicativo

  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
    

Certifique-se de que o status de integridade de cada pool de back-end esteja íntegro. Se precisar solucionar um problema de back-end não íntegro ou de um back-end com status de integridade desconhecido, consulte Solucionar problemas de integridade de back-end no Gateway de Aplicativo.

Criar registros DNS para acessar os pontos de extremidade de Gerenciamento de API da Internet

Depois que o gateway de aplicativo for criado, configure a comunicação com o Gerenciamento de API da Internet. Crie registros DNS A que mapeiem cada um dos nomes do host do ponto de extremidade de Gerenciamento de API que você configurou para o endereço IP público estático do gateway de aplicativo. Neste artigo, os nomes do host de exemplo são api.contoso.net, portal.contoso.net e 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 do ponto de extremidade do Gerenciamento de API:

  1. Modifique os arquivos de hosts. Por exemplo, se o IP público do gateway de aplicativo for 172.203.129.101, a entrada poderá 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 usado para a investigação de integridade anteriormente): curl -v https://api.contoso.net/status-0123456789abcdef isso deve retornar um status de 200 Service Operational, que indica uma comunicação bem-sucedida com o Gerenciamento de API por meio do Gateway de Aplicativo.

Considerações sobre DNS

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

Resumo

O Gerenciamento de API, quando configurado em uma rede virtual, fornece uma interface de gateway única para todas as APIs configuradas, estejam elas hospedadas no local ou na nuvem. A integração do Gateway de Aplicativo ao Gerenciamento de API fornece a flexibilidade para habilitar seletivamente as APIs específicas para que possam ser acessadas pela Internet. A integração também fornece um WAF como um front-end à sua instância de Gerenciamento de API.

Próximas etapas