Säkerhetsrådgivning: Uppdatera rolltilldelning för Microsoft Entra-autentisering

En säkerhetsfel upptäcktes som påverkar Microsoft Entra-autentisering för Avancerad läsare. Vi rekommenderar att du ändrar behörigheterna för dina Avancerad läsare resurser.

Bakgrund

När du först skapar dina Avancerad läsare resurser och konfigurerar dem för Microsoft Entra-autentisering är det nödvändigt att bevilja behörigheter för Microsoft Entra-programidentiteten för att få åtkomst till din Avancerad läsare resurs. Detta kallas för en rolltilldelning. Den Azure-roll som tidigare användes för behörigheter var Cognitive Services-användarrollen.

Under en säkerhetsgranskning upptäcktes det att den här Cognitive Services-användarrollen har behörighet att lista nycklar. Detta är något oroande eftersom Avancerad läsare integreringar omfattar användning av denna Microsoft Entra-åtkomsttoken i klientwebbappar och webbläsare. Om åtkomsttoken stals av en felaktig aktör eller angripare finns det en oro för att den här åtkomsttoken kan användas för list keys din Avancerad läsare resurs. Om en angripare kunde list keys för din resurs skulle de hämta Subscription Key för din resurs. För Subscription Key din resurs används som en autentiseringsmekanism och anses vara en hemlighet. Om en angripare hade resursens Subscription Keyskulle det göra det möjligt för dem att göra giltiga och autentiserade API-anrop till din Avancerad läsare resursslutpunkt, vilket kan leda till Denial of Service på grund av den ökade användningen och begränsningen på slutpunkten. Det skulle också tillåta obehörig användning av din Avancerad läsare resurs, vilket skulle leda till ökade avgifter på din faktura.

I praktiken är det dock inte troligt att den här attacken eller exploateringen inträffar eller kanske inte ens är möjlig. För Avancerad läsare scenarier får kunderna Microsoft Entra-åtkomsttoken med en målgrupp på https://cognitiveservices.azure.com. För att du ska list keys kunna använda din resurs måste Microsoft Entra-åtkomsttoken ha en målgrupp på https://management.azure.com. Generellt sett är detta inte mycket av ett problem, eftersom åtkomsttoken som används för Avancerad läsare scenarier inte skulle fungera för list keys, eftersom de inte har den målgrupp som krävs. För att kunna ändra målgruppen på åtkomsttoken måste en angripare kapa koden för tokenförvärv och ändra målgruppen innan anropet görs till Microsoft Entra-ID för att hämta token. Återigen är det inte troligt att detta kommer att utnyttjas eftersom vi, som en Avancerad läsare bästa praxis för autentisering, rekommenderar att kunder skapar Microsoft Entra-åtkomsttoken på webbprogrammets serverdel, inte i klienten eller webbläsaren. I dessa fall, eftersom tokenförvärvet sker på serverdelstjänsten, är det inte lika troligt eller kanske ens möjligt att en angripare kan kompromettera processen och ändra målgruppen.

Det verkliga problemet uppstår när eller om någon kund skulle hämta token från Microsoft Entra-ID direkt i klientkoden. Vi avråder starkt från detta, men eftersom kunderna är fria att implementera som de anser lämpligt är det möjligt att vissa kunder gör detta.

För att minska oron för eventuella möjligheter att använda Microsoft Entra-åtkomsttoken till list keysskapade vi en ny inbyggd Azure-roll med namnet Cognitive Services Immersive Reader User som inte har behörighet till list keys. Den här nya rollen är inte en delad roll för Azure AI-tjänsteplattformen som Cognitive Services User roll är. Den här nya rollen är specifik för Avancerad läsare och tillåter endast anrop till Avancerad läsare API:er.

Vi rekommenderar alla kunder att använda den nya Cognitive Services Immersive Reader User rollen i stället för den ursprungliga Cognitive Services User rollen. Vi har angett ett skript nedan som du kan köra på var och en av dina resurser för att växla över rolltilldelningsbehörigheterna.

Den här rekommendationen gäller för ALLA kunder för att säkerställa att den här säkerhetsrisken korrigeras för alla, oavsett implementeringsscenario eller sannolikhet för angrepp.

Om du inte gör detta, kommer ingenting att bryta. Den gamla rollen fortsätter att fungera. Säkerhetspåverkan för de flesta kunder är minimal. Vi rekommenderar dock att du migrerar till den nya rollen för att minska de säkerhetsproblem som diskuteras. Att tillämpa den här uppdateringen är en säkerhetsrekommendationsrekommendationsrekommendations. Det är inte ett mandat.

Alla nya Avancerad läsare resurser som du skapar med vårt skript på Så här: Skapa en Avancerad läsare resurs använder automatiskt den nya rollen.

Uppdatera rollen och rotera dina prenumerationsnycklar

Om du har skapat och konfigurerat en Avancerad läsare resurs med hjälp av anvisningarna i Så här skapar du en Avancerad läsare resurs före februari 2022 rekommenderar vi att du utför följande åtgärd för att uppdatera rolltilldelningsbehörigheterna för alla dina Avancerad läsare resurser. Åtgärden innebär att du kör ett skript för att uppdatera rolltilldelningen på en enskild resurs. Om du har flera resurser kör du det här skriptet flera gånger, en gång för varje resurs.

När du har uppdaterat rollen med hjälp av följande skript rekommenderar vi också att du roterar prenumerationsnycklarna på din resurs. Detta gäller om dina nycklar komprometterades av exploateringen och någon faktiskt använder din resurs med prenumerationsnyckelautentisering utan ditt medgivande. Om du roterar nycklarna blir de tidigare nycklarna ogiltiga och nekar ytterligare åtkomst. För kunder som använder Microsoft Entra-autentisering, vilket bör vara alla per aktuell Avancerad läsare SDK-implementering, har rotation av nycklarna ingen effekt på Avancerad läsare-tjänsten, eftersom Microsoft Entra-åtkomsttoken används för autentisering, inte prenumerationsnyckeln. Att rotera prenumerationsnycklarna är bara ännu en försiktighetsåtgärd.

Du kan rotera prenumerationsnycklarna i Azure-portalen. Gå till resursen och sedan till avsnittet Keys and Endpoint . Längst upp finns knappar till Regenerate Key1 och 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.

Använda Azure PowerShell för att uppdatera rolltilldelningen

  1. Börja med att öppna Azure Cloud Shell. Kontrollera att Cloud Shell är inställt på PowerShell i den övre vänstra listrutan eller genom att pwshskriva .

  2. Kopiera och klistra in följande kodfragment i gränssnittet.

    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. Kör funktionen Update-ImmersiveReaderRoleAssignmentoch ersätt <PARAMETER_VALUES> platshållarna med dina egna värden efter behov.

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

    Det fullständiga kommandot ser ut ungefär så här. Här placerar vi varje parameter på sin egen rad för tydlighetens skull, så att du kan se hela kommandot. Kopiera eller använd inte det här kommandot som det är. Kopiera och använd kommandot med dina egna värden. Det här exemplet har dummy-värden för <PARAMETER_VALUES>. Din kommer att vara annorlunda, eftersom du kommer med dina egna namn för dessa värden.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    Parameter Kommentarer
    SubscriptionName Namnet på din Azure-prenumeration.
    ResourceGroupName Namnet på resursgruppen som innehåller din Avancerad läsare resurs.
    ResourceName Namnet på din Avancerad läsare resurs.
    AADAppIdentifierUri URI:n för din Microsoft Entra-app.

Gå vidare