Защита маркеров обновления потока On-Behalf-Of OAuth 2.0 для веб-служб

Azure CLIs
Azure DevOps
Функции Azure
Azure Key Vault
Azure Pipelines

При разработке веб-служб может потребоваться получить маркеры с помощью потока OAuth 2.0 On-Behalf-Of (OBO). Поток OBO используется в том случае, когда приложение вызывает API службы или веб-API, который, в свою очередь, должен вызывать другой API службы или веб-API. OBO распространяет делегированное удостоверение пользователя и разрешения с помощью цепочки запросов. Если приложению требуется использовать маркеры доступа и обновления в течение неограниченного срока, как правило, это происходит в сценариях с автономным доступом, крайне важно обеспечить безопасное хранение маркеров обновления.

Предупреждение

Тщательно рассмотрите риск и ответственность, связанные с хранением любых маркеров безопасности, так как эти маркеры могут предоставить злоумышленнику доступ к ресурсам, защищенным идентификатором Microsoft Entra организации. Нарушение безопасности приложения, предназначенного для учетных записей в любом каталоге организации (любой каталог Microsoft Entra — Multitenant), может быть особенно катастрофическим.

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

При необходимости можно отозвать маркеры обновления, если они будут скомпрометированы.

Потенциальные варианты использования

Это решение использует Azure Key Vault, Функции Azure и Azure DevOps для безопасного обновления и хранения маркеров обновления OBO.

Архитектура

Схема, показывающая процессы обновления ключа и маркера.

Скачайте файл Visio для этой архитектуры.

Поток данных

  • Azure Key Vault содержит ключи шифрования секретов для каждого клиента Идентификатора Microsoft Entra.
  • Функция, активируемая с помощью таймера Функций Azure, получает последний секретный ключ из Key Vault. Другая функция Функций Azure извлекает маркер обновления из платформы удостоверений Майкрософт и сохраняет его с последней версией секретного ключа.
  • База данных хранит последний зашифрованный ключ и непрозрачные данные.
  • Конвейер непрерывной поставки Azure DevOps контролирует и синхронизирует процессы смены секретов и обновления маркеров.

Azure Pipelines — это удобное место для добавления стратегии смены ключей, если вы уже используете конвейеры для модели "инфраструктура как код" (IaC) или непрерывную интеграцию и поставку (CI/CD). Не нужно использовать Azure Pipelines, если вы ограничиваете пути для настройки и извлечения секретов.

Примените следующую политику, чтобы разрешить субъекту-службе для подключения к службе Azure DevOps задавать секреты в Key Vault. Замените переменные <Key Vault Name> и <Service Connection Principal> на значения для вашей среды.

az keyvault set-policy --name $<Key Vault Name> --spn $<Service Connection Principal> --secret-permissions set

После настройки Azure Pipelines для создания и обновления ключей можно запланировать периодическое выполнение конвейера. Конвейер обновляет секрет Key Vault для синхронизации со сменой ключей и сохраняет зашифрованный маркер в новой версии секрета. Дополнительные сведения см. в разделе Настройка расписаний для конвейеров.

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

Предпочтительный способ доступа к Key Vault для службы Azure, например для Функций Azure, — использование управляемого удостоверения службы. Вы можете предоставить доступ через портал Azure, Azure CLI или с помощью шаблона Azure Resource Manager (шаблона ARM) для сценариев IaC.

Портал Azure

На портале Azure добавьте политику доступа Key Vault, чтобы разрешить идентификатору объекта управляемого удостоверения в Функциях Azure получать и задавать секреты. Дополнительные сведения см. в статьях Добавление назначенного системой удостоверения и Использование ссылок Key Vault для Службы приложений и Функций Azure.

Снимок экрана: включение управляемого удостоверения в портал Azure.

Azure CLI

Политику Azure Key Vault можно также задать с помощью Azure CLI:

az keyvault set-policy --name $<Key Vault Name> --spn $<Service Connection Principal> --secret-permissions set
az keyvault set-policy --name $<Key Vault Name> --spn $<Managed Identity Principal> --secret-permissions get

Шаблон ARM

Следующий шаблон ARM предоставляет Функциям Azure доступ к Azure Key Vault. Замените переменные *** на значения для вашей среды.

{
  "type": "Microsoft.KeyVault/vaults",
  "apiVersion": "2019-09-01",
  "name": "***",
  "location": "***",
  "properties": {
    "sku": {
      "family": "A",
      "name": "standard"
    },
    "tenantId": "***",
    "enableSoftDelete": true,
    "enabledForDeployment": false,
    "enabledForTemplateDeployment": false,
    "enabledForDiskEncryption": false,
    "accessPolicies": [
      {
        "tenantId": "***",
        "objectId": "<Managed Identity Principal>",
        "permissions": {
          "secrets": [
            "get"
          ]
        }
      },
      {
        "tenantId": "***",
        "objectId": "<Service Connection Principal>",
        "permissions": {
          "secrets": [
            "set"
          ]
        }
      }
    ]
  }
}

Хранилище маркеров

Для хранения маркеров в зашифрованном виде можно использовать любую базу данных. На следующей схеме показана последовательность для сохранения маркеров обновления в базе данных:

Схема, показывющая последовательность маркеров добавления.

Последовательность содержит две функции: userId() и secretId(). Эти функции можно определить как сочетание token.oid, token.tid и token.sub. Дополнительные сведения см. в разделе Использование id_token.

С помощью криптографического ключа, хранящегося в качестве секрета, можно найти последнюю версию ключа в Azure Key Vault.

Использование маркеров

Использовать ключ очень просто. Следующая последовательность запрашивает ключ на основе последней версии ключа.

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

Обновление маркера происходит независимо от функции DoWork, поэтому Функции Azure могут выполнять DoWork и асинхронное обновление маркера с помощью Устойчивых функций. Дополнительные сведения о функциях, активируемых HTTP, с Устойчивыми функциями см. в разделе Функции HTTP.

Не рекомендуется использовать Azure Key Vault в конвейере HTTP-запросов, поэтому по возможности кэшируйте ответы. В этом примере ответ Key Vault на вызов getSecret(secretId, secretVersion) можно кэшировать.

Смена ключей и обновление маркера

Секретный ключ можно менять одновременно с обновлением маркера обновления, чтобы последний маркер шифровался с помощью последней версии секрета шифрования. Этот процесс использует встроенную поддержку Функций Azure для триггеров таймера. Дополнительные сведения см. в статье Триггер таймера для Функций Azure.

На следующей схеме последовательности показан процесс синхронизации обновления маркера со сменой ключа:

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

Управление пользователями и доступом

платформа удостоверений Майкрософт предоставляет возможность отзыва маркеров обновления в случае компрометации. См. разделы Отзыв маркера и Revoke-AzureADUserAllRefreshToken.

Примечание.

Модули Azure AD и MSOnline PowerShell устарели с 30 марта 2024 г. Дополнительные сведения см. в обновлении об отмене. После этой даты поддержка этих модулей ограничена поддержкой миграции в пакет SDK Для Microsoft Graph PowerShell и исправления безопасности. Устаревшие модули будут продолжать функционировать до 30 марта 2025 года.

Рекомендуется перенести в Microsoft Graph PowerShell для взаимодействия с идентификатором Microsoft Entra (ранее — Azure AD). Часто задаваемые вопросы о миграции см. в разделе "Вопросы и ответы о миграции". Примечание. Версии 1.0.x MSOnline могут возникнуть сбоем после 30 июня 2024 г.

Чтобы удалить пользователя из идентификатора Microsoft Entra, просто удалите запись пользователя. Чтобы удалить доступ к приложению для пользователя, удалите часть refreshToken в данных пользователя.

Чтобы удалить доступ для группы пользователей, например всех пользователей в целевом клиенте, можно использовать Azure Pipelines для удаления секрета группы на основе secretId().

Соавторы

Эта статья поддерживается корпорацией Майкрософт. Первоначально он был написан следующими участниками.

Автор субъекта:

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