Руководство: изолирование взаимодействия между внутренними сетями в Службе приложений 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>
Создание виртуальных сетей и подсетей
Создайте виртуальную сеть. Замените <имя виртуальной сети> на уникальное имя.
# 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
Создайте подсеть для интеграции с виртуальной сетью Службы приложений.
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
указывает, что подсеть делегирована для интеграции с виртуальной сетью Службы приложений.Создайте другую подсеть для частных конечных точек.
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 для частных конечных точек и позволяют клиентам находить серверные службы по имени.
Создайте две частные зоны 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.
Создайте связь между частной зоной 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
Создание частных конечных точек
Создайте частную конечную точку для 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
Создайте группу зон 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
Блокировка общедоступного трафика к ресурсу служб ИИ 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 через общую сеть.Повторите предыдущие шаги для хранилища ключей.
# 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
Выполните принудительную немедленную перезагрузку ссылок на хранилище ключей в приложении, сбросив параметры приложения (дополнительные сведения см. в разделе о смене).
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).
az appservice plan update --name $appName --resource-group $groupName --sku S1
Примените HTTPS для входящих запросов (это не относится непосредственно к нашему сценарию, но также является важным шагом).
az webapp update --resource-group $groupName --name $appName --https-only
Включение интеграции с виртуальной сетью в приложении.
az webapp vnet-integration add --resource-group $groupName --name $appName --vnet $vnetName --subnet vnet-integration-subnet
Интеграция с виртуальной сетью позволяет исходящему трафику поступать непосредственно в виртуальную сеть. По умолчанию в виртуальную сеть направляется только локальный IP-трафик, определенный в RFC-1918 — это то, что необходимо для частных конечных точек. Сведения о маршрутизации всего трафика в виртуальную сеть см. в разделе Управление маршрутизацией при интеграции с виртуальной сетью. Маршрутизацию всего трафика можно также использовать в ситуации, если через виртуальную сеть, например через NAT виртуальных сетей Azure или Брандмауэр Azure, требуется маршрутизировать интернет-трафик.
В браузере снова перейдите к
<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
Ее выполнение может занять до минуты.