Esercitazione: Proteggere la connessione a Servizi cognitivi da servizio app .NET con Key Vault
app Azure Servizio può usare le identità gestite per connettersi ai servizi back-end senza un 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 ancora 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 dalle servizio app.
Con questa architettura:
- La connettività a Key Vault è protetta dalle identità gestite
- servizio app accede ai segreti usando Riferimenti a 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 di 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.
Usare l'ambiente Bash in Azure Cloud Shell. Per altre informazioni, vedere Avvio rapido su Bash in Azure Cloud Shell.
Se si preferisce eseguire i comandi di riferimento dell'interfaccia della riga di comando in locale, installare l'interfaccia della riga di comando di Azure. Per l'esecuzione in Windows o macOS, è consigliabile eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker. Per altre informazioni, vedere Come eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker.
Se si usa un'installazione locale, accedere all'interfaccia della riga di comando di Azure con il comando az login. Per completare il processo di autenticazione, seguire la procedura visualizzata nel terminale. Per altre opzioni di accesso, vedere Accedere tramite l'interfaccia della riga di comando di Azure.
Quando richiesto, al primo utilizzo installare l'estensione dell'interfaccia della riga di comando di Azure. Per altre informazioni sulle estensioni, vedere Usare le estensioni con l'interfaccia della riga di comando di Azure.
Eseguire az version per trovare la versione e le librerie dipendenti installate. Per eseguire l'aggiornamento alla versione più recente, eseguire az upgrade.
Creare un'app con connettività ai servizi di intelligenza artificiale di Azure
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
Creare una risorsa di Servizi di Azure AI. 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 livelloTextAnalytics
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
Configurare i segreti dei servizi di intelligenza artificiale di Azure come impostazioni
CS_ACCOUNT_NAME
dell'app eCS_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"
Nel browser passare all'app di distribuzione all'indirizzo
<app-name>.azurewebsites.net
e provare il rilevamento della lingua con stringhe in varie lingue.Se si esamina il codice dell'applicazione, è possibile notare che l'output di debug per il rilevamento restituisce lo stesso colore del tipo di carattere dello sfondo. È possibile vederlo 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.
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.Assegnare 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
Abilitare l'identità gestita assegnata dal sistema per l'app e assegnargli il ruolo Controllo degli accessi in base al ruolo utente dei segreti di Key Vault per l'insieme di credenziali.
az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role "Key Vault Secrets User"
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)
In precedenza, i segreti sono stati impostati come impostazioni
CS_ACCOUNT_NAME
dell'app eCS_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)"
Nel browser passare di nuovo a
<app-name>.azurewebsites.net
. Se si ottengono i risultati del rilevamento, ci si connette all'endpoint di Servizi di intelligenza artificiale di Azure con i riferimenti all'insieme di credenziali delle chiavi.
L'app si connette ora ai servizi di intelligenza artificiale di Azure usando 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.