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


Аутентификация приложений C++ к службам Azure с использованием субъектов-служб во время локальной разработки

Во время локальной разработки приложения должны пройти проверку подлинности в Azure для доступа к различным службам Azure. Два распространённых подхода к локальной проверке подлинности — использовать учётную запись разработчика или служебную учётную запись. В этой статье объясняется, как использовать учетную запись службы приложения. В следующих разделах вы узнаете:

  • Регистрация приложения в Microsoft Entra для создания субъекта-службы
  • Использование групп Microsoft Entra для эффективного управления разрешениями
  • Назначение ролей для разрешений области действия.
  • Аутентификация с помощью учетной записи службы из кода приложения

Использование выделенных субъектов-служб приложений позволяет придерживаться принципа наименьших привилегий при доступе к ресурсам Azure. Разрешения ограничены определенными требованиями приложения во время разработки, предотвращая случайный доступ к ресурсам Azure, предназначенным для других приложений или служб. Этот подход также помогает избежать проблем при перемещении приложения в рабочую среду, гарантируя, что оно не имеет избыточных привилегий в среде разработки.

Схема, показывающая, как локальное приложение C++ использует служебный принципал для подключения к ресурсам Azure.

При регистрации приложения в Azure создается основной объект службы приложения. Для локальной разработки:

  • Создайте отдельную регистрацию приложения для каждого разработчика, работающего над приложением, чтобы гарантировать, что у каждого разработчика есть собственный служебный объект приложения, и избежать необходимости делиться учетными данными.
  • Создайте отдельную регистрацию приложения для каждого приложения, чтобы ограничить разрешения приложения только тем, что необходимо.

Во время локальной разработки переменные среды устанавливаются с использованием идентификатора сервисного принципала приложения. Библиотека удостоверений Azure считывает эти переменные среды для аутентификации приложения к необходимым ресурсам Azure.

Регистрация приложения в Azure

Объекты службы приложений создаются посредством регистрации приложений в Azure с использованием портала Azure или интерфейса командной строки Azure (Azure CLI).

  1. На портале Azure перейдите на страницу регистрации приложений с помощью панели поиска.

  2. На странице Регистрация приложений нажмите кнопку +Создать регистрацию.

  3. На странице Зарегистрировать приложение:

    • В поле Имя введите описательное значение, включающее имя приложения и целевую среду.
    • Для поддерживаемых типов учетных записейвыберите учетные записи только в этом каталоге организации (только клиент Майкрософт — один клиент)или любой вариант, который лучше всего соответствует вашим требованиям.
  4. Выберите Регистрация, чтобы зарегистрировать приложение и создать служебный принципал.

    Снимок экрана, показывающий, как создать регистрацию приложения на портале Azure.

  5. На странице регистрации приложений скопируйте идентификатор приложения (клиента) и идентификатор каталога (клиента) и вставьте их во временное расположение для последующего использования в конфигурациях кода приложения.

  6. Выберите Добавить сертификат или секрет, чтобы установить учетные данные для приложения.

  7. На странице "Сертификаты и секреты" выберите "+ Новый секрет клиента".

  8. На панели, открывающейся для добавления секрета клиента, выполните следующие действия:

    • Для описаниявведите значение Current.
    • Для значения «срок действия», оставьте рекомендуемое значение по умолчанию — 180 дней.
    • Нажмите кнопку "Добавить ", чтобы добавить секрет.
  9. На странице сертификатов & секретов скопируйте свойство значения секрета клиента для использования в следующем шаге.

    Замечание

    Значение секрета клиента отображается только один раз после создания регистрации приложения. Вы можете добавить дополнительные секреты клиента, не отменив этот секрет клиента, но невозможно снова отобразить это значение.

Создание группы Microsoft Entra для локальной разработки

Создайте группу Microsoft Entra, чтобы объединять роли (разрешения), необходимые приложению при локальной разработке, а не назначать роли отдельным объектам службы-принципала. Этот подход обеспечивает следующие преимущества:

  • Каждый разработчик имеет одинаковые роли, назначенные на уровне группы.
  • Если для приложения требуется новая роль, ее необходимо только добавить в группу для приложения.
  • Если новый разработчик присоединяется к команде, для разработчика создается новая учетная запись службы приложений и добавляется в группу, гарантируя, что разработчик имеет необходимые разрешения на работу с приложением.
  1. Перейдите на страницу обзора идентификатора Microsoft Entra на портале Azure.

  2. Выберите все группы в меню слева.

  3. На странице Группы выберите Создать группу.

  4. На странице "Создать группу" заполните следующие поля формы:

    • Тип группы: Выберите безопасность .
    • Имя группы: введите имя группы, которая содержит ссылку на имя приложения или среды.
    • Описание группы: введите описание, объясняющее назначение группы.

    Снимок экрана: создание группы на портале Azure.

  5. Выберите ссылку "Нет участников" в разделе "Участники", чтобы добавить участников в группу.

  6. На открывшейся всплывающей панели найдите созданную ранее основную служебную учетную запись и выберите её из результатов фильтрации. Нажмите кнопку "Выбрать " в нижней части панели, чтобы подтвердить выбор.

  7. Нажмите кнопку "Создать " в нижней части страницы "Создать группу ", чтобы создать группу и вернуться на страницу "Все группы ". Если вы не видите новую группу, подождите минуту и обновите страницу.

Назначьте роли группе

Затем определите, какие роли (разрешения) приложения требуются для ресурсов и назначьте эти роли созданной группе Microsoft Entra. Группы можно назначить роль в ресурсе, группе ресурсов или области подписки. В этом примере показано, как назначать роли в области группы ресурсов, так как большинство приложений группируют все свои ресурсы Azure в одну группу ресурсов.

  1. На портале Azure перейдите на страницу обзора группы ресурсов, содержащей приложение.

  2. Выберите управление доступом (IAM) в левой панели навигации.

  3. На странице управления доступом (IAM) выберите +Добавить , а затем выберите "Добавить назначение ролей " в раскрывающемся меню. Страница "Добавление назначения ролей " предоставляет несколько вкладок для настройки и назначения ролей.

  4. На вкладке "Роль" используйте поле поиска, чтобы найти роль, которую вы хотите назначить. Выберите роль и нажмите кнопку "Далее".

  5. На вкладке "Члены" :

    • Чтобы назначить доступ к значению , выберите "Пользователь", "Группа" или "Субъект-служба ".
    • Для значения "Члены" нажмите кнопку "Выбрать участников ", чтобы открыть панель всплывающего меню "Выбор участников ".
    • Найдите созданную ранее группу Microsoft Entra и выберите ее из отфильтрованных результатов. Выберите команду "Выбрать ", чтобы выбрать группу и закрыть панель всплывающего меню.
    • Выберите Обзор + Назначение внизу вкладки Члены.

    Снимок экрана, показывающий, как назначить роль группе Microsoft Entra.

  6. На вкладке "Обзор и назначение" выберите "Обзор и назначение" в нижней части страницы.

Установите переменные среды приложения

Во время выполнения определенные учетные данные из библиотеки удостоверений Azure, такие как DefaultAzureCredential, EnvironmentCredential и ClientSecretCredential, используются для поиска сведений о субъекте-службы по соглашению в переменных среды. Существует несколько способов настройки переменных среды в зависимости от инструментов и среды. Вы можете создать .env файл или использовать системные переменные среды для хранения этих учетных данных локально во время разработки.

Независимо от выбранного подхода задайте следующие переменные среды для субъекта-службы:

  • AZURE_CLIENT_ID. Используется для идентификации зарегистрированного приложения в Azure.
  • AZURE_TENANT_ID: идентификатор клиента Microsoft Entra.
  • AZURE_CLIENT_SECRET: секретные учетные данные, созданные для приложения.

Для приложений C++ эти переменные среды можно задать несколькими способами. Их можно загрузить из .env файла в коде или настроить их в системной среде. В следующих примерах показано, как задать переменные среды в разных оболочках:

export AZURE_CLIENT_ID=<your-client-id>
export AZURE_TENANT_ID=<your-tenant-id>
export AZURE_CLIENT_SECRET=<your-client-secret>

Авторизация в службах Azure из вашего приложения

Библиотека Azure Identity предлагает различные типы удостоверений — реализации TokenCredential, адаптированные для поддержки различных сценариев и потоков аутентификации Microsoft Entra. Используйте класс ClientSecretCredential при работе с служебными объектами как локально, так и в рабочей среде. В этом сценарии ClientSecretCredential считывает переменные среды AZURE_CLIENT_ID, AZURE_TENANT_ID и AZURE_CLIENT_SECRET, чтобы получить сведения о главном объекте-службе приложения для подключения к Azure.

  1. Добавьте пакет azure-identity-cpp в приложение с помощью vcpkg.

    vcpkg add port azure-identity-cpp
    
  2. Добавьте следующие строки в файл CMake:

    find_package(azure-identity-cpp CONFIG REQUIRED)
    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)
    
  3. Для любого кода C++, создающего клиентский объект Azure SDK в приложении:

    1. Включите azure/identity.hpp заголовок.
    2. Создайте экземпляр ClientSecretCredential.
    3. Передайте экземпляр ClientSecretCredential в конструктор клиента Azure SDK.

    Пример показан в следующем сегменте кода:

    #include <azure/identity.hpp>
    #include <azure/storage/blobs.hpp>
    #include <iostream>
    #include <memory>
    
    // The following environment variables must be set before running the sample.
    // * AZURE_TENANT_ID: Tenant ID for the Azure account.
    // * AZURE_CLIENT_ID: The Client ID to authenticate the request.
    // * AZURE_CLIENT_SECRET: The client secret.
    std::string GetTenantId() { return std::getenv("AZURE_TENANT_ID"); }
    std::string GetClientId() { return std::getenv("AZURE_CLIENT_ID"); }
    std::string GetClientSecret() { return std::getenv("AZURE_CLIENT_SECRET"); }
    
    int main() {
        try {
            // Create a credential - this will automatically read the environment variables
            // AZURE_CLIENT_ID, AZURE_TENANT_ID, and AZURE_CLIENT_SECRET
            auto credential = std::make_shared<Azure::Identity::ClientSecretCredential>(GetTenantId(), GetClientId(), GetClientSecret());
    
            // Create a client for the specified storage account
            std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
    
            // Get a reference to a container
            std::string containerName = "sample-container";
            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
    
            // Get a reference to a blob
            std::string blobName = "sample-blob";
            auto blobClient = containerClient.GetBlobClient(blobName);
    
            // TODO: perform some action with the blob client
            // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
    
            std::cout << "Successfully authenticated and created Azure clients." << std::endl;
    
        } catch (const std::exception& ex) {
            std::cout << "Exception: " << ex.what() << std::endl;
            return 1;
        }
    
        return 0;
    }