Tutoriel : Connexion Secure Foundry Tools à partir de .NET App Service à l’aide de Key Vault

Azure App Service peut utiliser des identités managées pour se connecter aux services principaux sans chaîne de connexion. Cette approche supprime la gestion des secrets de connexion et garantit la sécurité de votre connectivité back-end dans un environnement de production. Lorsque vous avez terminé, vous disposez d’une application qui effectue des appels programmatiques à Foundry Tools sans stocker de secrets de connexion dans App Service.

Pour les services principaux qui ne prennent pas en charge les identités managées et nécessitent toujours des secrets de connexion, vous pouvez utiliser Azure Key Vault pour gérer les secrets de connexion. Ce didacticiel utilise Foundry Tools comme exemple. Lorsque vous avez terminé, vous disposez d’une application qui effectue des appels programmatiques à Foundry Tools sans stocker de secrets de connexion dans App Service.

Conseil

Foundry Tools prend en charge l’authentification par le biais d’identités managées. Ce tutoriel utilise l’authentification par clé d’abonnement pour montrer comment vous pouvez vous connecter à un service Azure qui ne prend pas en charge les identités managées à partir d’App Service.

Diagramme montrant l’utilisateur qui se connecte à un service, qui se connecte à son tour à un coffre de clés pour accéder à Cognitive Services.

Dans cette architecture :

  • Les comptes managés sécurisent la connectivité au coffre de clés.
  • App Service accède aux secrets à l’aide de références Key Vault en tant que paramètres d’application.
  • L’accès au coffre de clés est limité à l’application. Les contributeurs d’applications, tels que les administrateurs, peuvent avoir un contrôle complet des ressources App Service et, en même temps, n’ont pas accès aux secrets Key Vault.
  • Si le code de votre application accède déjà aux secrets de connexion avec les paramètres d’application, aucune modification n’est requise.

Dans ce tutoriel, vous allez apprendre à :

  • Activer les identités managées
  • Utiliser des identités managées pour se connecter à Key Vault
  • Utiliser des références de Key Vault
  • Accéder aux outils de la Fonderie

Prérequis

Préparez votre environnement pour la Azure CLI.

Créer une application avec une connectivité à Foundry Tools

  1. Créez un groupe de ressources qui contiendra toutes vos ressources :

    # Save the resource group name as a variable for convenience
    groupName=myKVResourceGroup
    region=canadacentral
    
    az group create --name $groupName --location $region
    
  2. Créez une ressource Foundry Tools. Remplacez <cs-resource-name> par un nom unique.

    # Save the resource name as a 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
    

    Remarque

    --sku F0 crée une ressource Outils Foundry de niveau gratuit. Chaque abonnement est limité à un quota d’une ressource TextAnalytics de niveau Gratuit. Si vous avez déjà utilisé votre quota, utilisez --sku S plutôt.

Configurer une application .NET

Clonez l’exemple de référentiel localement et déployez l’exemple d’application sur App Service. Remplacez <app-name> par un nom unique.

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

# Clone the 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

Configurer des secrets sous forme de paramètres d’application

  1. Configurez les secrets Foundry Tools en tant que paramètres d'applications CS_ACCOUNT_NAME et CS_ACCOUNT_KEY.

    # Get the subscription key for the Foundry Tools 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. Dans un navigateur, accédez à votre application déployée à l’adresse <app-name>.azurewebsites.net. Essayez le détecteur de langues en entrant des chaînes dans différentes langues.

    Capture d’écran montrant l’application détecteur de langues déployée dans App Service.

    Comme vous pouvez le constater en examinant le code de l’application, la sortie de débogage de la détection se traduit par une police de la couleur de l’arrière-plan. Vous pouvez voir la sortie en mettant en surbrillance l’espace blanc directement sous le résultat.

Sécurisation de la connectivité du système arrière-plan

Les secrets de connexion sont désormais stockés en tant que paramètres d’application dans votre application App Service. Cette approche sécurise déjà les secrets de connexion à partir de votre codebase d’application. Toutefois, un contributeur autorisé à gérer votre application peut également voir les paramètres de l’application. Dans cette section, vous déplacez les secrets de connexion vers un coffre-fort de clés. Vous verrouillez l’accès afin que seul vous puissiez le gérer et que seule l’application App Service puisse la lire à l’aide de son identité managée.

  1. Création d’un coffre de clés Remplacez <vault-name> par un nom unique.

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

    Le paramètre --enable-rbac-authorizationconfigure le contrôle d'accès basé sur les rôles (RBAC) d'Azure en tant que modèle d'autorisation. Ce paramètre invalide toutes les autorisations de stratégies d’accès par défaut.

  2. Donnez-vous le rôle RBAC Responsable des secrets Key Vault du coffre.

    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. Activez l’identité managée affectée par le système de votre application et donnez-lui le rôle RBAC Utilisateur des secrets Key Vault du coffre.

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. Ajoutez le nom de la ressource Foundry Tools et la clé d’abonnement en tant que secrets au coffre, puis enregistrez leurs ID en tant que variables d’environnement pour l’étape suivante.

    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. Précédemment, vous avez défini les secrets sous la forme des paramètres d’application CS_ACCOUNT_NAME et CS_ACCOUNT_KEY dans votre application. À présent, définissez-les comme références de 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. Dans un navigateur, accédez à <app-name>.azurewebsites.net de nouveau. Si vous récupérez les résultats de la détection, vous vous connectez au point de terminaison de Foundry Tools à l'aide de références au Key Vault.

Félicitations, votre application se connecte désormais à Foundry Tools à l’aide de secrets conservés dans votre coffre de clés et vous n’avez apporté aucune modification à votre code d’application.

Nettoyer les ressources

Dans les étapes précédentes, vous avez créé Azure ressources dans un groupe de ressources. Si vous ne vous attendez pas à avoir besoin de ces ressources à l'avenir, supprimez le groupe de ressources en exécutant la commande suivante dans l'Cloud Shell :

az group delete --name $groupName

L’exécution de cette commande peut prendre une minute.