Porady dotyczące zabezpieczeń: Aktualizowanie przypisania roli na potrzeby uwierzytelniania firmy Microsoft Entra

Wykryto usterkę zabezpieczeń, która ma wpływ na uwierzytelnianie firmy Microsoft dla Czytnik immersyjny. Zalecamy zmianę uprawnień dotyczących zasobów Czytnik immersyjny.

Tło

Podczas początkowego tworzenia zasobów Czytnik immersyjny i konfigurowania ich na potrzeby uwierzytelniania w usłudze Microsoft Entra należy udzielić uprawnień tożsamości aplikacji Microsoft Entra w celu uzyskania dostępu do zasobu Czytnik immersyjny. Jest to nazywane przypisaniem roli. Rola platformy Azure, która była wcześniej używana do uprawnień, to rola użytkownika usług Cognitive Services.

Podczas inspekcji zabezpieczeń wykryto, że ta rola użytkownika usług Cognitive Services ma uprawnienia do wyświetlania listy kluczy. Jest to nieco niepokojące, ponieważ Czytnik immersyjny integracje obejmują korzystanie z tego tokenu dostępu firmy Microsoft Entra w aplikacjach internetowych i przeglądarkach klienckich. Jeśli token dostępu został skradziony przez złego aktora lub osobę atakującą, istnieje obawa, że ten token dostępu może służyć do list keys Czytnik immersyjny zasobu. Jeśli osoba atakująca może list keys uzyskać zasób, uzyska Subscription Key go dla Zasobu. Element Subscription Key dla zasobu jest używany jako mechanizm uwierzytelniania i jest uznawany za wpis tajny. Gdyby osoba atakująca miała zasób Subscription Key, umożliwiłoby im to wykonywanie prawidłowych i uwierzytelnionych wywołań interfejsu API do punktu końcowego zasobu Czytnik immersyjny, co może prowadzić do odmowy usługi z powodu zwiększonego użycia i ograniczenia przepustowości w punkcie końcowym. Umożliwiłoby to również nieautoryzowane użycie zasobu Czytnik immersyjny, co doprowadziłoby do zwiększenia opłat na rachunku.

W praktyce jednak ten atak lub wykorzystanie prawdopodobnie nie wystąpi lub nawet nie będzie możliwe. W przypadku scenariuszy Czytnik immersyjny klienci uzyskują tokeny dostępu firmy Microsoft entra z odbiorcami https://cognitiveservices.azure.comprogramu . Aby pomyślnie list keys uzyskać zasób, token dostępu firmy Microsoft Entra musi mieć odbiorców https://management.azure.comprogramu . Ogólnie rzecz biorąc, nie jest to bardzo istotne, ponieważ tokeny dostępu używane w scenariuszach Czytnik immersyjny nie będą działać w list keyssystemie, ponieważ nie mają wymaganej grupy odbiorców. Aby zmienić odbiorców tokenu dostępu, osoba atakująca musiałaby przejąć kod pozyskiwania tokenu i zmienić odbiorców przed wykonaniem wywołania do identyfikatora Microsoft Entra w celu uzyskania tokenu. Ponownie nie jest to możliwe, ponieważ jako najlepsze rozwiązanie Czytnik immersyjny uwierzytelniania zaleca się, aby klienci tworzyli tokeny dostępu firmy Microsoft Entra w zapleczu aplikacji internetowej, a nie w kliencie lub przeglądarce. W takich przypadkach, ponieważ pozyskiwanie tokenu odbywa się w usłudze zaplecza, nie jest tak prawdopodobne, czy nawet możliwe, że osoba atakująca może naruszyć ten proces i zmienić odbiorców.

Prawdziwym problemem jest to, kiedy lub jeśli jakikolwiek klient miał uzyskać tokeny z identyfikatora Entra firmy Microsoft bezpośrednio w kodzie klienta. Zdecydowanie radzimy sobie z tym, ale ponieważ klienci są wolni do wdrożenia w miarę dopasowania, istnieje możliwość, że niektórzy klienci to robią.

Aby wyeliminować obawy dotyczące możliwości korzystania z tokenu dostępu firmy Microsoft Entra do list keysusługi , utworzyliśmy nową wbudowaną rolę platformy Azure o nazwie Cognitive Services Immersive Reader User , która nie ma uprawnień do list keysusługi . Ta nowa rola nie jest rolą wspólną dla platformy usług Azure AI, takiej jak Cognitive Services User rola. Ta nowa rola jest specyficzna dla Czytnik immersyjny i umożliwia tylko wywołania Czytnik immersyjny interfejsów API.

Zalecamy wszystkim klientom używanie nowej Cognitive Services Immersive Reader User roli zamiast oryginalnej Cognitive Services User roli. Poniżej udostępniono skrypt, który można uruchomić na poszczególnych zasobach, aby przełączyć uprawnienia do przypisywania ról.

To zalecenie dotyczy wszystkich klientów, aby upewnić się, że ta luka w zabezpieczeniach jest poprawna dla wszystkich, niezależnie od scenariusza implementacji lub prawdopodobieństwa ataku.

Jeśli tego nie zrobisz, nic się nie zepsuje. Stara rola będzie nadal działać. Wpływ zabezpieczeń dla większości klientów jest minimalny. Zalecamy jednak przeprowadzenie migracji do nowej roli w celu ograniczenia omówionych problemów z zabezpieczeniami. Zastosowanie tej aktualizacji jest zaleceniem doradczym w zakresie zabezpieczeń; to nie jest mandat.

Wszystkie nowe zasoby Czytnik immersyjny tworzone za pomocą naszego skryptu w sekcji Instrukcje: tworzenie zasobu Czytnik immersyjny automatycznie użyj nowej roli.

Aktualizowanie roli i obracanie kluczy subskrypcji

Jeśli utworzono i skonfigurowano zasób Czytnik immersyjny, korzystając z instrukcji opisanych w temacie Jak utworzyć zasób Czytnik immersyjny przed lutym 2022 r., zalecamy wykonanie następującej operacji w celu zaktualizowania uprawnień do przypisywania ról na wszystkich zasobach Czytnik immersyjny. Operacja polega na uruchomieniu skryptu w celu zaktualizowania przypisania roli w jednym zasobie. Jeśli masz wiele zasobów, uruchom ten skrypt wiele razy, raz dla każdego zasobu.

Po zaktualizowaniu roli przy użyciu poniższego skryptu zalecamy również wymianę kluczy subskrypcji na zasobie. W takim przypadku twoje klucze zostały naruszone przez lukę w zabezpieczeniach, a ktoś rzeczywiście korzysta z zasobu z uwierzytelnianiem klucza subskrypcji bez twojej zgody. Obracanie kluczy powoduje, że poprzednie klucze są nieprawidłowe i odmawia dalszego dostępu. W przypadku klientów korzystających z uwierzytelniania Entra firmy Microsoft, które powinno być wszystkim zgodnie z bieżącą implementacją zestawu SDK Czytnik immersyjny, rotacja kluczy nie ma wpływu na usługę Czytnik immersyjny, ponieważ tokeny dostępu firmy Microsoft Entra są używane do uwierzytelniania, a nie klucza subskrypcji. Rotacja kluczy subskrypcji to kolejny środek ostrożności.

Klucze subskrypcji można obrócić w witrynie Azure Portal. Przejdź do zasobu, a następnie przejdź do Keys and Endpoint sekcji . U góry znajdują się przyciski do Regenerate Key1 i 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.

Aktualizowanie przypisania roli przy użyciu programu Azure PowerShell

  1. Zacznij od otwarcia usługi Azure Cloud Shell. Upewnij się, że usługa Cloud Shell jest ustawiona na program PowerShell na liście rozwijanej po lewej górnej stronie lub wpisując .pwsh

  2. Skopiuj i wklej poniższy fragment kodu w powłoce.

    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. Uruchom funkcję Update-ImmersiveReaderRoleAssignment, zastępując <PARAMETER_VALUES> symbole zastępcze własnymi wartościami odpowiednio.

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

    Pełne polecenie wygląda podobnie do poniższego. W tym miejscu umieściliśmy każdy parametr w osobnym wierszu, aby uzyskać czytelność, dzięki czemu można zobaczyć całe polecenie. Nie kopiuj ani nie używaj tego polecenia w taki sposób, jak jest. Skopiuj i użyj polecenia z własnymi wartościami. Ten przykład zawiera fikcyjne wartości dla elementu <PARAMETER_VALUES>. Twoje będą inne, ponieważ wymyślisz własne nazwy dla tych wartości.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    Parametr Komentarze
    SubscriptionName Nazwa subskrypcji platformy Azure.
    ResourceGroupName Nazwa grupy zasobów zawierającej zasób Czytnik immersyjny.
    ResourceName Nazwa zasobu Czytnik immersyjny.
    AADAppIdentifierUri Identyfikator URI aplikacji Microsoft Entra.

Następny krok