Poradce pro zabezpečení: Aktualizace přiřazení role pro ověřování Microsoft Entra

Byla zjištěna chyba zabezpečení, která má vliv na ověřování Microsoft Entra pro Asistivní čtečka. Doporučujeme změnit oprávnění k prostředkům Asistivní čtečka.

Pozadí

Při počátečním vytvoření Asistivní čtečka prostředků a jejich konfiguraci pro ověřování Microsoft Entra je nutné udělit oprávnění pro identitu aplikace Microsoft Entra pro přístup k vašemu prostředku Asistivní čtečka. To se označuje jako přiřazení role. Role Azure, která byla dříve použita pro oprávnění, byla role uživatele služeb Cognitive Services.

Během auditu zabezpečení bylo zjištěno, že tato role uživatele služeb Cognitive Services má oprávnění k výpisu klíčů. To se mírně týká, protože integrace Asistivní čtečka zahrnují použití tohoto přístupového tokenu Microsoft Entra v klientských webových aplikacích a prohlížečích. Pokud byl přístupový token odcizen chybným aktérem nebo útočníkem, existuje obava, že tento přístupový token se dá použít pro list keys váš prostředek Asistivní čtečka. Pokud by útočník mohl list keys pro váš prostředek, získá ho Subscription Key pro váš prostředek. Prostředek Subscription Key se používá jako ověřovací mechanismus a považuje se za tajný kód. Pokud by útočník měl prostředekSubscription Key, umožnil by mu provádět platná a ověřená volání rozhraní API do koncového bodu prostředku Asistivní čtečka, což může vést k odepření služby kvůli zvýšenému využití a omezování koncového bodu. Zároveň by to umožnilo neoprávněné použití vašeho Asistivní čtečka prostředku, což by vedlo ke zvýšení poplatků na faktuře.

V praxi ale k tomuto útoku nebo zneužití pravděpodobně nedojde nebo ani nemusí být možné. Pro Asistivní čtečka scénáře zákazníci získávají přístupové tokeny Microsoft Entra s cílovou skupinou https://cognitiveservices.azure.com. Aby bylo možné úspěšně list keys pro váš prostředek, bude nutné, aby přístupový token Microsoft Entra měl cílovou skupinu https://management.azure.com. Obecně řečeno, to není příliš problém, protože přístupové tokeny používané pro Asistivní čtečka scénáře by nefungovaly list keys, protože nemají požadovanou cílovou skupinu. Aby bylo možné změnit cílovou skupinu v přístupovém tokenu, útočník by musel zneužnit kód získání tokenu a změnit cílovou skupinu před provedením volání na Id Microsoft Entra, aby získal token. Toto není pravděpodobně zneužité, protože jako osvědčený postup Asistivní čtečka ověřování doporučujeme zákazníkům vytvářet přístupové tokeny Microsoft Entra v back-endu webové aplikace, ne v klientovi nebo prohlížeči. V takových případech, protože k získání tokenu dochází v back-endové službě, není to tak pravděpodobné nebo dokonce možné, že by útočník mohl tento proces ohrozit a změnit cílovou skupinu.

Skutečný problém nastane, když nebo pokud některý zákazník získá tokeny z Id Microsoft Entra přímo v klientském kódu. Důrazně doporučujeme, ale protože zákazníci mohou implementovat podle potřeby, je možné, že někteří zákazníci to dělají.

Abychom zmírnit obavy ohledně jakékoli možnosti použití přístupového tokenu Microsoft Entra k list keys, vytvořili jsme novou integrovanou roli Azure, Cognitive Services Immersive Reader User která nemá oprávnění k list keys. Tato nová role není sdílenou rolí pro platformu služeb Azure AI, jako Cognitive Services User je role. Tato nová role je specifická pro Asistivní čtečka a umožňuje pouze volání Asistivní čtečka rozhraní API.

Doporučujeme všem zákazníkům, aby místo původní Cognitive Services User role používali novou Cognitive Services Immersive Reader User roli. Níže jsme uvedli skript, který můžete spustit u každého z vašich prostředků a přepnout oprávnění k přiřazení rolí.

Toto doporučení platí pro všechny zákazníky, aby se zajistilo, že se toto ohrožení zabezpečení opraví pro všechny bez ohledu na to, jaký je scénář implementace nebo pravděpodobnost útoku.

Pokud to neuděláte, nic se neporuší. Stará role bude i nadále fungovat. Dopad na zabezpečení pro většinu zákazníků je minimální. Doporučujeme ale migrovat na novou roli, abyste zmírnit problémy zabezpečení, které jsou popsány. Použití této aktualizace je doporučení poradce pro zabezpečení; není to mandát.

Všechny nové Asistivní čtečka prostředky, které vytvoříte pomocí našeho skriptu v části Postupy: Vytvoření prostředku Asistivní čtečka automaticky použije novou roli.

Aktualizace rolí a obměna klíčů předplatného

Pokud jste vytvořili a nakonfigurovali prostředek Asistivní čtečka pomocí pokynů v tématu Postupy: Vytvoření prostředku Asistivní čtečka před únorem 2022, doporučujeme provést následující operaci, abyste aktualizovali oprávnění přiřazení role pro všechny prostředky Asistivní čtečka. Operace zahrnuje spuštění skriptu pro aktualizaci přiřazení role v jednom prostředku. Pokud máte více prostředků, spusťte tento skript několikrát, jednou pro každý prostředek.

Po aktualizaci role pomocí následujícího skriptu také doporučujeme obměňovat klíče předplatného ve vašem prostředku. To je v případě, že zneužití zneužilo vaše klíče, a někdo ve skutečnosti používá váš prostředek s ověřováním klíče předplatného bez vašeho souhlasu. Otočením klíčů se vykreslí předchozí klíče jako neplatné a odepřete veškerý další přístup. Pro zákazníky používající ověřování Microsoft Entra, které by mělo být pro každou aktuální implementaci sady Asistivní čtečka SDK, nemá obměně klíčů žádný vliv na službu Asistivní čtečka, protože přístupové tokeny Microsoft Entra se používají k ověřování, nikoli klíč předplatného. Obměně klíčů předplatného je další opatření.

Klíče předplatného můžete otočit na webu Azure Portal. Přejděte k vašemu prostředku a pak do oddílu Keys and Endpoint . Nahoře jsou tlačítka na Regenerate Key1 a 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.

Aktualizace přiřazení role pomocí Azure PowerShellu

  1. Začněte otevřením Azure Cloud Shellu. Ujistěte se, že je Cloud Shell nastavený na PowerShell v levém horním rozevíracím seznamu nebo zadáním pwsh.

  2. Zkopírujte následující fragment kódu a vložte ho do prostředí.

    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. Spusťte funkci Update-ImmersiveReaderRoleAssignmenta nahraďte <PARAMETER_VALUES> zástupné symboly vlastními hodnotami podle potřeby.

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

    Celý příkaz vypadá přibližně takto. Tady každý parametr umístíme na vlastní řádek, abyste mohli přehledně vidět celý příkaz. Nekopírujte ani nepoužívejte tento příkaz tak, jak je. Zkopírujte a použijte příkaz s vlastními hodnotami. Tento příklad obsahuje fiktivní hodnoty pro <PARAMETER_VALUES>. Vaše hodnoty se budou lišit, jakmile se objevíte s vlastními názvy těchto hodnot.

    Update-ImmersiveReaderRoleAssignment
        -SubscriptionName 'MyOrganizationSubscriptionName'
        -ResourceGroupName 'MyResourceGroupName'
        -ResourceName 'MyOrganizationImmersiveReader'
        -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
    
    Parametr Komentáře
    SubscriptionName Název vašeho předplatného Azure.
    ResourceGroupName Název skupiny prostředků, která obsahuje váš prostředek Asistivní čtečka.
    ResourceName Název prostředku Asistivní čtečka
    AADAppIdentifierUri Identifikátor URI pro vaši aplikaci Microsoft Entra.

Další krok