Учебник. Безопасное подключение к службе Cognitive Services из Службы приложений .NET с использованием Key Vault
Служба приложений Azure может использовать управляемые удостоверения для подключения к внутренним службам без строки подключения, что избавляет от необходимости управлять секретами подключения и обеспечивает безопасность внутренних соединений в рабочей среде. Для внутренних служб, которые не поддерживают управляемые удостоверения и по-прежнему требуют использования секретов подключения, этими секретами можно управлять с помощью Key Vault. В этом руководстве службы ИИ Azure используются в качестве примера, чтобы показать, как это делается на практике. По завершении у вас есть приложение, которое выполняет программные вызовы к службам ИИ Azure, не сохраняя секреты подключения в Служба приложений.
Совет
Службы искусственного интеллекта Azure поддерживают проверку подлинности с помощью управляемых удостоверений, но в этом руководстве используется проверка подлинности ключа подписки, чтобы продемонстрировать, как можно подключиться к службе Azure, которая не поддерживает управляемые удостоверения из Служба приложений.
С этой архитектурой:
- Подключение к Key Vault защищено управляемыми удостоверениями.
- Служба приложений обращается к секретам, используя ссылки Key Vault в качестве параметров приложения.
- Доступ к хранилищу ключей открыт только приложению. Участники приложений, например администраторы, могут полностью управлять ресурсами Службы приложений, но в то же время у них нет доступа к секретам Key Vault.
- Если код приложения уже обращается к секретам подключения с использованием параметров приложения, никакое изменение не требуется.
Освещаются следующие темы:
- Включение управляемых удостоверений
- Использование управляемых удостоверений для подключения к Key Vault
- Использование возможностей Key Vault
- Доступ к службам ИИ Azure
Необходимые компоненты
Подготовьте среду к работе с Azure CLI.
Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.
Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.
Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
Создание приложения с подключением к службам ИИ Azure
Создайте группу ресурсов для хранения всех ресурсов:
# Save resource group name as variable for convenience groupName=myKVResourceGroup region=westeurope az group create --name $groupName --location $region
Создайте ресурс служб ИИ Azure. Замените текст <cs-resource-name> произвольным уникальным именем.
# Save resource name as variable for convenience. csResourceName=<cs-resource-name> az cognitiveservices account create --resource-group $groupName --name $csResourceName --location $region --kind TextAnalytics --sku F0 --custom-domain $csResourceName
Примечание.
--sku F0
создает ресурс служб искусственного интеллекта Azure бесплатного уровня. Для каждой подписки установлена квота в один бесплатный ресурсTextAnalytics
. Если вы уже израсходовали эту квоту, используйте--sku S
.
Настройка приложения .NET
Клонируйте пример репозитория локально и разверните пример приложения в Службе приложений. Замените <app-name> уникальным именем.
# Save app name as variable for convenience
appName=<app-name>
# Clone sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/dotnet
az webapp up --sku F1 --resource-group $groupName --name $appName --plan $appName --location $region
Настройка секретов в качестве параметров приложения
Настройте секреты
CS_ACCOUNT_NAME
служб ИИ Azure в качестве параметров приложения иCS_ACCOUNT_KEY
.# Get subscription key for Cognitive Services resource csKey1=$(az cognitiveservices account keys list --resource-group $groupName --name $csResourceName --query key1 --output tsv) az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="$csResourceName" CS_ACCOUNT_KEY="$csKey1"
В браузере перейдите к развернутому приложению на странице
<app-name>.azurewebsites.net
и проверьте работу алгоритма распознавания языков со строками на разных языках.В коде приложения можно заметить, что выходные данные отладки с результатами обнаружения набраны шрифтом с цветом, который совпадает с цветом фона. Это можно увидеть, попытавшись выделить пустое место непосредственно под результатом.
Защита внутреннего подключения
В настоящее время секреты подключения хранятся в приложении Службы приложений в качестве параметров приложения. Этот подход сам по себе защищает секреты подключения от просмотра из кода приложения. Однако любой участник, способный управлять приложением, может увидеть и его параметры. На этом шаге мы переместим секреты подключения в хранилище ключей и заблокируем доступ таким образом, чтобы только мы могли им управлять и чтобы секреты могло прочитать только приложение Службы приложений с помощью управляемого удостоверения.
Создайте хранилище ключей. Замените текст <vault-name> уникальным именем.
# Save app name as variable for convenience vaultName=<vault-name> az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
Параметр
--enable-rbac-authorization
устанавливает управление доступом на основе ролей Azure (RBAC) в качестве модели разрешений. По умолчанию этот параметр делает недействительными все политики доступа.Предоставьте себе роль RBAC Специалист по секретам хранилища ключей для хранилища.
vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv) myId=$(az ad signed-in-user show --query id --output tsv) az role assignment create --role "Key Vault Secrets Officer" --assignee-object-id $myId --assignee-principal-type User --scope $vaultResourceId
Включите для своего приложения управляемое системой удостоверение и присвойте ему роль RBAC Пользователь секретов хранилища ключей для хранилища.
az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role "Key Vault Secrets User"
Добавьте имя ресурса служб ИИ Azure и ключ подписки в качестве секретов в хранилище и сохраните их идентификаторы в качестве переменных среды для следующего шага.
csResourceKVUri=$(az keyvault secret set --vault-name $vaultName --name csresource --value $csResourceName --query id --output tsv) csKeyKVUri=$(az keyvault secret set --vault-name $vaultName --name cskey --value $csKey1 --query id --output tsv)
Ранее секреты были заданы как параметры приложения
CS_ACCOUNT_NAME
иCS_ACCOUNT_KEY
в приложении. Теперь их нужно задать в качестве ссылок на хранилище ключей.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)"
Откройте браузер и снова перейдите по адресу
<app-name>.azurewebsites.net
. Если вы получите результаты обнаружения обратно, вы подключаетесь к конечной точке служб искусственного интеллекта Azure с ссылками на хранилище ключей.
Поздравляем, ваше приложение теперь подключается к службам ИИ Azure, используя секреты, которые хранятся в хранилище ключей без каких-либо изменений в коде приложения.
Очистка ресурсов
На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов, выполнив следующую команду в Cloud Shell:
az group delete --name $groupName
Ее выполнение может занять до минуты.