Esercitazione: Proteggere la connessione del servizio cognitivo da JavaScript servizio app usando Key Vault
Servizio app di Azure può usare le identità gestite per connettersi ai servizi back-end senza una stringa di connessione, che elimina i segreti di connessione per gestire e mantenere sicura la connettività back-end in un ambiente di produzione. Per i servizi back-end che non supportano 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, si dispone di un'app che effettua chiamate a livello di codice ai servizi di intelligenza artificiale di Azure, senza archiviare i 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.
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 delle 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.
Usare l'ambiente Bash in Azure Cloud Shell. Per altre informazioni, vedere Avvio rapido per 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 con l'interfaccia della riga di comando di Azure.
Quando viene richiesto, installare l'estensione dell'interfaccia della riga di comando di Azure per la prima volta. 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 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 dei servizi di intelligenza artificiale di Azure. Sostituire <cs-resource-name> con un nome univoco scelto.
# 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 a livello gratuito. Ogni sottoscrizione è limitata a una quota di una risorsa a livelloTextAnalytics
gratuito. Se si è già oltre la quota, usare--sku S
invece.
Configurare l'app JavaScript
Clonare il repository di esempio in locale e distribuire l'applicazione di esempio in servizio app. Sostituire <il nome dell'app con un nome> univoco.
# Clone and prepare sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/javascript
zip default.zip *.*
# Save app name as variable for convenience
appName=<app-name>
az appservice plan create --resource-group $groupName --name $appName --sku FREE --location $region --is-linux
az webapp create --resource-group $groupName --plan $appName --name $appName --runtime "node|14-lts"
az webapp config appsettings set --resource-group $groupName --name $appName --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
az webapp deployment source config-zip --resource-group $groupName --name $appName --src ./default.zip
I comandi precedenti:
- Creare un piano di servizio app linux
- Creare un'app Web per Node.js 14 LTS
- Configurare l'app Web per installare i pacchetti npm nella distribuzione
- Caricare il file zip e installare i pacchetti npm
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
<app-name>.azurewebsites.net
di distribuzione in e provare il rilevamento della lingua con stringhe in varie lingue.Se si esamina il codice dell'applicazione, è possibile notare l'output di debug per i risultati del rilevamento nello stesso colore del tipo di carattere dello sfondo. È possibile vederlo cercando di 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 <il nome dell'insieme di credenziali 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 per impostazione predefinita invalida tutte le autorizzazioni dei criteri di accesso.Assegnare il ruolo di controllo degli accessi in base al ruolo di Key Vault Secret Officer 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 di controllo degli accessi in base al ruolo 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"
Aggiungere il nome 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, si impostano i segreti 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 nuovamente i risultati del rilevamento, si sta connettendo all'endpoint dei servizi di intelligenza artificiale di Azure con riferimenti all'insieme di credenziali delle chiavi.
Congratulazioni, l'app è ora in connessione ai servizi di intelligenza artificiale di Azure usando segreti mantenuti nell'insieme di credenziali delle chiavi, senza 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.