Condividi tramite


Esercitazione: Proteggere la connessione a Servizio cognitivo dall'applicazione Python App Service tramite Key Vault

Azure App Service può usare identità gestite managed identities per connettersi ai servizi back-end senza una stringa di connessione, eliminando così la necessità di gestire segreti di connessione 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 gli strumenti Foundry come esempio per illustrare come viene eseguita in pratica. Al termine, si dispone di un'app che effettua chiamate programmatiche a Foundry Tools, senza archiviare segreti di connessione all'interno di App Service.

Suggerimento

Gli strumenti Foundry supportano l'autenticazione tramite identità gestite, ma questa esercitazione utilizza l'autenticazione tramite chiave di sottoscrizione per illustrare come connettersi a un servizio Azure che non supporta le identità gestite da Servizi App.

Diagramma dell'architettura per lo scenario di esercitazione.

Con questa architettura:

  • La connettività alle Key Vault è protetta dalle identità gestite
  • Il servizio app accede ai segreti usando riferimenti a Key Vault come impostazioni della app.
  • L'accesso all'insieme di credenziali delle chiavi è limitato all'applicazione. I collaboratori dell'app, ad esempio gli amministratori, possono avere il controllo completo delle risorse del 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.

Cosa imparerai:

  • Abilitare le identità gestite
  • Usare le identità gestite per connettersi a Key Vault
  • Usare i riferimenti di Key Vault
  • Accedi agli strumenti di fonderia

Prerequisiti

Preparare l'ambiente per il Azure CLI.

Creare un'app con connettività a Foundry Tools

  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 per i 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 di livello gratuito dei servizi di Azure AI. 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'applicazione Python

Clonare il repository di esempio in locale sul computer e distribuire l'applicazione di esempio su App Service. Sostituire <app-name> 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/python
zip -r 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 "python:3.14"
az webapp config appsettings set --resource-group $groupName --name $appName --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
az webapp deploy --resource-group $groupName --name $appName --src-path ./default.zip

I comandi precedenti:

  • Creare un piano di servizio app Linux
  • Creare un'app Web per Python 3.14
  • Configurare l'app Web per installare i pacchetti Python nella distribuzione
  • Caricare il file ZIP e installare i pacchetti Python

Configurare i segreti come impostazioni dell'app

  1. Configurare come impostazioni dell'app i segreti di Foundry Tools CS_ACCOUNT_NAME 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 rilevamento della lingua con stringhe in varie lingue.

    Screenshot che mostra l'app per il rilevamento della lingua distribuita in App Service.

    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.

Connettività back-end sicura

Al momento, i segreti di connessione vengono archiviati come impostazioni dell'app nel Servizio app della tua applicazione. 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, sposti i segreti di connessione in un Key Vault, bloccando l'accesso in modo che solo tu possa gestirlo e solo l'app del servizio possa leggerli utilizzando la sua 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 parametro --enable-rbac-authorizationimposta 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. Impostati nel ruolo Key Vault Secrets Officer per la cassetta di sicurezza.

    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. Abilita l'identità gestita assegnata dal sistema per l'app e assegnagli il ruolo [Key Vault Secrets User] RBAC 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 dei servizi Azure AI e la chiave di sottoscrizione come segreti al vault e salvare i loro 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 dell'app CS_ACCOUNT_NAME e CS_ACCOUNT_KEY. Ora impostali come riferimenti al Key Vault.

    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 AI di Azure con i riferimenti a Key Vault di Azure.

Congratulazioni! La tua app si connette ora a Foundry Tools utilizzando segreti conservati nel tuo archivio chiavi, senza apportare alcuna modifica al codice dell'applicazione.

Pulire le risorse

Nei passaggi precedenti sono state create le risorse di Azure in un gruppo di risorse. Se non si prevede che queste risorse siano necessarie in futuro, eliminare il gruppo di risorse eseguendo il comando seguente nel Cloud Shell:

az group delete --name $groupName

L'esecuzione del comando può richiedere un minuto.

Passaggi successivi