Accéder à Azure Key Vault a partir de la Fonction Azure

Peter KARDA
Publié par Peter KARDA
Catégorie : Azure / Azure Functions
10/04/2020

Quand on travaille avec Azure Functions, on a souvent besoin d’interagir avec une base de données SQL, un service de Message Queuing ou de s’authentifier à une API. Azure Function App Service dispose de paramètres d’application dans lesquels on peut stocker les chaînes de connexion ou d’autres informations d’authentification. Il est donc très facile de récupérer et d’utiliser ces paramètres directement dans du code Azure Function. Quand on a des solutions Azure qui augmentent en complexité, on a naturellement besoin de gagner en maîtrise sur la manière et l’endroit où stocker en toute sécurité les informations d’authentification. Azure Key Vault fournit un référentiel centralisé pour vos clés et vos secrets (mots de passe, chaînes de connexion, clés d’API, etc.).

Dans cet article, nous allons vous montrer comment stocker une chaîne de connexion SQL Server dans un secret Azure Key Vault pour pouvoir ensuite l’utiliser dans Azure Functions. Cette configuration est beaucoup plus facile à effectuer depuis que les Managed Service Identities existent.

 

Aperçu de la solution

 

Azure Key Vault est un environnement sécurisé. Il y a donc un certain nombre de choses à configurer avant que notre Azure Function App puisse demander un secret à Key Vault. Il faut tout d’abord activer une identité managée par le système dans Azure Function App. Il faudra ensuite ajouter une politique d’accès pour ce service dans Azure Key Vault. Le schéma ci-dessous décrit les différentes étapes à suivre pour y parvenir.

 

Aperçu de la solution

 

Nous allons examiner ces étapes de plus près dans les chapitres suivants.

 

Activation de l’identité managée par le système dans Azure Function App

 

Azure Key Vault ne peut fonctionner qu’avec des services de cloud ayant des identités managées assignées par le système. En d’autres termes, Key Vault ne connaît pas notre Function App à moins que nous lui activions une identité.

Nous avons commencé par créer le Azure Function App Service (que nous avons appelé functionapp-demo-mw). Pour activer l’identité managée, il suffit d’ouvrir Azure Function App et de cliquer sur Identity dans l’onglet Platform features.

 

Activation de l’identité managée par le système dans Azure Function App

 

Ensuite, dans les paramètres d’Identity, mettez le statut à On et cliquez sur Save pour enregistrer les modifications.

 

Activation de l’identité managée par le système dans Azure Function App

 

Notre Azure Function App possède maintenant une identité managée assignée par le système qui est « visible » pour Azure Key Vault.

 

Ajout d’une politique d’accès Key Vault au principal d’une Function App

 

Azure Key Vault ne peut être utilisé par un autre service cloud à moins qu’une politique d’accès n’ait été définie pour ce service.

Dans cette démonstration, nous avons créé un Azure Key Vault appelé keyvault-demo-mw. Nous allons à présent définir une politique d’accès pour que notre Function App Service puisse récupérer le secret du Key Vault.

Ouvrez tout d’abord le service Azure Key Vault puis cliquez sur Access policies dans le menu Settings. Cliquez ensuite sur + Add new pour ajouter une politique d’accès.

 

Ajout d’une politique d’accès Key Vault au principal d’une Function App

 

Choisissez ensuite Select principal et recherchez le nom de la Function App (functionapp-demo-mw dans notre cas). Grâce à l’identité que nous venons d’assigner à Azure Function App, functionapp-demo-mw apparaît dans la liste des principals. Nous pouvons donc le sélectionner et lui attribuer des permissions.

 

Ajout d’une politique d’accès Key Vault au principal d’une Function App

 

Une fois votre principal sélectionné, choisissez le menu Secret permissions. Dans notre cas, nous avons juste besoin de récupérer le secret du Key Vault (en l’occurrence, lire notre chaîne de connexion). Par conséquent, cochez uniquement la permission Get puis cliquez sur OK.

 

Ajout d’une politique d’accès Key Vault au principal d’une Function App

 

Pour finir, cliquez sur Save pour enregistrer la nouvelle politique d’accès functionapp-demo-mw.

 

Ajout d’une politique d’accès Key Vault au principal d’une Function App

 

Ajout d’un secret dans Azure Key Vault

 

Ajouter un secret dans Azure Key Vault est très simple. Dans le menu Settings de Key Vault, cliquez sur Secrets puis sur + Generate/Import secret.

 

Ajout d’un secret dans Azure Key Vault

 

Pour un secret Key Vault, deux informations doivent être renseignées : le nom et la valeur. Dans notre cas, nous avons nommé notre secret OrderManagementDbConnectionString. Et comme valeur, nous avons mis notre chaîne de connexion SQL Server. Cliquez sur Create pour enregistrer le secret.

 

Ajout d’un secret dans Azure Key Vault

 

Le secret est par défaut Enabled, ce qui signifie qu’il est prêt à être utilisé. Une fois le secret créé, nous avons besoin d’obtenir son URI (un emplacement unique qui identifie le secret). Allez dans le menu Settings et sélectionnez Secrets. Nous allons y trouver le secret que nous venons d’ajouter (OrderManagementDbConnectionString). Sélectionnez le secret. On remarquera que c’est l’unique version dans la liste.

 

Ajout d’un secret dans Azure Key Vault

 

Sélectionnez la version actuelle du secret et copiez son identifiant secret. L’identifiant est un URI de la forme : https://<url_de_la_paire_clé_valeur>/<nom_du_secret>/<version_du_secret>

 

Ajout d’un secret dans Azure Key Vault

 

Nous avons maintenant notre identifiant secret, et Azure Function App est en mesure de récupérer le secret depuis Azure Key Vault. Nous pouvons donc à présent l’utiliser dans notre Azure Function App.

 

Récupération d’un secret de Key Vault dans Azure Function App

 

Revenons à notre Azure Function App (functionapp-demo-mw). Dans la section Configured features de l’onglet Overview, cliquez sur Configuration.

 

Récupération d’un secret de Key Vault dans Azure Function App

Récupération d’un secret de Key Vault dans Azure Function App

 

Cliquez ensuite sur + New application settings. Saisissez un nom pour décrire le nouveau paramètre (nous avons mis OrderManagementConnectionString). Microsoft a ajouté, à la fin de l’année dernière, une option pour accéder aux sourcing Key Vault secrets directement depuis Application Settings. Cela simplifie grandement l’utilisation des secrets par rapport à autrefois. Donnez comme valeur au paramètre une référence secrète au format suivant :

@Microsoft.KeyVault(SecretUri=uri_du_secret_avec_version)

À la place de uri_du_secret_avec_version, mettez la valeur précédemment copiée à partir du secret dans Azure Key Vault.

 

Récupération d’un secret de Key Vault dans Azure Function App

 

Dans notre Azure Function, nous allons simplement récupérer la valeur dans Application Settings, et l’utiliser comme s’il s’agissait d’une chaîne de connexion directement stockée dans Application Settings.

 

// récupérer la valeur depuis Application Settings
var connectionString = Environment.GetEnvironmentVariable("OrderManagementConnectionString");
// créer la connexion
SqlConnection connection = new SqlConnection(connectionString);

 

Nous pouvons maintenant tester notre fonction. Elle renvoie une liste de produits extraits de la base de données OrderManagement.

 

Récupération d’un secret de Key Vault dans Azure Function App

 

L’Azure Function a obtenu de façon transparente une chaîne de connexion via la directive de sourcing @Microsoft.KeyVault dans Application Settings. Il n’est pas nécessaire d’installer tous les packages NuGet ni d’écrire du code pour récupérer un secret du Key Vault.

 

Résumé

 

Azure Key Vault est le bon endroit pour conserver les informations d’authentification pour votre application, de manière sûre et centralisée. Plus une solution Azure devient conséquente, plus il est pertinent de transférer ses secrets dans Key Vault. Grâce à la façon dont le secret sourcing permet d’utiliser les secrets dans leurs applications, les développeurs peuvent désormais se concentrer sur l’essentiel plutôt que d’aligner des lignes de code d’infrastructure.