Уведомление о безопасности: обновление назначения ролей для аутентификации Microsoft Entra.

Обнаружена ошибка безопасности, которая влияет на проверку подлинности Microsoft Entra для Иммерсивного средства чтения. Мы советуем изменить разрешения для ресурсов Иммерсивного средства чтения.

Общие сведения

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

Во время аудита безопасности было обнаружено, что эта роль пользователя Cognitive Services имеет разрешения на перечисление ключей. Это немного вызывает беспокойство, так как интеграции с "Иммерсивным средством чтения" включают использование этого маркера доступа Microsoft Entra в клиентских веб-приложениях и браузерах. Если маркер доступа был украден злоумышленником, возникает озабоченность по поводу того, что этот маркер доступа может использоваться list keys для ресурса Immersive Reader. Если злоумышленник сможет выполнить операцию list keys для вашего ресурса, он получит объект Subscription Key для вашего ресурса. Элемент Subscription Key вашего ресурса используется в качестве механизма аутентификации и считается секретом. Если злоумышленник получит объект Subscription Key ресурса, это позволит ему выполнять допустимые и прошедшие проверку подлинности вызовы API к конечной точке ресурса в Immersive Reader, что может вызвать отказ в обслуживании из-за увеличения объемов использования и применения регулирования в конечной точке. При этом также будет возможно незаконное использование ресурса Иммерсивного средства чтения, что может привести к увеличению расходов по вашему счету.

На практике, однако, эта атака или эксплойт, скорее всего, не возникает или даже не может быть возможно. Для сценариев средства иммерсивного чтения клиенты получают токены доступа Microsoft Entra с аудиториейhttps://cognitiveservices.azure.com. Чтобы обеспечить успешное использование list keys ресурса, маркер доступа Microsoft Entra должен иметь аудиторию https://management.azure.com. Как правило, это не вызывает особого беспокойства, так как маркеры доступа, используемые для сценариев Immersive Reader, не будут работать с list keys, поскольку у них нет требуемой аудитории. Чтобы изменить аудиторию токена доступа, злоумышленнику придется захватить код получения токена и изменить аудиторию перед вызовом в Microsoft Entra ID для получения токена. Опять же, это вряд ли будет использоваться, потому что, как лучшую практику проверки подлинности для Иммерсивного средства чтения, мы советуем клиентам создавать токены доступа Microsoft Entra на серверной части веб-приложения, а не на клиентской части или в браузере. В таких случаях, поскольку получение токена происходит на серверной службе, маловероятно или, возможно, даже невозможно, что злоумышленник сможет скомпрометировать этот процесс и изменить аудиторию.

Реальная проблема возникает, если или когда какой-либо клиент будет получать токены из Microsoft Entra ID напрямую в клиентском коде. Мы настоятельно не рекомендуем это, но, так как клиенты могут реализовать так, как считают нужным, возможно, что некоторые клиенты так поступают.

Чтобы снять опасения по поводу возможности использования маркера доступа Microsoft Entra для list keys, мы создали новую встроенную роль Azure под названием Cognitive Services Immersive Reader User, которая не имеет разрешений на list keys. Эта новая роль не является совместно используемой ролью для платформы служб искусственного интеллекта Azure, как это делает роль Cognitive Services User. Эта новая роль предназначена для Иммерсивного средства чтения и разрешает только вызовы к API этого средства.

Мы советуем всем клиентам использовать новую Cognitive Services Immersive Reader User роль вместо исходной Cognitive Services User роли. Ниже приводится скрипт, с помощью которого в каждом из ресурсов можно изменить разрешения для назначения роли.

Эта рекомендация применяется ко ВСЕМ заказчикам и позволяет гарантировать, что данная уязвимость будет исправлена во всех случаях, независимо от сценария реализации или вероятности атаки.

Если вы НЕ СДЕЛАЕТЕ этого, ничего не нарушится. Старая роль будет по-прежнему работать. Влияние на безопасность для большинства заказчиков минимально. Однако мы советуем перейти на новую роль, чтобы устранить проблемы безопасности, рассмотренные. Применение этого обновления — это рекомендация по обеспечению безопасности; это не мандат.

Все новые ресурсы Иммерсивного средства чтения, создаваемые с помощью нашего скрипта на Как создать ресурс для Иммерсивного средства чтения, автоматически используют новую роль.

Обновление роли и смена ключей подписки

Если вы создали и настроили ресурс Иммерсивный Ридер, используя инструкции, указанные в разделе Как создать ресурс Иммерсивного Ридера до февраля 2022 года, мы советуем выполнить следующую операцию, чтобы обновить разрешения на назначение ролей для всех ваших ресурсов Иммерсивного Ридера. Эта операция предусматривает запуск скрипта для обновления назначения роли для одного ресурса. При наличии нескольких ресурсов запустите этот скрипт по одному разу для каждого ресурса.

После обновления роли с помощью следующего скрипта мы также советуем сменить ключи подписки на ресурс. Это в случае, если ваши ключи были скомпрометированы эксплойтом, и кто-то фактически использует ресурс с проверкой подлинности ключа подписки без вашего согласия. Поворот ключей делает предыдущие ключи недействительными и запрещает дальнейший доступ. Для клиентов, использующих аутентификацию Microsoft Entra, которая должна использоваться всеми в текущей реализации пакета SDK для Immersive Reader, смена ключей не влияет на службу Immersive Reader, так как для аутентификации используются токены доступа Microsoft Entra, а не ключ подписки. Смена ключей подписки — это просто дополнительная мера предосторожности.

Вы можете обновить ключи подписки в портале Azure. Перейдите к своему ресурсу, а затем в раздел Keys and Endpoint. В верхней части представлены кнопки Regenerate Key1 и Regenerate Key2.

Скриншот портала Azure с выбранным ресурсом «Интерактивный инструмент для чтения» и разделом «Ключи и конечная точка», на котором в верхней части экрана отображаются кнопки восстановления ключей.

Обновление назначения ролей с помощью Azure PowerShell

  1. Для начала откройте Azure Cloud Shell. Проверьте, задано ли для Cloud Shell значение PowerShell в раскрывающемся списке в верхнем левом углу или путем ввода pwsh.

  2. Скопируйте следующий фрагмент кода и вставьте его в оболочку.

    function Update-ImmersiveReaderRoleAssignment(
        [Parameter(Mandatory=$true, Position=0)] [String] $SubscriptionName,
        [Parameter(Mandatory=$true)] [String] $ResourceGroupName,
        [Parameter(Mandatory=$true)] [String] $ResourceName,
        [Parameter(Mandatory=$true)] [String] $AADAppIdentifierUri
    )
    {
        $unused = ''
        if (-not [System.Uri]::TryCreate($AADAppIdentifierUri, [System.UriKind]::Absolute, [ref] $unused)) {
            throw "Error: AADAppIdentifierUri must be a valid URI"
        }
    
        Write-Host "Setting the active subscription to '$SubscriptionName'"
        $subscriptionExists = Get-AzSubscription -SubscriptionName $SubscriptionName
        if (-not $subscriptionExists) {
            throw "Error: Subscription does not exist"
        }
        az account set --subscription $SubscriptionName
    
        # Get the Immersive Reader resource 
        $resourceId = az cognitiveservices account show --resource-group $ResourceGroupName --name $ResourceName --query "id" -o tsv
        if (-not $resourceId) {
            throw "Error: Failed to find Immersive Reader resource"
        }
    
        # Get the Microsoft Entra application service principal
        $principalId = az ad sp show --id $AADAppIdentifierUri --query "objectId" -o tsv
        if (-not $principalId) {
            throw "Error: Failed to find Microsoft Entra application service principal"
        }
    
        $newRoleName = "Cognitive Services Immersive Reader User"
        $newRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $newRoleName --query "[].id" -o tsv
        if ($newRoleExists) {
            Write-Host "New role assignment for '$newRoleName' role already exists on resource"
        } 
        else {
            Write-Host "Creating new role assignment for '$newRoleName' role"
            $roleCreateResult = az role assignment create --assignee $principalId --scope $resourceId --role $newRoleName
            if (-not $roleCreateResult) {
                throw "Error: Failed to add new role assignment"
            }
            Write-Host "New role assignment created successfully"
        }
    
        $oldRoleName = "Cognitive Services User"
        $oldRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $oldRoleName --query "[].id" -o tsv
        if (-not $oldRoleExists) {
            Write-Host "Old role assignment for '$oldRoleName' role does not exist on resource"
        }
        else {
            Write-Host "Deleting old role assignment for '$oldRoleName' role"
            az role assignment delete --assignee $principalId --scope $resourceId --role $oldRoleName
            $oldRoleExists = az role assignment list --assignee $principalId --scope $resourceId --role $oldRoleName --query "[].id" -o tsv
            if ($oldRoleExists) {
                throw "Error: Failed to delete old role assignment"
            }
            Write-Host "Old role assignment deleted successfully"
        }
    }
    
  3. Запустите функцию Update-ImmersiveReaderRoleAssignment, заменив заполнители <PARAMETER_VALUES> на собственные значения, если это необходимо.

    Update-ImmersiveReaderRoleAssignment -SubscriptionName '<SUBSCRIPTION_NAME>' -ResourceGroupName '<RESOURCE_GROUP_NAME>' -ResourceName '<RESOURCE_NAME>' -AADAppIdentifierUri '<MICROSOFT_ENTRA_APP_IDENTIFIER_URI>'
    

    Полная команда выглядит примерно так: Здесь мы помещаем каждый параметр в собственную строку для ясности, чтобы увидеть всю команду. Не копируйте или не используйте эту команду как есть. Скопируйте и используйте команду с собственными значениями. В этом примере имеются фиктивные значения для <PARAMETER_VALUES>. Ваши будут отличаться, так как вы придумываете свои собственные имена для этих значений.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    Параметр Комментарии
    ИмяПодписки Название подписки Azure.
    ИмяГруппыРесурсов Имя группы ресурсов, содержащей ресурс Иммерсивное средство чтения.
    ИмяРесурса Имя ресурса в Иммерсивном режиме чтения.
    Идентификатор URI приложения AAD Универсальный код ресурса (URI) для приложения Microsoft Entra.

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