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.
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.
Nous allons examiner ces étapes de plus près dans les chapitres suivants.
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.
Ensuite, dans les paramètres d’Identity, mettez le statut à On et cliquez sur Save pour enregistrer les modifications.
Notre Azure Function App possède maintenant une identité managée assignée par le système qui est « visible » pour Azure Key Vault.
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.
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.
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.
Pour finir, cliquez sur Save pour enregistrer la nouvelle politique d’accès functionapp-demo-mw.
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.
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.
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.
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>
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.
Revenons à notre Azure Function App (functionapp-demo-mw). Dans la section Configured features de l’onglet Overview, cliquez sur Configuration.
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.
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.
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.
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.