Integración de API Management en una red virtual interna con Application Gateway

SE APLICA A: Desarrollador | Premium

Puede configurar el servicio de Azure API Management se en una red virtual en modo interno, para que sea accesible únicamente desde dentro de la red virtual. Azure Application Gateway es una plataforma como servicio (PaaS) que actúa como equilibrador de carga de nivel 7. Actúa como un servicio de proxy inverso y proporciona entre su oferta Azure Web Application Firewall (WAF).

Al combinar API Management aprovisionado en una red virtual interna con el front-end de Application Gateway, puede:

  • Utilizar el mismo recurso de API Management para su uso por los consumidores internos y los consumidores externos.
  • Utilizar un único recurso de API Management y tener definido un subconjunto de API en API Management disponible para los consumidores externos.
  • Proporcionar una solución de llave en mano para activar y desactivar el acceso a API Management desde la red pública de Internet.

Para instrucciones de arquitectura, consulte:

Nota

Este artículo se ha actualizado para usar la SKU Application Gateway WAF_v2.

Requisitos previos

Nota:

Se recomienda usar el módulo Azure Az de PowerShell para interactuar con Azure. Consulte Instalación de Azure PowerShell para empezar. Para más información sobre cómo migrar al módulo Az de PowerShell, consulte Migración de Azure PowerShell de AzureRM a Az.

Para seguir los pasos que se describen en este artículo, debe tener:

  • Una suscripción a Azure activa

    Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

  • Certificados

    • Archivos de intercambio de información personal (PFX) para los nombres de host personalizados de API Management: puerta de enlace, portal para desarrolladores y punto de conexión de administración.
    • Un archivo de Certificado (CER) para el certificado raíz de los certificados PFX.

    Para obtener más información, vea Certificados para el back-end. Con fines de prueba, puede generar certificados autofirmados.

  • La última versión de Azure PowerShell

Escenario

En este artículo, obtendrá información sobre cómo usar una única instancia de API Management para los consumidores tanto internos como externos y hacer que actúe como un único servidor de front-end para las API locales y en la nube. Creará una instancia de API Management del tipo de inquilino único versión 2 (stv2). Aprenderá a usar agentes de escucha públicos y privados en Application Gateway. Comprenderá cómo exponer solo un subconjunto de las API para el consumo externo mediante la funcionalidad de enrutamiento disponible en Application Gateway. En el ejemplo, las API se resaltan en verde.

En el primer ejemplo de la configuración, todas las API se administran únicamente desde dentro de la red virtual. Los consumidores internos pueden acceder a todas las API internas y externas. El tráfico nunca sale a Internet. La conectividad de alto rendimiento se proporciona mediante circuitos Azure ExpressRoute. En el ejemplo, los consumidores internos se resaltan en naranja.

Diagrama que muestra la vista de la URL.

¿Qué se requiere para integrar API Management y Application Gateway?

  • Grupo de servidores de back-end: se trata de la dirección IP virtual interna de API Management.
  • Configuración del grupo de servidores back-end: : cada grupo tiene una configuración como el puerto, el protocolo y la afinidad basada en las cookies. Estos valores se aplican a todos los servidores del grupo.
  • Puerto front-end: puerto público que se abre en la puerta de enlace de aplicaciones. El tráfico que llega se redirige a uno de los servidores back-end.
  • Cliente de escucha: tiene un puerto front-end, un protocolo (Http o Https, estos valores distinguen mayúsculas de minúsculas) y el nombre del certificado de Seguridad de la capa de transporte (TLS) (si se configura una descarga de TLS).
  • Regla: la regla enlaza un agente de escucha con un grupo de servidor back-end.
  • Sondeo de estado personalizado: Application Gateway, de forma predeterminada, usa sondeos basados en direcciones IP para determinar cuáles son los servidores de BackendAddressPool que están activos. API Management responde solo a las solicitudes con el encabezado de host correcto, por lo tanto, los sondeos predeterminados no podrán completarse. Debe definir el sondeo de estado personalizado para ayudar a la puerta de enlace de aplicación a determinar que el servicio está activo y debe reenviar las solicitudes.
  • Certificados de dominio personalizados: para acceder a API Management desde Internet, cree registros de Sistema de nombres de dominio (DNS) para asignar los nombres de host a la dirección IP del front-end de la Application Gateway. Esta asignación le asegura que el encabezado host y el certificado enviados a la instancia de API Management son válidos. En este ejemplo, usamos tres certificados. Son para la puerta de enlace de API Management (el back-end), el portal para desarrolladores y el punto de conexión de administración.

Exposición del portal para desarrolladores y el punto de conexión de administración externamente mediante Application Gateway

En este artículo, también se expone el portal para desarrolladores y el punto de conexión de administración a audiencias externas a través de Application Gateway. Se necesitan pasos adicionales para crear un agente de escucha, un sondeo, una configuración y reglas para cada punto de conexión. Todos los detalles se proporcionan en los pasos correspondientes.

Si usa Microsoft Entra ID o un método de autenticación de terceros, habilite la característica de afinidad de sesión basada en cookies de Application Gateway.

Advertencia

Para evitar que WAF de Application Gateway interrumpa la descarga de las especificaciones de OpenAPI en el portal para desarrolladores, debe deshabilitar la regla de firewall 942200 - "Detects MySQL comment-/space-obfuscated injections and backtick termination".

Las reglas de WAF de Application Gateway, que pueden interrumpir la funcionalidad del portal, incluyen:

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

Configuración de variables

En esta guía, tendrá que definir varias variables. La nomenclatura se basa en la guía sobre abreviaturas de 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

Creación de un grupo de recursos para Resource Manager

Creación de un grupo de recursos para Azure Resource Manager:

  1. Inicie sesión en Azure.

    Connect-AzAccount
    
  2. Autentíquese con sus credenciales.

  3. Seleccione la suscripción que quiera.

    Get-AzSubscription -Subscriptionid $subscriptionId | Select-AzSubscription
    
  4. Cree un grupo de recursos. Si utiliza un grupo de recursos existente, puede omitir este paso.

    New-AzResourceGroup -Name $resGroupName -Location $location
    

Resource Manager requiere que todos los grupos de recursos especifiquen una ubicación. Esta se utiliza como predeterminada para los recursos en ese grupo de recursos. Asegúrese de que todos los comandos para crear una puerta de enlace de aplicaciones usan el mismo grupo de recursos.

Creación de una red virtual y una subred para la puerta de enlace de aplicaciones

En el ejemplo siguiente se muestra cómo crear una red virtual con Resource Manager. La red virtual de este ejemplo consta de subredes independientes para Application Gateway y API Management.

  1. Establezca las direcciones IP de Application Gateway.

    Nota:

    Como habrá agentes de escucha públicos y privados, necesitamos una dirección IP pública y privada. La dirección IP pública estática debe crearse, mientras que la dirección IP privada debe seleccionarse desde la subred asociada a la puerta de enlace de aplicaciones. La dirección IP privada se ha seleccionado 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. Cree un grupo de seguridad de red (NSG) y reglas de NSG para la subred de 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. Cree un grupo de seguridad de red (NSG) y reglas de NSG para la subred de API Management. API Management stv2 requiere varias reglas 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. Asigne el intervalo de direcciones 10.0.0.0/24 a la variable de subred que se va a usar para Application Gateway al crear la red virtual.

    $appGatewaySubnet = New-AzVirtualNetworkSubnetConfig -Name "appGatewaySubnet" -NetworkSecurityGroup $appGwNsg -AddressPrefix "10.0.0.0/24"
    
  5. Asigne el intervalo de direcciones 10.0.1.0/24 a la variable de subred que se va a usar para API Management al crear la red virtual.

    $apimSubnet = New-AzVirtualNetworkSubnetConfig -Name "apimSubnet" -NetworkSecurityGroup $apimNsg -AddressPrefix "10.0.1.0/24"
    
  6. Cree una red virtual llamada vnet-contoso. Use el prefijo 10.0.0.0/16 con las subredes 10.0.0.0/24 y 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. Asigne variables de subred para los pasos siguientes.

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

Creación de una instancia de API Management dentro de una red virtual

En el ejemplo siguiente se muestra cómo crear una instancia de API Management en una red virtual configurada únicamente para el acceso interno.

  1. API Management stv2 requiere una dirección IP pública con un DomainNameLabel único.

    $apimPublicIpAddressId = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-apim" -location $location `
        -AllocationMethod Static -Sku Standard -Force -DomainNameLabel $apimDomainNameLabel
    
  2. Cree un objeto de red virtual de API Management con la subred $apimSubnetData creada anteriormente.

    $apimVirtualNetwork = New-AzApiManagementVirtualNetwork -SubnetResourceId $apimSubnetData.Id
    
  3. Cree una instancia de API Management dentro de la red virtual. En este ejemplo, se crea el servicio en el nivel de servicio Desarrollador. Sustituya un nombre único por la instancia de API Management.

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

Normalmente, se tarda entre 30 y 40 minutos en crear y activar una instancia de API Management en este nivel. Después de que el comando anterior se ejecute correctamente, consulte Configuración de DNS requerida para acceder al servicio de API Management de red virtual interna para confirmar el acceso.

Configuración de nombres de dominio personalizados en API Management

Para configurar nombres de dominio personalizados en API Management:

  1. Inicialice las variables siguientes con los detalles de los certificados con claves privadas para los dominios y el certificado raíz de confianza. En este ejemplo, usamos api.contoso.net, portal.contoso.net y 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. Cree y establezca los objetos de configuración Hostname para los puntos de conexión de API Management.

    $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
    

Configuración de una zona privada para la resolución DNS en la red virtual

Para configurar una zona DNS privada para la resolución DNS en la red virtual:

  1. Cree una zona DNS privada y vincule la red virtual.

    $myZone = New-AzPrivateDnsZone -Name $domain -ResourceGroupName $resGroupName
    
    $link = New-AzPrivateDnsVirtualNetworkLink -ZoneName $domain `
      -ResourceGroupName $resGroupName -Name "mylink" `
      -VirtualNetworkId $vnet.id
    
  2. Cree registros A para los nombres de host de dominio personalizados que se asignan a la dirección IP privada de API Management.

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

Creación de una configuración de puerta de enlace de aplicaciones

Se deben haber definido todos los elementos de configuración antes de crear la puerta de enlace de aplicaciones. En los pasos siguientes, se crean los elementos de configuración necesarios para un recurso de Application Gateway.

  1. Cree una configuración de IP de Application Gateway denominada gatewayIP01. Cuando se inicia la Puerta de enlace de aplicaciones, elige una dirección IP de la subred configurada y redirige el tráfico de red a las direcciones IP en el grupo IP de back-end. Tenga en cuenta que cada instancia toma una dirección IP.

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appGatewaySubnetData
    
  2. Configure el mismo puerto de front-end para el punto de conexión IP público y privado. Este puerto es el al que se conectan los usuarios. Mediante el uso del mismo puerto para ambos garantizamos que las solicitudes internas y externas se puedan realizar en el mismo puerto.

    $fp01 = New-AzApplicationGatewayFrontendPort -Name "port01"  -Port 443
    
  3. Configure dos direcciones IP de front-end: una pública y otra privada. La dirección IP privada se toma de la subred de Application Gateway, que fue la primera que se va a crear en el í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 los certificados SSL para la instancia de Application Gateway. Se usan para descifrar y volver a cifrar el tráfico que pasa a través.

    Nota

    Application Gateway permite definir opciones de TLS personalizadas, deshabilitar determinadas versiones del protocolo TLS y especificar conjuntos de cifrado y el orden de preferencia. Para más información sobre las opciones configurables de TLS, consulte Introducción a la directiva 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. Cree los agentes de escucha HTTP para Application Gateway. Asígneles la configuración IP de front-end, el puerto y los certificados TSL/SSL que se usarán.

    # 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. Cree sondeos personalizados para el punto de conexión de dominio de la puerta de enlace ContosoApi de API Management. La ruta de acceso /status-0123456789abcdef es un punto de conexión de mantenimiento predeterminado hospedado en todos los servicios de API Management. Establezca api.contoso.net como un nombre de host de sondeo personalizado para protegerlo con el certificado TLS/SSL.

    Nota

    El nombre de host contosoapi.azure-api.net es el nombre de host de proxy predeterminado configurado cuando se crea un servicio denominado contosoapi en el ámbito público de Azure.

    $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 el certificado raíz de confianza de los certificados de back-end. Este certificado comprueba la autenticidad de los certificados back-end.

    $trustedRootCert = New-AzApplicationGatewayTrustedRootCertificate `
      -Name "allowlistcert1" -CertificateFile $trustedRootCertCerPath
    
  8. Establezca la configuración de back-end HTTP para la puerta de enlace de aplicación, incluido un límite de tiempo de espera para las solicitudes de back-end, después del cual se cancelarán. Este valor es distinto del tiempo de espera del sondeo.

    $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 un grupo de direcciones IP de back-end para cada punto de conexión de API Management, con su nombre de dominio respectivo.

    $apimGatewayBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "gatewaybackend" `
      -BackendFqdns $gatewayHostname
    
    $apimPortalBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "portalbackend" `
      -BackendFqdns $portalHostname
    
    $apimManagementBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "managementbackend" `
      -BackendFqdns $managementHostname
    
  10. Cree reglas de enrutamiento para Application Gateway para usar el enrutamiento 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
    

    Sugerencia

    Cambie -RuleType y el enrutamiento para restringir el acceso a determinadas páginas del portal para desarrolladores.

  11. Configuración del número de instancias y el tamaño de la puerta de enlace de aplicaciones En este ejemplo, usamos SKU WAF_v2 para aumentar la seguridad del recurso de API Management.

    Se recomienda usar un mínimo de dos instancias (capacidad) para las cargas de trabajo de producción. Es posible que quiera usar solo una instancia para escenarios que no sean de producción o para la experimentación general. Para obtener más información, consulte Precios de Azure Application Gateway.

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

    Sugerencia

    Durante un corto período a lo largo de la instalación y para probar las reglas de firewall, es posible que quiera configurar el modo "Detección", que supervisa y registra alertas de amenazas, pero no bloquea el tráfico. Después, puede realizar actualizaciones de las reglas de firewall antes de pasar al modo "Prevención", que bloquea las intrusiones y los ataques que detectan las reglas.

    $config = New-AzApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"
    
  13. Dado que TLS 1.0 actualmente es el valor predeterminado, establezca la puerta de enlace de aplicaciones para que use una de las directivas de TLS 1.2 más reciente.

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

Creación de una puerta de enlace de aplicaciones

  1. Cree una instancia de Application Gateway con todos los objetos de configuración de los pasos anteriores. La creación de una instancia puede tardar 15 minutos.

    $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 el estado de mantenimiento de los back-ends de API Management.

    Get-AzApplicationGatewayBackendHealth -Name $appgwName -ResourceGroupName $resGroupName
    

Asegúrese de que el estado de mantenimiento de cada grupo de back-end es Correcto. Si necesita solucionar problemas de un back-end incorrecto o un back-end con un estado de mantenimiento desconocido, consulte Solución de problemas de mantenimiento de back-end en Application Gateway.

Creación de registros DNS para acceder a API Management puntos de conexión desde Internet

Una vez creada la puerta de enlace de aplicación, configure la comunicación para API Management desde Internet. Cree registros A de DNS que asignen cada uno de los nombres de host de punto de conexión de API Management que configuró para la dirección IP pública estática de la puerta de enlace de aplicaciones. En este artículo, los nombres de host de ejemplo son api.contoso.net, portal.contoso.net y management.contoso.net.

Comprobación de conectividad

Para realizar pruebas rápidas, considere la posibilidad de modificar temporalmente el archivo de hosts del equipo con entradas que asignan la dirección IP pública de la puerta de enlace de aplicaciones a los nombres de host del punto de conexión de API Management:

  1. Modifique los archivos de hosts. Por ejemplo, si la dirección IP pública de la puerta de enlace de aplicaciones es 172.203.129.101, la entrada puede ser 172.203.129.101 api.contoso.net.
  2. Ejecute un comando curl en el punto de conexión de estado de API Management (la misma ruta de acceso que se usó anteriormente para el sondeo de estado): curl -v https://api.contoso.net/status-0123456789abcdef Esto debe devolver un estado 200 Service Operational, lo que indica una comunicación correcta con API Management a través de Application Gateway.

Consideraciones DNS

Application Gateway ahora tiene rutas privadas y públicas. El uso de los mismos dominios y puertos crea una situación de DNS de cerebro dividido en la que se debe establecer una resolución DNS externa para resolver api.contoso.net en la dirección IP externa de la puerta de enlace de aplicaciones, mientras que un solucionador DNS interno debe resolver el mismo dominio en la dirección IP interna de la puerta de enlace de aplicaciones. Esta configuración proporciona una ventaja en que las aplicaciones no necesitan modificar el dominio o el puerto para el destino interno o externo de las aplicaciones y las API. La responsabilidad de la selección de destino se aplaza adecuadamente a los solucionadores DNS.

Resumen

API Management configurado en una red virtual proporciona una interfaz de puerta de enlace única para todas las API configuradas, independientemente de si están hospedadas de forma local o en la nube. La integración de Application Gateway con API Management proporciona la flexibilidad necesaria para permitir de forma selectiva que determinadas API sean accesibles en Internet. La integración también proporciona una WAF como front-end para la instancia de API Management.

Pasos siguientes