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


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

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

Следующие шаги