Tutoriel : Créer une application de fonction se connectant aux services Azure à l’aide d’identités plutôt que de secrets
Ce tutoriel vous montre comment configurer une application de fonction à l’aide d’identités Microsoft Entra plutôt que de secrets ou de chaînes de connexion, dans la mesure du possible. L’utilisation d’identités vous permet d’éviter une fuite accidentelle de secrets sensibles et peut offrir une meilleure visibilité de la façon dont les données sont accessibles. Pour en savoir plus sur les connexions basées sur l’identité, consultez Configurer une connexion basée sur l’identité.
Même si les procédures indiquées fonctionnent généralement pour tous les langages, ce tutoriel prend plus particulièrement en charge les fonctions de bibliothèque de classes C# sur Windows.
Dans ce tutoriel, vous allez apprendre à :
- Créer une application de fonction dans Azure à l’aide d’un modèle ARM
- Activer les identités managées affectées par le système et les identités managées affectées par l’utilisateur sur l’application de fonction
- Créer des attributions de rôles qui accordent des autorisations à d’autres ressources
- Déplacer les secrets qui ne peuvent pas être remplacés par des identités dans Azure Key Vault
- Configurer une application pour se connecter au stockage hôte par défaut à l’aide de son identité managée
Une fois ce tutoriel terminé, vous devez parcourir le tutoriel suivant qui montre comment utiliser des connexions basées sur l’identité plutôt que des secrets avec des déclencheurs et des liaisons.
Prérequis
Compte Azure avec un abonnement actif. Créez un compte gratuitement.
Le SDK .NET 6.0
Azure Functions Core Tools version 4.x
Pourquoi utiliser l’identité ?
La gestion des secrets et des informations d’identification est un défi courant pour les équipes de toutes tailles. Les secrets doivent être sécurisés contre le vol ou les divulgations accidentelles, et il pourrait être nécessaire de les alterner régulièrement. De nombreux services Azure vous permettent d’utiliser à la place une identité dans Microsoft Entra ID pour authentifier les clients et effectuer des vérifications par rapport à des autorisations qui peuvent être modifiées et révoquées rapidement. Cette utilisation permet de mieux contrôler la sécurité des applications, avec moins de traitement opérationnel. Une identité peut être un utilisateur humain, tel que le développeur d’une application, ou une application en cours d’exécution dans Azure avec une identité managée.
Étant donné que certains services ne prennent pas en charge l’authentification Microsoft Entra, vos applications pourraient toujours nécessiter des secrets dans certains cas. Toutefois, ces secrets peuvent être stockés dans Azure Key Vault, ce qui permet de simplifier le cycle de vie de gestion de vos secrets. L’accès à un coffre de clés est également contrôlé avec des identités.
En comprenant comment utiliser des identités plutôt que des secrets quand c’est possible et comment utiliser Key Vault quand ça ne l’est pas, vous réduisez les risques, diminuez les frais opérationnels et améliorez globalement la posture de sécurité pour vos applications.
Créer une application de fonction utilisant Key Vault pour les secrets nécessaires
Azure Files est un exemple de service qui ne prend pas encore en charge l’authentification Microsoft Entra pour les partages de fichiers SMB (Server Message Block). Azure Files est le système de fichiers par défaut pour les déploiements Windows sur les plans Premium et Consommation. Nous pourrions supprimer entièrement Azure Files, mais cette action introduit des limitations que vous ne souhaiterez peut-être pas. Au lieu de cela, déplacez la chaîne de connexion Azure Files dans Azure Key Vault. De cette façon, elle est gérée de manière centralisée, avec l’accès contrôlé par l’identité.
Créer un Azure Key Vault
Tout d’abord, vous avez besoin d’un coffre de clés pour y stocker les secrets. Configurez-le pour qu’il utilise le contrôle d’accès en fonction du rôle (RBAC) Azure afin de déterminer qui peut lire les secrets depuis le coffre.
Dans le portail Azure, choisissez Créer une ressource (+) .
Dans la page Créer une ressource, sélectionnez Sécurité>Key Vaut.
Dans la page Informations de base, configurez le coffre de clés à l’aide du tableau suivant.
Option Valeur suggérée Description Abonnement Votre abonnement Abonnement sous lequel est créée cette nouvelle application de fonction est créée. Groupe de ressources myResourceGroup Nom du nouveau groupe de ressources dans lequel vous créez votre application de fonction. Nom du coffre de clés Nom globalement unique Nom qui identifie votre nouveau coffre de clés. Le nom du coffre doit contenir uniquement des caractères alphanumériques et des tirets, et ne peut pas commencer par un nombre. Niveau tarifaire Standard Options de facturation. Le niveau Standard est suffisant pour ce tutoriel. Région Région recommandée Choisissez une région près de chez vous ou près d’autres services auxquels ont accès vos fonctions. Utilisez les sélections par défaut pour les sections « Options de récupération ».
Notez le nom que vous avez utilisé pour le réutiliser ultérieurement.
Sélectionnez Suivant : stratégie d’accès pour accéder à l’onglet Stratégie d’accès.
Sous Modèle d’autorisation, choisissez Contrôle d’accès en fonction du rôle Azure
Sélectionnez Revoir + créer. Passez en revue la configuration, puis sélectionnez Créer.
Configurer une identité et des autorisations pour l’application
Pour utiliser Azure Key Vault, votre application doit avoir une identité qui peut se voir accorder l’autorisation de lire les secrets. Cette application utilise une identité affectée par l’utilisateur pour que les autorisations puissent être configurées avant même la création de l’application. Si vous souhaitez en savoir plus sur les identités managées pour Azure Functions, veuillez consulter la rubrique Guide pratique pour utiliser des identités managées dans Azure Functions.
Dans le portail Azure, choisissez Créer une ressource (+) .
Dans la page Créer une ressource, sélectionnez Identité>Identité managée affectée par l’utilisateur.
Dans la page Informations de base, configurez l’identité à l’aide du tableau suivant.
Option Valeur suggérée Description Abonnement Votre abonnement Abonnement sous lequel est créée cette nouvelle application de fonction est créée. Groupe de ressources myResourceGroup Nom du nouveau groupe de ressources dans lequel vous créez votre application de fonction. Région Région recommandée Choisissez une région près de chez vous ou près d’autres services auxquels ont accès vos fonctions. Nom Nom globalement unique Nom qui identifie votre nouvelle identité affectée par l’utilisateur. Sélectionnez Revoir + créer. Passez en revue la configuration, puis sélectionnez Créer.
Lorsque l’identité est créée, accédez-y dans le portail. Sélectionnez Propriétés, puis notez l’ID de la ressource pour utilisation ultérieure.
Sélectionnez Attributions de rôles Azure, puis sélectionnez Ajouter une attribution de rôle (préversion).
Dans la page Ajouter une attribution de rôle (préversion), utilisez les options comme indiqué dans le tableau suivant.
Option Valeur suggérée Description Portée Key Vault Une étendue est un ensemble de ressources auxquelles s’applique l’attribution de rôle. La portée a des niveaux hérités à des niveaux inférieurs. Par exemple, si vous sélectionnez une étendue d’abonnement, l’attribution de rôle s’applique à tous les groupes de ressources et à toutes les ressources de l’abonnement. Abonnement Votre abonnement Abonnement sous lequel est créée cette nouvelle application de fonction est créée. Ressource Votre coffre de clés Le coffre de clés que vous avez créé précédemment. Rôle Utilisateur des secrets Key Vault Un rôle est une collection d’autorisations qui sont accordées. Le rôle Utilisateur des secrets Key Vault autorise l’identité à lire les valeurs de secret à partir du coffre. Sélectionnez Enregistrer. L’affichage du rôle peut prendre une minute ou deux lorsque vous actualisez la liste des attributions de rôles pour l’identité.
L’identité peut maintenant lire les secrets stockés dans le coffre de clés. Plus loin dans ce tutoriel, vous ajoutez des attributions de rôles supplémentaires à des fins différentes.
Générer un modèle pour créer une application de fonction
L’expérience du portail pour la création d’une application de fonction n’interagit pas avec Azure Key Vault. Par conséquent, vous devez générer, puis modifier un modèle Azure Resource Manager. Vous pouvez ensuite utiliser ce modèle pour créer votre application de fonction référençant la chaîne de connexion Azure Files à partir de votre coffre de clés.
Important
Ne créez pas l’application de fonction tant que vous n’avez pas modifié le modèle ARM. La configuration Azure Files doit être effectuée au moment de la création de l’application.
Dans le portail Azure, choisissez Créer une ressource (+) .
Dans la page Créer une ressource, sélectionnez Calcul>Application de fonction.
Dans la page Informations de base, utilisez l’application de fonction comme indiqué dans le tableau ci-dessous.
Option Valeur suggérée Description Abonnement Votre abonnement Abonnement sous lequel est créée cette nouvelle application de fonction est créée. Groupe de ressources myResourceGroup Nom du nouveau groupe de ressources dans lequel vous créez votre application de fonction. Nom de l’application de fonction Nom globalement unique Nom qui identifie votre nouvelle Function App. Les caractères valides sont a-z
(insensible à la casse),0-9
et-
.Publier Code Choix de publier des fichiers de code ou un conteneur Docker. Pile d’exécution .NET Ce tutoriel utilise .NET. Région Région recommandée Choisissez une région près de chez vous ou près d’autres services auxquels ont accès vos fonctions. Sélectionnez Revoir + créer. Votre application utilise les valeurs par défaut de la page Hébergement et Supervision. Vérifiez les options par défaut incluses dans le modèle ARM que vous générez.
Au lieu de créer votre application de fonction ici, choisissez Télécharger un modèle pour automation, à droite du bouton Suivant.
Dans la page du modèle, sélectionnez Déployer, puis dans la page Déploiement personnalisé, sélectionnez Modifier le modèle.
Modifier le modèle
Vous modifiez maintenant le modèle pour stocker la chaîne de connexion Azure Files dans Key Vault et permettre à votre application de fonction de la référencer. Avant de poursuivre, assurez-vous de disposer des valeurs suivantes définies dans les sections précédentes :
- ID de ressource de l’identité affectée par l’utilisateur
- nom de votre coffre de clés
Notes
Si vous deviez créer un modèle complet pour l’automatisation, vous pourriez inclure des définitions pour les ressources d’identité et d’attribution de rôle, avec les clauses dependsOn
appropriées. Cela remplacerait les étapes précédentes qui utilisaient le portail. Consultez les conseils Azure Resource Manager et la documentation propre à chaque service.
Dans l’éditeur, recherchez l’emplacement où le tableau
resources
commence. Avant la définition de la fonction d’application, ajoutez la section suivante qui place la chaîne de connexion Azure Files dans Key Vault. Remplacez « VAULT_NAME » par le nom de votre coffre de clés.{ "type": "Microsoft.KeyVault/vaults/secrets", "apiVersion": "2016-10-01", "name": "VAULT_NAME/azurefilesconnectionstring", "properties": { "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]" }, "dependsOn": [ "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]" ] },
Dans la définition de la ressource d’application de fonction (qui a la valeur
type
définie surMicrosoft.Web/sites
), ajoutezMicrosoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring
au tableaudependsOn
. À nouveau, remplacez « VAULT_NAME » par le nom de votre coffre de clés. Cette action empêche la création de votre application avant la définition du secret. Le tableaudependsOn
doit ressembler à l’exemple qui suit :{ "type": "Microsoft.Web/sites", "apiVersion": "2018-11-01", "name": "[parameters('name')]", "location": "[parameters('location')]", "tags": null, "dependsOn": [ "microsoft.insights/components/idcxntut", "Microsoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring", "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]", "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]" ], // ... }
Ajoutez le bloc
identity
de l’exemple suivant dans la définition de votre ressource d’application de fonction. Remplacez « IDENTITY_RESOURCE_ID » par l’ID de ressource de votre identité affectée par l’utilisateur.{ "apiVersion": "2018-11-01", "name": "[parameters('name')]", "type": "Microsoft.Web/sites", "kind": "functionapp", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned,UserAssigned", "userAssignedIdentities": { "IDENTITY_RESOURCE_ID": {} } }, "tags": null, // ... }
Ce bloc
identity
définit également une identité affectée par le système, que vous allez utiliser ultérieurement dans ce tutoriel.Ajoutez la propriété
keyVaultReferenceIdentity
à l’objetproperties
pour l’application de fonction, comme dans l’exemple suivant. Remplacez « IDENTITY_RESOURCE_ID » par l’ID de ressource de votre identité affectée par l’utilisateur.{ // ... "properties": { "name": "[parameters('name')]", "keyVaultReferenceIdentity": "IDENTITY_RESOURCE_ID", // ... } }
Vous avez besoin de cette configuration car une application peut avoir plusieurs identités affectées par l’utilisateur configurées. Chaque fois que vous souhaitez utiliser une identité affectée par l’utilisateur, vous devez la spécifier avec un ID. Les identités affectées par le système n’ont pas besoin d’être spécifiées de cette façon, car une application ne peut en avoir qu’une. De nombreuses fonctionnalités qui utilisent une identité managée supposent qu’elles doivent utiliser celle affectée par défaut par le système.
Recherchez les objets JSON qui définissent le paramètre d’application
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
, ce qui doit ressembler à l’exemple suivant :{ "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]" },
Remplacez le champ
value
par une référence au secret, comme indiqué dans l’exemple suivant. Remplacez « VAULT_NAME » par le nom de votre coffre de clés.{ "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", "value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(resourceId('Microsoft.KeyVault/vaults/secrets', 'VAULT_NAME', 'azurefilesconnectionstring')).secretUri, ')')]" },
Sélectionnez Enregistrer pour enregistrer le modèle ARM mis à jour.
Déployer le modèle modifié
Assurez-vous que vos options de création, y compris Groupe de ressources, sont toujours correctes, puis sélectionnez Vérifier + créer.
Une fois votre modèle validé, notez le Nom de votre compte de stockage, car vous utiliserez ce compte ultérieurement. Enfin, sélectionnez Créer pour créer vos ressources Azure et déployer votre code dans l’application de fonction.
Une fois le déploiement terminé, sélectionnez Accéder au groupe de ressources, puis sélectionnez la nouvelle application de fonction.
Félicitations ! Vous avez correctement créé votre application de fonction pour référencer la chaîne de connexion Azure Files à partir d’Azure Key Vault.
Chaque fois que votre application doit ajouter une référence à un secret, vous devez simplement définir un nouveau paramètre d’application pointant vers la valeur stockée dans Key Vault. Si vous souhaitez en savoir plus, veuillez consulter la rubrique Références Key Vault pour Azure Functions.
Conseil
La chaîne de connexion Application Insights et sa clé d’instrumentation incluse ne sont pas considérées comme des secrets et peuvent être récupérées à partir d’App Insights à l’aide d’autorisations Lecteur. Vous n’avez pas besoin de les déplacer dans Key Vault, même si cela est bien sûr possible.
Utiliser une identité managée pour AzureWebJobsStorage
Vous utilisez ensuite l’identité affectée par le système que vous avez configurée dans les étapes précédentes pour la connexion AzureWebJobsStorage
. AzureWebJobsStorage
est utilisé par le runtime Functions et par plusieurs déclencheurs et liaisons pour assurer la coordination entre plusieurs instances en cours d’exécution. Ce système est obligatoire pour que votre application de fonction fonctionne, et comme Azure Files, il est configuré avec une chaîne de connexion par défaut lorsque vous créez une application de fonction.
Accorder à l’identité affectée par le système l’accès au compte de stockage
Comme pour les étapes que vous avez précédemment suivies avec l’identité affectée par l’utilisateur et votre coffre de clés, vous créez maintenant une attribution de rôle qui accorde à votre compte de stockage l’accès à l’identité affectée par le système.
Dans le portail Azure, accédez au compte de stockage qui a été créé précédemment avec votre application de fonction.
Sélectionnez Contrôle d’accès (IAM) . C’est sur cette page que vous pouvez afficher et configurer qui a accès à la ressource.
Sélectionnez Ajouter, puis Ajouter une attribution de rôle.
Recherchez Propriétaire des données Blob du stockage, sélectionnez-le, puis sélectionnez Suivant.
Dans l’onglet Membres, sous Attribuer l’accès à, choisissez Identité managée
Sélectionnez Sélectionner des membres pour ouvrir le volet Sélectionner des identités managées.
Vérifiez que l’Abonnement est celui dans lequel vous avez créé les ressources précédemment.
Dans le sélecteur Identité managée, choisissez Application de fonction dans la catégorie Identité managée affectée par le système. Un nombre entre parenthèses est sans doute affiché en regard de l’étiquette Application de fonction, indiquant le nombre d’applications de l’abonnement ayant des identités affectées par le système.
Votre application doit apparaître dans une liste sous les champs d’entrée. Si vous ne la voyez pas, vous pouvez utiliser la zone Sélectionner pour filtrer les résultats avec le nom de votre application.
Sélectionnez votre application. Elle doit descendre dans la section Membres sélectionnés. Choisissez Sélectionner.
Dans la page Ajouter une attribution de rôle, sélectionnez Vérifier + attribuer. Vérifiez la configuration, puis sélectionnez Vérifier + attribuer.
Conseil
Si vous avez l’intention d’utiliser l’application de fonction pour une fonction déclenchée par un blob, vous devrez répéter ces étapes pour les rôles Contributeur de compte de stockage et Contributeur aux données en file d’attente du stockage sur le compte utilisé par AzureWebJobsStorage. Pour en savoir plus, consultez Connexions basées sur l’identité avec déclencheur blob.
Modifier la configuration d’AzureWebJobsStorage
Vous mettez ensuite à jour votre application de fonction afin d’utiliser son identité affectée par le système lorsqu’elle utilise le service BLOB pour le stockage hôte.
Important
La configuration d’AzureWebJobsStorage
est utilisée par certains déclencheurs et liaisons, et ces extensions doivent également pouvoir utiliser des connexions basées sur l’identité. Les applications qui utilisent des déclencheurs d’objet blob ou de hub d’événements peuvent avoir besoin de mettre à jour ces extensions. Étant donné qu’aucune fonction n’a été définie pour cette application, il n’y a pas encore de problème. Pour en savoir plus sur cette exigence, consultez Connexion au stockage hôte à l’aide d’une identité.
De même, AzureWebJobsStorage
est utilisé pour les artefacts de déploiement lors d’une utilisation de la génération côté serveur dans le plan Consommation Linux. Lorsque vous activez les connexions basées sur l’identité pour AzureWebJobsStorage
dans le plan Consommation Linux, vous devez effectuer le déploiement via un package de déploiement externe.
Sur le portail Azure, accédez à votre application de fonction.
Dans votre application de fonction, développez Paramètres, puis sélectionnez Variables d’environnement.
Dans l’onglet Paramètres de l’application, sélectionnez le paramètre d’application AzureWebJobsStorage, puis modifiez-le en fonction du tableau suivant :
Option Valeur suggérée Description Nom AzureWebJobsStorage__accountName Modifiez le nom spécifié pour AzureWebJobsStorage avec le nom exact AzureWebJobsStorage__accountName
. Ce paramètre dit à l’hôte d’utiliser l’identité au lieu de rechercher un secret stocké. Le nouveau paramètre utilise un trait de soulignement double (__
), qui est un caractère spécial dans les paramètres d’application.Valeur Nom de votre compte Mettez à jour le nom figurant dans la chaîne de connexion vers votre nom StorageAccountName. Cette configuration dit au système d’utiliser une identité pour se connecter à la ressource.
Sélectionnez Appliquer, puis Appliquer et Confirmer pour enregistrer vos modifications, puis redémarrer la fonction de l’application.
Vous avez maintenant supprimé l’exigence de chaîne de connexion de stockage pour AzureWebJobsStorage en configurant votre application pour qu’elle se connecte plutôt à des objets blob à l’aide d’identités managées.
Remarque
La syntaxe __accountName
est unique à la connexion AzureWebJobsStorage et ne peut pas être utilisée pour d’autres connexions de stockage. Pour apprendre à définir d’autres connexions, consultez la référence de chaque déclencheur et liaison que votre application utilise.
Étapes suivantes
Ce tutoriel vous a montré comment créer une application de fonction sans stocker de secrets dans sa configuration.
Passez au prochain tutoriel pour apprendre à utiliser des identités dans des connexions de déclencheurs et de liaisons.