Sicherheitsempfehlung: Aktualisieren der Rollenzuweisung für die Microsoft Entra-Authentifizierung

Es wurde ein Sicherheitsfehler entdeckt, der sich auf die Microsoft Entra-Authentifizierung für Immersive Reader auswirkt. Es wird empfohlen, die Berechtigungen für Ihre Immersive Reader-Ressourcen zu ändern.

Hintergrund

Bei der anfänglichen Erstellung Ihrer Immersive Reader-Ressourcen und dem Konfigurieren dieser Ressourcen für die Microsoft Entra-Authentifizierung müssen Sie der Microsoft Entra-Anwendungsidentität Zugriffsberechtigungen für Ihre Immersive Reader-Ressource erteilen. Dies wird als Rollenzuweisung bezeichnet. Für Berechtigungen wurde bislang die Azure-Rolle Cognitive Services-Benutzer verwendet.

Bei einer Sicherheitsüberprüfung wurde festgestellt, dass diese Cognitive Services-Benutzerrolle über die Berechtigung zum Auflisten von Schlüsseln verfügt. Dies ist etwas besorgniserregend, da die Integration des Immersive Readers die Verwendung dieses Microsoft Entra-Zugriffstokens in Client-Web-Apps und Browsern umfasst. Wenn das Zugriffstoken von einem schlechten Akteur oder Angreifer gestohlen wird, besteht die Möglichkeit, dass dieses Zugriffstoken zum list keys für Ihre Immersive Reader-Ressource verwendet werden kann. Wenn ein Angreifer Schlüssel für Ihre Ressource auflisten kann (list keys), gelangt er an den Abonnementschlüssel (Subscription Key) für Ihre Ressource. Der Abonnementschlüssel (Subscription Key) für Ihre Ressource wird als Authentifizierungsmechanismus verwendet und gilt als Geheimnis. Ein Angreifer, der über den Abonnementschlüssel (Subscription Key) der Ressource verfügt, kann gültige und authentifizierte API-Aufrufe an den Endpunkt Ihrer Immersive Reader-Ressource senden, was aufgrund der erhöhten Nutzung und Drosselung Ihres Endpunkts zu Denial-of-Service-Angriffen führen kann. Außerdem würde dadurch die nicht autorisierte Verwendung Ihrer Immersive Reader-Ressource möglich, was zu erhöhten Gebühren auf Ihrer Rechnung führen würde.

In der Praxis ist dieser Angriff oder Exploit jedoch nicht sehr wahrscheinlich oder sogar unmöglich. In Immersive Reader-Szenarien rufen Kunden Microsoft Entra-Zugriffstoken mit der Zielgruppe https://cognitiveservices.azure.com ab. Damit list keys-Vorgänge erfolgreich für Ihre Ressource ausgeführt werden können, muss die Zielgruppe https://management.azure.com für das Microsoft Entra-Zugriffstoken verwendet werden. Dies ist allgemein betrachtet nicht besorgniserregend, da die für Immersive Reader-Szenarien verwendeten Zugriffstoken nicht zum Auflisten von Schlüsseln (list keys) geeignet sind, weil sie nicht über die erforderliche Zielgruppe verfügen. Um die Zielgruppe für das Zugriffstoken zu ändern, müssten Angreifer*innen den Code für den Tokenabruf mittels Hijacking übernehmen und die Zielgruppe ändern, bevor der Aufruf zum Beziehen des Tokens an Microsoft Entra ID gesendet wird. Auch dies ist nicht sehr wahrscheinlich, da Kund*innen als Best Practice für die Immersive Reader-Authentifizierung empfohlen wird, Microsoft Entra-Zugriffstoken nicht im Client oder Browser, sondern im Webanwendungs-Back-End zu erstellen. Da der Tokenabruf in diesen Fällen im Back-End-Dienst erfolgt, ist es nicht sehr wahrscheinlich oder vielleicht sogar unmöglich, dass ein Angreifer diesen Prozess kompromittiert und die Zielgruppe ändert.

Problematisch wird es erst, wenn Kund*innen Token von Microsoft Entra ID direkt im Clientcode abrufen. Davon wird zwar dringend abgeraten, aber da Kunden die Implementierung ganz nach ihren Vorstellungen durchführen können, ist nicht auszuschließen, dass sich einige Kunden für diese Vorgehensweise entscheiden.

Um Bedenken hinsichtlich der Verwendung des Microsoft Entra-Zugriffstokens für list keys-Vorgänge auszuräumen, haben wir eine neue integrierte Azure-Rolle namens Cognitive Services Immersive Reader User erstellt, die nicht über list keys-Berechtigungen verfügt. Im Gegensatz zur Rolle Cognitive Services User ist diese neue Rolle keine gemeinsam genutzte Rolle für die Azure KI Services-Plattform. Bei der neuen Rolle handelt es sich um eine spezifische Rolle für Immersive Reader, die nur Aufrufe für Immersive Reader-APIs zulässt.

Wir empfehlen ALLEN Kunden, die neue Cognitive Services Immersive Reader User-Rolle anstelle der ursprünglichen Cognitive Services User-Rolle zu verwenden. Weiter unten finden Sie ein Skript, das Sie für jede Ihrer Ressourcen ausführen können, um die Rollenzuweisungsberechtigungen umzustellen.

Diese Empfehlung gilt für ALLE Kunden, um sicherzustellen, dass dieses Sicherheitsrisiko für alle gepatcht wird – unabhängig vom Implementierungsszenario oder von der Wahrscheinlichkeit eines Angriffs.

Wenn Sie diese Umstellung NICHT durchführen, funktioniert trotzdem alles weiter wie gewohnt. Die alte Rolle kann weiterhin verwendet werden. Die Sicherheitsauswirkungen sind für die meisten Kunden minimal. Es wird jedoch empfohlen, zu der neuen Rolle zu migrieren, um die Sicherheitsbedenken auszuräumen. Die Anwendung dieses Updates ist eine Sicherheitsempfehlung und nicht zwingend erforderlich.

Bei allen Immersive Reader-Ressourcen, die mit unserem Skript unter Erstellen einer Plastischer Reader-Ressource und Konfigurieren der Azure Active Directory-Authentifizierung neu erstellt werden, wird automatisch die neue Rolle verwendet.

Aktualisieren der Rolle und Rotieren Ihrer Abonnementschlüssel

Wenn Sie vor Februar 2022 gemäß der Anleitung unter Erstellen einer Plastischer Reader-Ressource und Konfigurieren der Azure Active Directory-Authentifizierung eine Immersive Reader-Ressource erstellt und konfiguriert haben, wird empfohlen, den folgenden Vorgang auszuführen, um die Rollenzuweisungsberechtigungen für ALLE Ihre Immersive Reader-Ressourcen zu aktualisieren. Der Vorgang umfasst das Ausführen eines Skripts zum Aktualisieren der Rollenzuweisung für eine einzelne Ressource. Wenn Sie über mehrere Ressourcen verfügen, muss das Skript jeweils einmal für jede Ressource ausgeführt werden.

Nachdem Sie die Rolle mithilfe des folgenden Skripts aktualisiert haben, wird außerdem empfohlen, die Abonnementschlüssel für die Ressource zu rotieren. Dies gilt für den Fall, dass die Schlüssel durch den Exploit kompromittiert wurden und jemand die Ressource mit Abonnementschlüsselauthentifizierung ohne Ihre Einwilligung verwendet. Durch Rotieren der Schlüssel werden die vorherigen Schlüssel ungültig und weitere Zugriffe verweigert. Bei Kunden, die die Microsoft Entra-Authentifizierung verwenden (gemäß Implementierung des aktuellen Immersive Reader SDK sollten dies alle sein), hat das Rotieren der Schlüssel keine Auswirkungen auf den Immersive Reader-Dienst, da die Authentifizierung über Microsoft Entra-Zugriffstoken erfolgt, nicht per Abonnementschlüssel. Das Rotieren der Abonnementschlüssel ist nur eine weitere Vorsichtsmaßnahme.

Sie können die Abonnementschlüssel im Azure-Portal rotieren. Navigieren Sie zu der betreffenden Ressource und dann zum Abschnitt Keys and Endpoint. Oben befinden sich die Schaltflächen Regenerate Key1 und Regenerate Key2.

Screenshot of the Azure portal showing an Immersive Reader resource with the Keys and Endpoint section selected, which shows the Regenerate Keys buttons at the top.

Verwenden von Azure PowerShell zum Aktualisieren Ihrer Rollenzuweisung

  1. Öffnen Sie als Erstes die Azure Cloud Shell. Stellen Sie in der Dropdownliste oben links oder durch Eingabe von pwsh sicher, dass Cloud Shell auf PowerShell festgelegt ist.

  2. Kopieren Sie den folgenden Codeausschnitt, und fügen Sie ihn in die Shell ein.

    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. Führen Sie die Funktion „Update-ImmersiveReaderRoleAssignment“ aus, und ersetzen Sie den „<PARAMETER_VALUES>“-Platzhalter durch Ihre eigenen Werte.

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

    Der vollständige Befehl sieht in etwa wie folgt aus. Hier wurde jeder Parameter aus Gründen der Übersichtlichkeit in eine eigene Zeile eingefügt, damit Sie den gesamten Befehl sehen können. Kopieren oder verwenden Sie diesen Befehl nicht unverändert. Kopieren Sie den Befehl mit Ihren eigenen Werten, und verwenden Sie ihn erst dann. Dieses Beispiel enthält Pseudowerte für <PARAMETER_VALUES>. Ihre unterscheiden sich davon, da Sie eigene Namen für diese Werte verwenden.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    Parameter Kommentare
    SubscriptionName Der Name Ihres Azure-Abonnements.
    ResourceGroupName Der Name der Ressourcengruppe, die Ihre Immersive Reader-Ressource enthält.
    Ressourcenname Der Name Ihrer Immersive Reader-Ressource.
    AADAppIdentifierUri Dabei handelt es sich um den URI für Ihre Microsoft Entra-App.

Nächster Schritt