Поделиться через


Руководство. Изоляция внутреннего взаимодействия в Azure App Service с интеграцией Virtual Network

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

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

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

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

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

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

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

Предпосылки

В этом руководстве предполагается, что вы выполнили Tutorial: безопасное подключение к Cognitive Service из службы приложений через Key Vault и создали приложение для определения языка.

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

    groupName=myKVResourceGroup
    region=westeurope
    csResourceName=<cs-resource-name>
    appName=<app-name>
    vaultName=<vault-name>
    planName=<plan-name>
    csResourceKVUri=<cs-resource-kv-uri>
    csKeyKVUri=<cs-key-kv-uri>

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

  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 --private-endpoint-network-policies Enabled
    

    Для службы приложений подсеть интеграции виртуальной сети рекомендуется иметь блок /26 CIDR как минимум (см. требования к подсети интеграции виртуальной сети). Варианта /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 и службы Azure AI будут находиться за частными конечными точками , необходимо определить частные DNS зоны . Эти зоны используются для размещения записей DNS для частных конечных точек и позволяют клиентам находить внутренние службы по имени.

  1. Создайте две частные зоны DNS, одну для ресурса Azure AI 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. В подсети частной конечной точки вашей виртуальной сети создайте частную конечную точку для вашего Когнитивного Сервиса.

    # 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 AI services.

    az rest --uri $csResourceId?api-version=2024-10-01 --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 AI services через общую сеть.

  4. Повторите описанные выше действия для Key Vault.

    # 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 $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 Virtual Network NAT или Azure Firewall.

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

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

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

az group delete --name $groupName

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

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