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

В этой статье вы настроите приложение Службы приложений с защищенным и изолированным от сети каналом обмена данными с серверными службами. В этом руководстве сценарий из руководства по безопасному подключению к службе Congnitive Service для работы со Службой приложений с помощью Key Vault. По завершении у вас будет приложение Службы приложений, которое обращается к Key Vault и службам Cognitive Services через виртуальную сеть 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 и Cognitive Services будут находиться за частными конечными точками, для них необходимо определить частные зоны DNS. Эти зоны используются для размещения записей DNS для частных конечных точек и позволяют клиентам находить серверные службы по имени.

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

    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 для частной конечной точки Cognitive Services. Группа зон 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. Заблокируйте общий трафик к ресурсу Cognitive Services.

    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. Приложение потеряло связь с ресурсом Cognitive Services через общие сети.

  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, подождите несколько минут и повторите попытку. Если при загрузке страницы вы видите результаты обнаружения, вы подключаетесь к конечной точке Cognitive Services со ссылками на хранилище ключей.

    Примечание

    Если ошибки 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

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

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