Esercitazione: Proteggere la connessione a Servizi cognitivi da servizio app .NET usando Key Vault

Servizio app di Azure possibile usare le identità gestite per connettersi ai servizi back-end senza una stringa di connessione, eliminando così i segreti di connessione da gestire e mantenendo sicura la connettività back-end in un ambiente di produzione. Per i servizi back-end che non supportano le identità gestite e richiedono comunque segreti di connessione, è possibile usare Key Vault per gestire i segreti di connessione. Questa esercitazione usa i servizi di intelligenza artificiale di Azure come esempio per illustrare come viene eseguita in pratica. Al termine, è disponibile un'app che effettua chiamate a livello di codice ai servizi di intelligenza artificiale di Azure, senza archiviare segreti di connessione all'interno di servizio app.

Suggerimento

I servizi di intelligenza artificiale di Azure supportano l'autenticazione tramite identità gestite, ma questa esercitazione usa l'autenticazione della chiave di sottoscrizione per illustrare come connettersi a un servizio di Azure che non supporta le identità gestite da Servizi app.

Diagramma dell'architettura per lo scenario di esercitazione.

Con questa architettura:

  • La connettività a Key Vault è protetta dalle identità gestite
  • servizio app accede ai segreti usando riferimenti Key Vault come impostazioni dell'app.
  • L'accesso all'insieme di credenziali delle chiavi è limitato all'app. I collaboratori dell'app, ad esempio gli amministratori, possono avere il controllo completo delle risorse servizio app e allo stesso tempo non hanno accesso ai segreti Key Vault.
  • Se il codice dell'applicazione accede già ai segreti di connessione con le impostazioni dell'app, non è necessaria alcuna modifica.

Contenuto dell'esercitazione:

  • Abilitare le identità gestite
  • Usare le identità gestite per connettersi a Key Vault
  • Usare i riferimenti di Key Vault
  • Accedere ai servizi di intelligenza artificiale di Azure

Prerequisiti

Preparare l'ambiente per l'interfaccia della riga di comando di Azure.

Creare un'app con connettività ai servizi di intelligenza artificiale di Azure

  1. Creare un gruppo di risorse per contenere tutte le risorse:

    # Save resource group name as variable for convenience
    groupName=myKVResourceGroup
    region=westeurope
    
    az group create --name $groupName --location $region
    
  2. Creare una risorsa dei servizi di intelligenza artificiale di Azure. Sostituire <cs-resource-name> con un nome univoco di propria scelta.

    # Save resource name as variable for convenience. 
    csResourceName=<cs-resource-name>
    
    az cognitiveservices account create --resource-group $groupName --name $csResourceName --location $region --kind TextAnalytics --sku F0 --custom-domain $csResourceName
    

    Nota

    --sku F0 crea una risorsa dei servizi di intelligenza artificiale di Azure di livello gratuito. Ogni sottoscrizione è limitata a una quota di una risorsa di livello TextAnalytics gratuito. Se si è già superata la quota, usare --sku S invece .

Configurare l'app .NET

Clonare il repository di esempio in locale e distribuire l'applicazione di esempio in servizio app. Sostituire <app-name> con un nome univoco.

# Save app name as variable for convenience
appName=<app-name>

# Clone sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/dotnet

az webapp up --sku F1 --resource-group $groupName --name $appName --plan $appName --location $region

Configurare i segreti come impostazioni dell'app

  1. Configurare i segreti dei servizi di intelligenza artificiale di Azure come impostazioni CS_ACCOUNT_NAME dell'app e CS_ACCOUNT_KEY.

    # Get subscription key for Cognitive Services resource
    csKey1=$(az cognitiveservices account keys list --resource-group $groupName --name $csResourceName --query key1 --output tsv)
    
    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="$csResourceName" CS_ACCOUNT_KEY="$csKey1"
    
  2. Nel browser passare all'app di distribuzione all'indirizzo <app-name>.azurewebsites.net e provare il rilevatore di lingue con stringhe in varie lingue.

    Screenshot che mostra l'app di rilevamento lingua distribuita in servizio app.

    Se si esamina il codice dell'applicazione, è possibile notare che l'output di debug per il rilevamento restituisce lo stesso colore del carattere dello sfondo. È possibile visualizzarlo provando a evidenziare lo spazio vuoto direttamente sotto il risultato.

Proteggere la connettività back-end

Al momento, i segreti di connessione vengono archiviati come impostazioni dell'app nell'app servizio app. Questo approccio protegge già i segreti di connessione dalla codebase dell'applicazione. Tuttavia, qualsiasi collaboratore che può gestire l'app può anche visualizzare le impostazioni dell'app. In questo passaggio si spostano i segreti di connessione in un insieme di credenziali delle chiavi e si blocca l'accesso in modo che solo l'app servizio app possa leggerla usando l'identità gestita.

  1. Creare un insieme di credenziali delle chiavi. Sostituire <vault-name> con un nome univoco.

    # Save app name as variable for convenience
    vaultName=<vault-name>
    
    az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
    

    Il --enable-rbac-authorization parametro imposta il controllo degli accessi in base al ruolo di Azure come modello di autorizzazione. Questa impostazione invalida per impostazione predefinita tutte le autorizzazioni dei criteri di accesso.

  2. Assegnare a se stessi il ruolo di controllo degli accessi in base al ruolo del responsabile dei segreti di Key Vault per l'insieme di credenziali.

    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    myId=$(az ad signed-in-user show --query id --output tsv)
    az role assignment create --role "Key Vault Secrets Officer" --assignee-object-id $myId --assignee-principal-type User --scope $vaultResourceId
    
  3. Abilitare l'identità gestita assegnata dal sistema per l'app e assegnargli il ruolo di controllo degli accessi in base al ruolo dell'utente dei segreti Key Vault per l'insieme di credenziali.

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. Aggiungere il nome della risorsa e la chiave di sottoscrizione dei servizi di intelligenza artificiale di Azure come segreti all'insieme di credenziali e salvare gli ID come variabili di ambiente per il passaggio successivo.

    csResourceKVUri=$(az keyvault secret set --vault-name $vaultName --name csresource --value $csResourceName --query id --output tsv)
    csKeyKVUri=$(az keyvault secret set --vault-name $vaultName --name cskey --value $csKey1 --query id --output tsv)
    
  5. In precedenza, i segreti sono stati impostati come impostazioni CS_ACCOUNT_NAME dell'app e CS_ACCOUNT_KEY nell'app. Impostarli ora come riferimenti all'insieme di credenziali delle chiavi .

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    
  6. Nel browser passare di nuovo a <app-name>.azurewebsites.net . Se si ottengono i risultati del rilevamento, ci si connette all'endpoint dei servizi di intelligenza artificiale di Azure con riferimenti all'insieme di credenziali delle chiavi.

L'app si connette ora ai servizi di intelligenza artificiale di Azure usando i segreti conservati nell'insieme di credenziali delle chiavi, senza apportare modifiche al codice dell'applicazione.

Pulire le risorse

Nei passaggi precedenti sono state create risorse di Azure in un gruppo di risorse. Se si ritiene che queste risorse non saranno necessarie in futuro, eliminare il gruppo di risorse eseguendo questo comando in Cloud Shell:

az group delete --name $groupName

L'esecuzione del comando può richiedere un minuto.

Passaggi successivi