Интеграция службы управления API и внутренней виртуальной сети со шлюзом приложений

ОБЛАСТЬ ПРИМЕНЕНИЯ: Разработчик | Премиум

Вы можете настроить службу "Управление API" для работы в виртуальной сети в режиме внутренней сети, чтобы сделать ее доступной только из этой виртуальной сети. Шлюз приложений Azure — это решение на основе модели "платформа как услуга" (PaaS), которое выполняет роль подсистемы балансировки нагрузки уровня 7. Оно работает как служба обратного прокси-сервера и также включает Брандмауэр веб-приложений Azure (WAF).

Комбинируя службу управления API, подготовленную во внутренней виртуальной сети со шлюзом приложений в качестве внешнего интерфейса, можно:

  • Использовать один ресурс управления API одновременно и для внешних, и для внутренних потребителей.
  • Использовать один ресурс управления API, определив для него в службе управления API подмножество API-интерфейсов, доступных для внешних потребителей.
  • Создать простой способ включать и отключать доступ из Интернета к управлению API.

Руководство по архитектуре приведено в следующих статьях:

Примечание.

Эта статья обновлена с учетом использования шлюза приложений WAF_V2 SKU.

Предварительные требования

Примечание.

Мы рекомендуем использовать модуль Azure Az PowerShell для взаимодействия с Azure. Чтобы начать работу, см. статью Установка Azure PowerShell. Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.

Чтобы выполнить действия, описанные в этой статье, необходимо следующее:

Сценарий

В этой статье описывается, как использовать один экземпляр службы "Управление API" для внутренних и внешних потребителей и настроить ее как единый интерфейс для локальных и облачных API. Вы создаете Управление API экземпляр нового типа однотенантной версии 2 (stv2). Вы узнаете, как использовать общедоступные и частные прослушиватели в Шлюз приложений. Вы понимаете, как предоставлять только подмножество API для внешнего потребления с помощью функций маршрутизации, доступных в Шлюз приложений. В этом примере API выделены зеленым цветом.

В первом примере конфигурации все API-интерфейсы управляются только из виртуальной сети. Внутренние потребители могут обращаться ко всем внутренним и внешним API. Трафик никогда не уходит в Интернет. Высокопроизводительное подключение обеспечивается через каналы Azure Express Route. В этом примере внутренние потребители выделены оранжевым цветом.

Схема: маршрут по URL-адресу.

Действия по интеграции управления API со шлюзом приложений

  • Внутренний пул серверов — этот пул серверов является внутренним виртуальным IP-адресом для Управления API.
  • Параметры внутреннего пула серверов. Каждый пул имеет такие параметры, как порт, протокол и сходство на основе файлов cookie. Эти параметры применяются ко всем серверам в этом пуле.
  • Интерфейсный порт — этот общедоступный порт открыт на шлюзе приложения. Трафик, поступающий на этот порт, перенаправляется на один из внутренних серверов.
  • Прослушиватель: прослушиватель имеет интерфейсный порт, протокол (HTTP или HTTPs, эти значения чувствительны к регистру), а также имя сертификата TLS (при настройке разгрузки TLS).
  • Правило — связывает прослушиватель с внутренним пулом серверов.
  • Пользовательские пробы работоспособности — Шлюз приложений по умолчанию использует пробы на основе IP-адреса, чтобы найти активные серверы в пуле BackendAddressPool. Управление API отвечает только на запросы с правильным заголовком узла, поэтому стандартные пробы завершаются ошибкой. Вы определите пользовательскую пробу работоспособности, чтобы шлюз приложений мог определять работоспособность службы и передавать в нее запросы.
  • Сертификаты личного домена: чтобы получить доступ к Управление API из Интернета, создайте записи системы доменных имен (DNS), чтобы сопоставить имена узлов с Шлюз приложений интерфейсным IP-адресом. Это сопоставление обеспечивает, что заголовок узла и сертификат, отправляемые в Управление API, являются допустимыми. В этом примере мы используем три сертификата. Они нужны для шлюза Управления API (серверная часть), портала разработчика и конечной точки управления.

Предоставление внешней аудитории доступа к порталу разработчика и конечной точке управления через шлюз приложений

В этой статье мы также рассмотрим предоставление доступа к порталу разработчика и конечной точке управления для внешних пользователей с помощью шлюза приложений. Дополнительные действия потребуются для создания прослушивателя, пробы, параметров и правил для каждой конечной точки. Все сведения предоставляются на соответствующих этапах.

Если вы используете идентификатор Microsoft Entra или стороннюю проверку подлинности, включите функцию сопоставления сеансов на основе файлов cookie в Шлюз приложений.

Предупреждение

Чтобы WAF Шлюза приложений не прерывал скачивание спецификаций OpenAPI на портале разработчика, отключите правило брандмауэра 942200 - "Detects MySQL comment-/space-obfuscated injections and backtick termination".

Правила WAF Шлюза приложений, которые могут нарушить работу портала, включают следующие:

  • 920300, 920330, 931130, 942100, 942110, 942180, 942200, 942260, 942340, 942370 для административного режима
  • 942200, 942260, 942370, 942430, 942440 для опубликованного портала

Настройка переменных

В этом руководстве необходимо определить несколько переменных. Именование основано на руководстве по сокращению 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

Создание группы ресурсов для Resource Manager.

Чтобы создать группу ресурсов для Azure Resource Manager, сделайте следующее:

  1. войдите в Azure.

    Connect-AzAccount
    
  2. Выполните аутентификацию со своими учетными данными.

  3. Выберите нужную подписку.

    Get-AzSubscription -Subscriptionid $subscriptionId | Select-AzSubscription
    
  4. Создать группу ресурсов. Если используется существующая группа ресурсов, можно пропустить этот шаг.

    New-AzResourceGroup -Name $resGroupName -Location $location
    

Resource Manager требует, чтобы все группы ресурсов указывали расположение. Оно используется в качестве расположения по умолчанию для ресурсов в этой группе ресурсов. Убедитесь, что во всех командах для создания шлюза приложений используется одна группа ресурсов.

Создание виртуальной сети и подсети для шлюза приложений.

В следующем примере показано создание виртуальной сети с помощью диспетчера ресурсов. Виртуальная сеть в этом примере состоит из отдельных подсетей для шлюза приложений и службы управления API.

  1. Задайте IP-адреса Шлюз приложений.

    Примечание.

    Так как будут общедоступные и частные прослушиватели, нам нужен общедоступный и частный IP-адрес. Статический общедоступный IP-адрес должен быть создан, а частный IP-адрес должен быть выбран из подсети, связанной с шлюзом приложений. Частный IP-адрес выбран произвольно.

    $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. Создайте правила группы безопасности сети (NSG) и группы безопасности сети для подсети Шлюз приложений.

    $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. Создайте правила группы безопасности сети (NSG) и группы безопасности сети для подсети Управление API. Управление API stv2 требует нескольких конкретных правил NSG.

    $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. Назначьте переменной подсети диапазон адресов 10.0.0.0/24, который будет использоваться для Шлюза приложений при создании виртуальной сети.

    $appGatewaySubnet = New-AzVirtualNetworkSubnetConfig -Name "appGatewaySubnet" -NetworkSecurityGroup $appGwNsg -AddressPrefix "10.0.0.0/24"
    
  5. Назначьте переменной подсети диапазон адресов 10.0.1.0/24, который будет использоваться для Управления API при создании виртуальной сети.

    $apimSubnet = New-AzVirtualNetworkSubnetConfig -Name "apimSubnet" -NetworkSecurityGroup $apimNsg -AddressPrefix "10.0.1.0/24"
    
  6. Создайте виртуальную сеть с именем vnet-contoso. назначив ей префикс 10.0.0.0/16. Создайте в ней подсети 10.0.0.0/24 и 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. Назначьте переменные для подсети, которые будут использоваться далее.

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

Создание экземпляра Управления API в виртуальной сети

В следующем примере демонстрируется, как создать экземпляр службы "Управление API" в виртуальной сети, настроенной только для внутреннего доступа.

  1. Управление API stv2 требует общедоступного IP-адреса с уникальнымDomainNameLabel.

    $apimPublicIpAddressId = New-AzPublicIpAddress -ResourceGroupName $resGroupName -name "pip-apim" -location $location `
        -AllocationMethod Static -Sku Standard -Force -DomainNameLabel $apimDomainNameLabel
    
  2. Создайте объект виртуальной сети для Управления API, используя созданную выше переменную подсети $apimSubnetData.

    $apimVirtualNetwork = New-AzApiManagementVirtualNetwork -SubnetResourceId $apimSubnetData.Id
    
  3. Создайте экземпляр Управления API в виртуальной сети. В этом примере создается служба на уровне службы разработчика. Подставьте уникальное имя вашего экземпляра Управления API.

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

Обычно на создание и активацию экземпляра Управления API на этом уровне требуется от 30 до 40 минут. Когда завершится выполнение предыдущей команды, выполните инструкции из раздела Настройка DNS для доступа к службе "Управление API" во внутренней виртуальной сети, чтобы подтвердить права доступа.

Настройка пользовательских доменных имен в службе управления API

Чтобы настроить имена личных доменов в службе "Управление API", сделайте следующее:

  1. Инициализируйте следующие переменные с данными сертификатов с закрытыми ключами для доменов и доверенным корневым сертификатом. В этом примере мы используем api.contoso.net, portal.contoso.net и 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. Создайте и задайте объекты конфигурации Hostname для конечных точек службы "Управление 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
    

Настройка частной зоны для разрешения DNS в виртуальной сети

Чтобы настроить частную зону DNS для разрешения DNS в виртуальной сети, сделайте следующее:

  1. Создайте частную зону DNS и свяжите виртуальную сеть.

    $myZone = New-AzPrivateDnsZone -Name $domain -ResourceGroupName $resGroupName
    
    $link = New-AzPrivateDnsVirtualNetworkLink -ZoneName $domain `
      -ResourceGroupName $resGroupName -Name "mylink" `
      -VirtualNetworkId $vnet.id
    
  2. Создайте записи A для имен узлов личных доменов, сопоставленные с частным IP-адресом службы "Управление 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)
    

Создание конфигурации шлюза приложений

Перед созданием шлюза приложений необходимо настроить все элементы конфигурации. В ходе следующих шагов создаются необходимые элементы конфигурации для ресурса Шлюза приложений.

  1. Создайте конфигурацию IP-адресов Шлюза приложений с именем gatewayIP01. При запуске шлюз приложений получает IP-адрес из настроенной подсети. Затем шлюз маршрутизирует сетевой трафик на IP-адреса из внутреннего пула IP-адресов. Помните, что для каждого экземпляра требуется отдельный IP-адрес.

    $gipconfig = New-AzApplicationGatewayIPConfiguration -Name "gatewayIP01" -Subnet $appGatewaySubnetData
    
  2. Настройте тот же интерфейсный порт для общедоступной и частной конечной точки IP-адреса. Это порт, к которому подключаются пользователи. Используя один и тот же порт для обоих типов, мы убедитесь, что внутренние и внешние запросы можно выполнять в один и тот же порт.

    $fp01 = New-AzApplicationGatewayFrontendPort -Name "port01"  -Port 443
    
  3. Настройте два внешних IP-адреса — один общедоступный и один частный. Частный IP-адрес берется из подсети шлюза приложений, которая была первой, которую необходимо создать по индексу 0.

    $fipconfig01 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-public-ip" -PublicIPAddress $appGatewayExternalIP
    
    $fipconfig02 = New-AzApplicationGatewayFrontendIPConfig `
      -Name "gateway-private-ip" -PrivateIPAddress $appGatewayInternalIP `
      -Subnet $vnet.Subnets[0]
    
  4. Настройте сертификаты для шлюза приложений. Они используются для расшифровки и повторного шифрования проходящего трафика.

    Примечание.

    Шлюз приложений поддерживает определение настраиваемых параметров TLS, отключение определенных версий протокола TLS и указание комплектов шифров и порядка предпочтения. Дополнительные сведения о настраиваемых параметрах TLS см. в статье Общие сведения о политике 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. Создайте прослушиватели HTTP для шлюза приложений. Назначьте им интерфейсную IP-конфигурацию, порт и сертификаты 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. Создайте пользовательские пробы для конечной точки домена шлюза ContosoApi службы "Управление API". Путь /status-0123456789abcdef является конечной точкой работоспособности для всех экземпляров службы "Управление API". Задайте api.contoso.net как имя хоста пользовательской пробы, чтобы защитить его с помощью сертификата TLS/SSL.

    Примечание.

    Имя узла contosoapi.azure-api.net — это имя узла прокси-сервера по умолчанию, настроенное при создании службы с именем contosoapi в общедоступном облаке 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. Настройте доверенный корневой сертификат внутренних сертификатов. Этот сертификат проверяет подлинность внутренних сертификатов.

    $trustedRootCert = New-AzApplicationGatewayTrustedRootCertificate `
      -Name "allowlistcert1" -CertificateFile $trustedRootCertCerPath
    
  8. Настройте параметры серверной части HTTP для шлюза приложений, включая ограничение времени ожидания для внутренних запросов, после чего они отменены. Это значение отличается от времени ожидания проверки работоспособности.

    $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. Настройте пул IP-адресов серверной части для каждой конечной точки Управление API с помощью соответствующего доменного имени.

    $apimGatewayBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "gatewaybackend" `
      -BackendFqdns $gatewayHostname
    
    $apimPortalBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "portalbackend" `
      -BackendFqdns $portalHostname
    
    $apimManagementBackendPool = New-AzApplicationGatewayBackendAddressPool -Name "managementbackend" `
      -BackendFqdns $managementHostname
    
  10. Создайте правила маршрутизации для шлюза приложений, чтобы использовать базовую маршрутизацию.

    # 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
    

    Совет

    Измените -RuleType и маршрутизацию, чтобы ограничить доступ к определенным страницам портала разработчика.

  11. Настройте количество экземпляров и размер шлюза приложений. В этом примере мы используем SKU WAF_v2 для повышения уровня безопасности ресурса Управления API.

    Используйте не менее двух экземпляров (Емкость) для рабочих нагрузок. Для непроизводственных сценариев или для общих экспериментов может быть достаточно только одного экземпляра. Дополнительные сведения см. на странице цен на Шлюз приложений Azure.

    $sku = New-AzApplicationGatewaySku -Name "WAF_v2" -Tier "WAF_v2" -Capacity 2
    
  12. Настройте режим WAF.

    Совет

    В течение короткого периода во время установки и тестирования правил брандмауэра может потребоваться настроить режим "Обнаружение", который отслеживает и регистрирует оповещения об угрозах, но не блокирует трафик. Затем вы можете внести любые обновления в правила брандмауэра перед переходом в режим "Предотвращение", который блокирует вторжение и атаки, обнаруженные правилами.

    $config = New-AzApplicationGatewayWebApplicationFirewallConfiguration -Enabled $true -FirewallMode "Prevention"
    
  13. Так как в настоящее время по умолчанию используется TLS 1.0, настройте шлюз приложений для использования одной из последних политик TLS 1.2.

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

Создание Шлюза приложений

  1. Создайте шлюз приложений со всеми созданными ранее объектами конфигурации. Создание экземпляра может занять 15 минут.

    $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. Подтвердите состояние работоспособности Управление API внутренних серверов.

    Get-AzApplicationGatewayBackendHealth -Name $appgwName -ResourceGroupName $resGroupName
    

Убедитесь, что все внутренние пулы имеют состояние работоспособности "Работоспособный". Если вам необходимо устранить неполадки неработоспособной серверной части или серверной части, состояние работоспособности которой неизвестно, см. статью Устранение проблем с работоспособностью серверной части в Шлюзе приложений.

Создание записей DNS для доступа к конечным точкам Управления API из Интернета

После создания шлюза приложений настройте связь для Управление API из Интернета. Создайте записи A-DNS, которые сопоставляют каждое из имен узлов конечной точки Управления API, настроенных на статический общедоступный IP-адрес шлюза приложений. В этом статье используются примеры узлов api.contoso.net, portal.contoso.net и management.contoso.net.

проверка подлинности Подключение

Для быстрого тестирования рекомендуется временно изменить файл узлов компьютера с записями, которые сопоставляют общедоступный IP-адрес шлюза приложений с именами узлов конечных точек Управление API:

  1. Измените файлы узлов. Например, если общедоступный IP-адрес шлюза приложений является 172.203.129.101, запись может быть 172.203.129.101 api.contoso.net.
  2. Выполните команду curl для конечной точки состояния Управление API (тот же путь, который использовался для пробы работоспособности ранее). curl -v https://api.contoso.net/status-0123456789abcdef Это должно возвращать 200 Service Operational состояние, указывающее на успешное взаимодействие с Управление API через Шлюз приложений.

Рекомендации по DNS

В Шлюз приложений теперь есть частные и общедоступные пути. Использование тех же доменов и портов создает ситуацию DNS с разделением мозга, в которой внешний сопоставитель DNS должен быть разрешен во внешний IP-адрес шлюза приложений, в то время как внутренний сопоставитель DNS должен разрешать api.contoso.net тот же домен внутренним IP-адресом шлюза приложений. Эта настройка обеспечивает преимущество в том, что приложениям не нужно изменять домен или порт для внутреннего или внешнего назначения приложений и API. Ответственность за целевое назначение соответствующим образом отложена для сопоставителей DNS.

Итоги

Управление API, настроенное в виртуальной сети, предоставляет единый интерфейс шлюза для всех настроенных API независимо от того, размещены ли они локально или в облаке. Интеграция Шлюза приложений с Управлением API обеспечивает гибкость выборочного предоставления доступа к определенным API через Интернет. Интеграция также предоставляет WAF в качестве внешнего интерфейса для экземпляра Управления API.

Следующие шаги