Руководство: изолирование взаимодействия между внутренними сетями в Службе приложений Azure посредством интеграции виртуальной сети

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

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

Архитектура сценария

С этой архитектурой:

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

Освещаются следующие темы:

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

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

В этом руководстве предполагается, что вы выполнили инструкции из руководства по безопасному подключению к Службе приложений с помощью Key Vault и создали приложение для распознавания языков.

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

    groupName=myKVResourceGroup
    region=westeurope
    csResourceName=<cs-resource-name>
    appName=<app-name>
    vaultName=<vault-name>

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

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

    # Save vnet name as 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 --disable-private-endpoint-network-policies false
    

    Для Службы приложений в подсети интеграции с виртуальной сетью рекомендуется использовать как минимум блок 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 --disable-private-endpoint-network-policies true
    

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

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

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

  1. Создайте две частные зоны DNS: одну для ресурса служб ИИ Azure, а другую для хранилища ключей.

    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. Создайте частную конечную точку для Cognitive Service в подсети частных конечных точек вашей виртуальной сети.

    # Get Cognitive Services 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 для частной конечной точки служб ИИ Azure. Группа зон 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. Блокировка общедоступного трафика к ресурсу служб ИИ Azure.

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

    Примечание

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

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

    # Create private endpoint for 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 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 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 $appName --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 — это то, что необходимо для частных конечных точек. Сведения о маршрутизации всего трафика в виртуальную сеть см. в разделе Управление маршрутизацией при интеграции с виртуальной сетью. Маршрутизацию всего трафика можно также использовать в ситуации, если через виртуальную сеть, например через NAT виртуальных сетей Azure или Брандмауэр Azure, требуется маршрутизировать интернет-трафик.

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

    Примечание

    Если ошибки 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-шлюз или ExpressRoute, вы можете управлять ресурсами за частными конечными точками непосредственно из локальной сети.
  • Используйте для управление ресурсами, защищенными частными конечными точками, сервер переходов в виртуальной сети.
  • Развертывание Cloud Shell в виртуальной сети.

Очистка ресурсов

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

az group delete --name $groupName

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

Дальнейшие действия