Учебное пособие: Изолировать взаимодействие с бэкэндом в Службе приложений Azure с помощью интеграции виртуальной сети

В этой статье описано, как настроить приложение службы приложений с безопасным, изолированным от сети взаимодействием со службами серверной части. Пример сценария используется в учебнике: Подключение Cognitive Service к службе приложений с помощью Key Vault для обеспечения безопасности. По завершении у вас есть приложение службы приложений, которое обращается как к Key Vault, так и к средствам Foundry через виртуальную сеть Azure. Для другого трафика доступ к этим серверным ресурсам запрещен. Весь трафик будет изолирован в виртуальной сети через интеграцию виртуальной сети и частные конечные точки.

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

Схема, на котором показана архитектура сценария.

При использовании этой архитектуры:

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

Что вы узнаете:

  • Создание виртуальной сети и подсетей для интеграции виртуальной сети службы приложений
  • Создание частных зон DNS
  • Создание частных конечных точек
  • Настройка интеграции виртуальной сети в Службе приложений

Предпосылки

Создание виртуальной сети и подсетей

  1. Создайте виртуальную сеть. Замените <имя> виртуальной сети уникальным именем.

    # Save the virtual network name as a variable for convenience
    vnetName=<virtual-network-name>
    
    az network vnet create --resource-group $groupName --location $region --name $vnetName --address-prefixes 10.0.0.0/16
    
  2. Создайте подсеть для интеграции виртуальной сети службы приложений.

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name vnet-integration-subnet --address-prefixes 10.0.0.0/24 --delegations Microsoft.Web/serverfarms --private-endpoint-network-policies Enabled
    

    Для App Service рекомендуется, чтобы подсеть интеграции виртуальной сети имела как минимум блок CIDR /26. (См. требования к подсети интеграции виртуальной сети.) /24 более чем достаточно. --delegations Microsoft.Web/serverfarms указывает, что подсеть делегирована для интеграции с виртуальной сетью Службы приложений.

  3. Создайте другую подсеть для частных конечных точек.

    az network vnet subnet create --resource-group $groupName --vnet-name $vnetName --name private-endpoint-subnet --address-prefixes 10.0.1.0/24 --private-endpoint-network-policies Disabled
    

    Для подсетей частной конечной точки необходимо отключить политики сети частной конечной точки.

Создание частных зон DNS

Так как ресурсы Key Vault и Foundry Tools будут находиться за частными конечными точками, необходимо определить для них частные зоны DNS . Эти зоны используются для размещения записей DNS для частных конечных точек и позволяют клиентам находить внутренние службы по имени.

  1. Создайте две частные зоны DNS, одну для ресурса Foundry Tools и одну для хранилища ключей.

    az network private-dns zone create --resource-group $groupName --name privatelink.cognitiveservices.azure.com
    az network private-dns zone create --resource-group $groupName --name privatelink.vaultcore.azure.net
    

    Дополнительные сведения об этих параметрах см. в разделе "Конфигурация DNS частной конечной точки Azure".

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

    az network private-dns link vnet create --resource-group $groupName --name cognitiveservices-zonelink --zone-name privatelink.cognitiveservices.azure.com --virtual-network $vnetName --registration-enabled False
    az network private-dns link vnet create --resource-group $groupName --name vaultcore-zonelink --zone-name privatelink.vaultcore.azure.net --virtual-network $vnetName --registration-enabled False
    

Создание частных конечных точек

  1. В подсети частной конечной точки виртуальной сети создайте частную конечную точку для ресурса Foundry Tools.

    # Get Foundry Tools resource ID
    csResourceId=$(az cognitiveservices account show --resource-group $groupName --name $csResourceName --query id --output tsv)
    
    az network private-endpoint create --resource-group $groupName --name securecstext-pe --location $region --connection-name securecstext-pc --private-connection-resource-id $csResourceId --group-id account --vnet-name $vnetName --subnet private-endpoint-subnet
    
  2. Создайте группу зон DNS для частной конечной точки Foundry Tools. Группа зон DNS — это связь между частной зоной DNS и частной конечной точкой. Эта ссылка помогает автоматически обновлять частную зону DNS при обновлении частной конечной точки.

    az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securecstext-pe --name securecstext-zg --private-dns-zone privatelink.cognitiveservices.azure.com --zone-name privatelink.cognitiveservices.azure.com
    
  3. Блокировать общедоступный трафик к ресурсу Foundry Tools.

    az rest --uri $csResourceId?api-version=2024-10-01 --method PATCH --body '{"properties":{"publicNetworkAccess":"Disabled"}}' --headers 'Content-Type=application/json'
    
    # Repeat the following command until the output is "Succeeded"
    az cognitiveservices account show --resource-group $groupName --name $csResourceName --query properties.provisioningState
    

    Замечание

    Убедитесь, что состояние подготовки изменения равно "Succeeded". Затем можно наблюдать изменение поведения в примере приложения. Вы по-прежнему можете загрузить приложение, но если вы попытаетесь выбрать кнопку "Обнаружение ", вы получите ошибку HTTP 500 . Приложение потеряло подключение к ресурсу Foundry Tools через общую сеть.

  4. Повторите предыдущие шаги для хранилища ключей.

    # Create a private endpoint for the key vault
    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    az network private-endpoint create --resource-group $groupName --name securekeyvault-pe --location $region --connection-name securekeyvault-pc --private-connection-resource-id $vaultResourceId --group-id vault --vnet-name $vnetName --subnet private-endpoint-subnet
    # Create a DNS zone group for the endpoint
    az network private-endpoint dns-zone-group create --resource-group $groupName --endpoint-name securekeyvault-pe --name securekeyvault-zg --private-dns-zone privatelink.vaultcore.azure.net --zone-name privatelink.vaultcore.azure.net
    # Block public traffic to the key vault
    az keyvault update --name $vaultName --default-action Deny
    
  5. Принудительное немедленное получение ссылок на хранилище ключей в приложении путем сброса параметров приложения. (Дополнительные сведения см. в разделе "Поворот".)

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    

    Замечание

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

Две частные конечные точки доступны только клиентам в созданной виртуальной сети. Вы даже не можете получить доступ к секретам в хранилище ключей на странице секретов на портале Azure, так как портал обращается к ним через общедоступный Интернет. (См. раздел "Управление заблокированными ресурсами".)

Настройка интеграции виртуальной сети в приложении

  1. Масштабируйте приложение до поддерживаемой ценовой категории. (См. статью "Интеграция приложения с виртуальной сетью Azure".)

    az appservice plan update --name $planName --resource-group $groupName --sku S1
    
  2. Принудительное применение HTTPS для входящих запросов. (Этот шаг не связан с текущим сценарием, но это важно.)

    az webapp update --resource-group $groupName --name $appName --https-only
    
  3. Включение интеграции с виртуальной сетью в приложении.

    az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet
    

    Интеграция с виртуальной сетью позволяет исходящему трафику поступать непосредственно в виртуальную сеть. По умолчанию в виртуальную сеть направляется только локальный IP-трафик, определенный в RFC-1918 — это то, что необходимо для частных конечных точек. Сведения о маршрутизации всего трафика в виртуальную сеть см. в разделе "Управление маршрутизацией интеграции виртуальной сети". Вы также можете маршрутизировать весь трафик, если вы хотите маршрутизировать интернет-трафик через виртуальную сеть, например через шлюз Azure NAT или брандмауэр Azure.

  4. В браузере перейдите к <app-name>.azurewebsites.net и дождитесь пока интеграция вступит в силу. Если вы получаете ошибку HTTP 500, подождите несколько минут и повторите попытку. Если вы можете загрузить страницу и получить результаты обнаружения, это значит, что вы подключаетесь к конечной точке Foundry Tools, используя ссылки на хранилище ключей.

    Замечание

    Если вы продолжаете получать ошибки HTTP 500 в течение длительного времени, это может помочь принудительно отправить ссылку на хранилище ключей еще раз:

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    

Управление заблокированными ресурсами

В зависимости от сценариев вы можете не управлять ресурсами, защищенными частной конечной точкой, с помощью портала Azure, Azure CLI или Azure PowerShell (например, Key Vault). Все эти средства выполняют вызовы REST API для доступа к ресурсам через общедоступный Интернет и блокируются конфигурацией. Ниже приведены несколько вариантов доступа к заблокированным ресурсам:

  • Для Key Vault добавьте общедоступный IP-адрес локального компьютера для просмотра или обновления секретов, защищенных частными конечными точками.
  • Если локальная сеть расширена в виртуальную сеть Azure через VPN-шлюз или Azure ExpressRoute, вы можете управлять защищенными ресурсами частной конечной точки непосредственно из локальной сети.
  • Управление ресурсами, защищенными частной конечной точкой, с сервера перехода в виртуальной сети.
  • Deploy Cloud Shell в виртуальную сеть.

Очистите ресурсы

На предыдущих этапах вы создали ресурсы Azure в группе ресурсов. Если вы не ожидаете, что эти ресурсы потребуются в будущем, удалите группу ресурсов, выполнив следующую команду в Cloud Shell:

az group delete --name $groupName

Эта команда может занять минуту на выполнение.

Дальнейшие шаги