Avviso di sicurezza: aggiornare l'assegnazione di ruolo per l'autenticazione di Microsoft Entra
È stato rilevato un bug di sicurezza correlato all'autenticazione di Microsoft Entra per lo strumento di lettura immersiva. È consigliabile modificare le autorizzazioni per le risorse dello strumento di lettura immersiva.
Background
Quando si creano inizialmente le risorse dello strumento di lettura immersiva e le si configura per l'autenticazione di Microsoft Entra, è necessario concedere le autorizzazioni per l'identità dell'applicazione Microsoft Entra per accedere alla risorsa dello strumento di lettura immersiva. Questa operazione è nota come assegnazione di ruolo. Il ruolo di Azure usato in precedenza per le autorizzazioni era il ruolo utente di Servizi cognitivi.
Durante un controllo di sicurezza, è stato rilevato che questo ruolo utente di Servizi cognitivi dispone delle autorizzazioni per elencare le chiavi. La cosa è relativamente preoccupante perché le integrazioni dello strumento di lettura immersiva implicano l'uso di questo token di accesso Microsoft Entra nelle app Web client e nei browser. Se il token di accesso viene rubato da un utente malintenzionato, c'è il rischio che possa essere usato per list keys
per la risorsa dello strumento di lettura immersiva. Se un utente malintenzionato potesse list keys
per la risorsa, otterrebbe il Subscription Key
per la risorsa. Il Subscription Key
per la risorsa viene usato come meccanismo di autenticazione ed è considerato un segreto. Se un utente malintenzionato avesse il Subscription Key
della risorsa, potrebbe effettuare chiamate API valide e autenticate all'endpoint della risorsa dello strumento di lettura immersiva, il che potrebbe portare a un Denial of Service a causa dell'aumento nell'utilizzo e della limitazione dell'endpoint. Ciò consentirebbe anche l'uso non autorizzato della risorsa dello strumento di lettura immersiva, con conseguente aumento degli addebiti in fattura.
Tuttavia, è improbabile che nella pratica si verifichi questo attacco o exploit, o potrebbe addirittura non essere possibile. Per gli scenari dello strumento di lettura immersiva, i clienti ottengono token di accesso di Microsoft Entra con un gruppo di destinatari di https://cognitiveservices.azure.com
. Per list keys
correttamente la risorsa, il token di accesso di Microsoft Entra deve avere un gruppo di destinatari di https://management.azure.com
. In generale, questo non è un grosso problema, poiché i token di accesso usati per gli scenari dello strumento di lettura immersiva non funzionano in list keys
, perché non hanno i destinatari richiesti. Per modificare il gruppo di destinatari nel token di accesso, un utente malintenzionato dovrà dirottare il codice di acquisizione del token e modificare il gruppo di destinatari prima che venga effettuata la chiamata a Microsoft Entra ID per acquisire il token. Anche in questo caso, è improbabile che ciò si verifichi perché la procedura consigliata per l'autenticazione dello strumento di lettura immersiva prevede che i clienti creino token di accesso di Microsoft Entra nel back-end dell'applicazione Web, non nel client o nel browser. In questi casi, poiché l'acquisizione del token avviene nel servizio back-end, non è così probabile o forse non è nemmeno possibile che l'utente malintenzionato possa compromettere tale processo e modificare il gruppo di destinatari.
Il problema reale si verifica quando o se un cliente dovesse acquisire i token da Microsoft Entra ID direttamente nel codice client. Lo sconsigliamo vivamente, ma poiché i clienti sono liberi di effettuare implementazioni in base alle proprie esigenze, alcuni clienti potrebbero farlo.
Per attenuare le preoccupazioni relative a qualsiasi possibilità di uso del token di accesso di Microsoft Entra a list keys
, è stato creato un nuovo ruolo di Azure predefinito denominato Cognitive Services Immersive Reader User
, che non dispone delle autorizzazioni per list keys
. Questo nuovo ruolo non è un ruolo condiviso per la piattaforma Servizi di Azure AI come il ruolo Cognitive Services User
. Questo nuovo ruolo è specifico dello strumento di lettura immersiva e consente solo le chiamate alle API dello strumento di lettura immersiva.
È consigliabile che tutti i clienti usino il nuovo ruolo di Cognitive Services Immersive Reader User
anziché il ruolo Cognitive Services User
originale. Di seguito viene fornito uno script che è possibile eseguire in ognuna delle risorse per passare alle autorizzazioni di assegnazione di ruolo.
Questa raccomandazione si applica a TUTTI i clienti, per assicurarsi che questa vulnerabilità venga corretta per tutti, indipendentemente dallo scenario di implementazione o dalla probabilità di attacco.
Se NON si esegue questa operazione, non verrà interrotta alcuna operazione. Il ruolo precedente continuerà a funzionare. L'impatto sulla sicurezza per la maggior parte dei clienti è minimo. È tuttavia consigliabile eseguire la migrazione al nuovo ruolo per attenuare i problemi di sicurezza descritti. L'applicazione di questo aggiornamento è una raccomandazione di sicurezza; non è un ordine.
Tutte le nuove risorse dello strumento di lettura immersiva create con lo script in Procedura: Creare una risorsa dello strumento di lettura immersiva usano automaticamente il nuovo ruolo.
Aggiornare il ruolo e ruotare le chiavi di sottoscrizione
Se è stata creata e configurata una risorsa dello strumento di lettura immersiva usando le istruzioni riportate in Procedura: Creare una risorsa dello strumento di lettura immersiva prima di febbraio 2022, è consigliabile eseguire l'operazione seguente per aggiornare le autorizzazioni di assegnazione dei ruoli per TUTTE le risorse dello strumento di lettura immersiva. L'operazione comporta l'esecuzione di uno script per aggiornare l'assegnazione di ruolo in una singola risorsa. Se si dispone di più risorse, eseguire questo script più volte, una per ogni risorsa.
Dopo aver aggiornato il ruolo usando lo script seguente, è anche consigliabile ruotare le chiavi di sottoscrizione nella risorsa. Questo nel caso in cui le chiavi siano state compromesse dall'exploit e qualcuno stia effettivamente usando la risorsa con l'autenticazione della chiave di sottoscrizione senza il consenso dell'utente. La rotazione delle chiavi rende le chiavi precedenti non valide e nega qualsiasi ulteriore accesso. Per i clienti che usano l'autenticazione di Microsoft Entra, che dovrebbero essere tutti secondo l'attuale implementazione dell’SDK dello strumento di lettura immersiva, la rotazione delle chiavi non avrà alcun impatto sul servizio dello strumento di lettura immersiva, poiché per l'autenticazione vengono usati i token di accesso di Microsoft Entra, non la chiave di sottoscrizione. La rotazione delle chiavi di sottoscrizione è solo un'altra precauzione.
È possibile ruotare le chiavi di sottoscrizione nel portale di Azure. Passare alla risorsa e quindi alla sezione Keys and Endpoint
. Nella parte superiore sono presenti pulsanti per Regenerate Key1
e Regenerate Key2
.
Usare Azure PowerShell per aggiornare l'assegnazione di ruolo
Per iniziare, aprire Azure Cloud Shell. Assicurarsi che Cloud Shell sia impostato su PowerShell, nell'elenco a discesa in alto a sinistra o digitando
pwsh
.Copiare e incollare il frammento di codice seguente nella shell.
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" } }
Eseguire la funzione
Update-ImmersiveReaderRoleAssignment
, sostituendo i segnaposto<PARAMETER_VALUES>
con i propri valori in base alle esigenze.Update-ImmersiveReaderRoleAssignment -SubscriptionName '<SUBSCRIPTION_NAME>' -ResourceGroupName '<RESOURCE_GROUP_NAME>' -ResourceName '<RESOURCE_NAME>' -AADAppIdentifierUri '<MICROSOFT_ENTRA_APP_IDENTIFIER_URI>'
Il comando completo ha un aspetto simile al seguente. Qui è stato inserito ogni parametro nella rispettiva riga per maggiore chiarezza, in modo da poter visualizzare l'intero comando. Non copiare o usare questo comando così com'è. Copiare e usare il comando con i propri valori. In questo esempio sono presenti valori fittizi per
<PARAMETER_VALUES>
. I tuoi valori saranno diversi, come si vedrà con i propri nomi per questi valori.Update-ImmersiveReaderRoleAssignment -SubscriptionName 'MyOrganizationSubscriptionName' -ResourceGroupName 'MyResourceGroupName' -ResourceName 'MyOrganizationImmersiveReader' -AADAppIdentifierUri 'https://MyOrganizationImmersiveReaderAADApp'
Parametro Commenti SubscriptionName Nome della sottoscrizione di Azure. ResourceGroupName Nome del gruppo di risorse che contiene la risorsa dello strumento di lettura immersiva. NomeRisorsa Nome della risorsa dello strumento di lettura immersiva. AADAppIdentifierUri URI per l'app Microsoft Entra.