Учебник. Безопасное подключение к службе 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

  1. Создайте группу ресурсов для хранения всех ресурсов:

    # Save resource group name as variable for convenience
    groupName=myKVResourceGroup
    region=westeurope
    
    az group create --name $groupName --location $region
    
  2. Создайте ресурс служб ИИ 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

Настройка секретов в качестве параметров приложения

  1. Настройте секреты служб ИИ Azure в качестве параметров CS_ACCOUNT_NAME приложения и 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"
    
  2. В браузере перейдите к развернутому приложению на странице <app-name>.azurewebsites.net и проверьте работу алгоритма распознавания языков со строками на разных языках.

    Снимок экрана: развернутое приложение распознавания языков в Службе приложений.

    В коде приложения можно заметить, что выходные данные отладки с результатами обнаружения набраны шрифтом с цветом, который совпадает с цветом фона. Это можно увидеть, попытавшись выделить пустое место непосредственно под результатом.

Защита внутреннего подключения

В настоящее время секреты подключения хранятся в приложении Службы приложений в качестве параметров приложения. Этот подход сам по себе защищает секреты подключения от просмотра из кода приложения. Однако любой участник, способный управлять приложением, может увидеть и его параметры. На этом шаге мы переместим секреты подключения в хранилище ключей и заблокируем доступ таким образом, чтобы только мы могли им управлять и чтобы секреты могло прочитать только приложение Службы приложений с помощью управляемого удостоверения.

  1. Создать хранилище ключей. Замените <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) в качестве модели разрешений. По умолчанию этот параметр делает недействительными все политики доступа.

  2. Предоставьте себе роль 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
    
  3. Включите для своего приложения управляемое системой удостоверение и присвойте ему роль RBAC Пользователь секретов хранилища ключей для хранилища.

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. Добавьте имя ресурса служб ИИ 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)
    
  5. Ранее секреты были заданы как параметры приложения 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)"
    
  6. Откройте браузер и снова перейдите по адресу <app-name>.azurewebsites.net. Если вы возвращаете результаты обнаружения, вы подключаетесь к конечной точке служб ИИ Azure со ссылками на хранилище ключей.

Поздравляем! Теперь ваше приложение подключается к службам ИИ Azure с помощью секретов, хранящихся в хранилище ключей, без каких-либо изменений в коде приложения.

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

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

az group delete --name $groupName

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

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