Accéder à un coffre de clés privé depuis votre pipeline

Azure Key Vault offre un moyen sécurisé de gérer les informations d’identification, notamment les clés, les secrets et les certificats. En utilisant Azure Pipelines, vous pouvez simplifier le processus d’accès et d’utilisation de coffres de clés pour stocker et récupérer des informations d’identification.

Dans certains scénarios, les organisations hiérarchisent la sécurité en limitant l’accès aux coffres de clés exclusivement aux réseaux virtuels désignés Azure. Cette restriction garantit le niveau de sécurité le plus élevé pour les applications critiques. Dans ce tutoriel, vous allez apprendre à configurer l’authentification et à configurer l’accès entrant afin que votre pipeline puisse interroger et récupérer des données à partir d’un Azure Key Vault privé.

Prérequis

Produit Requirements
Azure DevOps - Une Azure DevOps organisation.
- Un projet Azure DevOps .
-Autorisations:
    - Pour accorder l’accès à tous les pipelines du projet : vous devez être membre du groupe Administrateurs de projet.
    - Pour créer des connexions de service : vous devez avoir le rôle Administrateur ou Créateur pour les connexions de service.
Azur - Un abonnement Azure
- Un coffre de clés Azure.

Accéder à un coffre de clés privé

Les développeurs peuvent utiliser Azure Pipelines pour lier un coffre de clés Azure à un groupe de variables et mapper des secrets de coffre sélectifs à celui-ci. Un coffre de clés utilisé comme groupe de variables peut être accessible :

  • À partir de Azure DevOps lors de la configuration du groupe de variables.
  • À partir d’un agent auto-hébergé pendant l’exécution d’un travail de pipeline.

Diagramme montrant les deux chemins d’accès différents pour accéder à un coffre de clés privé.

Pour configurer l’accès à votre coffre de clés privé, procédez comme suit :

  1. Créez un principal de service pour vous authentifier auprès de Azure ressources.
  2. Créez une connexion de service Azure Resource Manager dans Azure DevOps à l’aide du principal de service.
  3. Créez des informations d’identification fédérées pour votre principal de service dans Azure.

Créer un principal de service

Créez un principal de service pour vous authentifier auprès de Azure ressources :

  1. Accédez au portail Azure.

  2. Dans le menu supérieur, ouvrez Azure Cloud Shell, puis sélectionnez Bash.

  3. Exécutez la commande suivante pour créer un principal de service :

    az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
    
  4. Copiez la sortie de la commande. Vous avez besoin de ces valeurs à l’étape suivante lorsque vous créez la connexion de service.

Créer une connexion de service

Après avoir créé votre principal de service, utilisez ses valeurs de sortie pour créer une connexion de service Azure Resource Manager dans Azure DevOps.

  1. Connectez-vous à votre organisation Azure DevOps, puis accédez à votre projet.

  2. Sélectionnez Paramètres de projet>Connexions de service>Nouvelle connexion de service.

  3. Sélectionnez Azure Resource Manager, puis sélectionnez Suivant.

  4. Pour le type d’identité, sélectionnez Inscription d’application (automatique) dans le menu déroulant.

  5. Pour Credential, laissez la valeur recommandée par défaut : Charge de travail fédération d’identité.

  6. Pour le niveau d’étendue, sélectionnez Abonnement, puis sélectionnez votre abonnement dans le menu déroulant.

  7. Sélectionnez un groupe de ressources si vous souhaitez limiter l’accès au groupe de ressources spécifié uniquement.

  8. Entrez un nom pour votre connexion de service, puis cochez la case Accorder l’autorisation d’accès à tous les pipelines pour autoriser tous les pipelines à utiliser cette connexion de service.

  9. Cliquez sur Enregistrer.

    Screenshot qui montre comment configurer une connexion de service Azure Resource Manager pour un principal de service.

Créer des informations d’identification fédérées

Après avoir enregistré votre connexion de service, configurez des informations d’identification fédérées dans Azure pour établir l’approbation entre votre principal de service et Azure DevOps.

  1. Accédez au portail Azure, entrez l'ID client de votre principal de service dans la barre de recherche, puis sélectionnez votre application.

  2. Sous Gérer, sélectionnez Certificats et secrets>Informations d'identification fédérées.

  3. Sélectionnez Ajouter des informations d’identification, puis, pour le scénario d’informations d’identification fédérées, sélectionnez Autre émetteur.

  4. Pour l’émetteur, collez l’URL suivante pour remplacer l’espace réservé par le GUID de votre organisation. Vous trouverez l’ID de votre organisation en accédant aux paramètres Organization>Microsoft Entra. Téléchargez la liste des organisations Azure DevOps connectées à votre annuaire.

    https://login.microsoftonline.com/<TENANT_ID>/v2.0
    
  5. Pour l’identificateur d’objet, collez l’URL suivante. Remplacez les espaces réservés par le nom de votre organisation, le nom du projet et le nom de connexion de service.

    ENTRA_PREFIX/sc/ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAME
    
  6. Entrez un nom pour vos informations d’identification fédérées, puis sélectionnez Ajouter.

Créer une connexion de service

Après avoir créé votre principal de service, utilisez ses valeurs de sortie pour créer une connexion de service Azure Resource Manager dans Azure DevOps.

  1. Connectez-vous à votre organisation Azure DevOps, puis accédez à votre projet.

  2. Sélectionnez Paramètres de projet>Connexions de service>Nouvelle connexion de service.

  3. Sélectionnez Azure Resource Manager>Next, puis sélectionnez Service principal (manuel)>Next.

  4. Pour Environment, sélectionnez Azure Cloud et, pour le niveau Scope, sélectionnez Subscription. Entrez ensuite votre ID d’abonnement et votre nom d’abonnement.

  5. Entrez les informations de votre principal de service, puis sélectionnez Vérifier.

  6. Une fois la vérification réussie, nommez votre connexion de service, ajoutez une description, puis cochez la case Accorder l’autorisation d’accès à tous les pipelines . Sélectionnez Vérifier et enregistrer.

Conseil

Si vous ne pouvez pas vérifier la connexion de votre principal de service, accordez au principal de service l’accès Reader à votre abonnement.

Accéder à un coffre de clés privé à partir d’Azure DevOps

Cette section décrit deux méthodes d’accès à un coffre de clés privé à partir de Azure DevOps.

La première méthode utilise des groupes de variables pour lier et mapper des secrets à partir de votre coffre de clés, puis configurer l’accès entrant en autorisant les plages d’adresses IP statiques. Azure Pipelines utilise l’adresse IP publique Azure DevOps lors de l’interrogation d’un coffre de clés à partir d’un groupe de variables. Vous devez donc autoriser ces plages d’adresses IP dans le pare-feu du coffre de clés.

La deuxième méthode ajoute dynamiquement l’adresse IP de l’agent hébergé par Microsoft à la liste d’autorisation du pare-feu du coffre de clés au début du pipeline, interroge le coffre de clés, puis retire finalement l’adresse IP. Cette méthode est uniquement à des fins de démonstration et n’est pas recommandée pour une utilisation en production.

Étape 1 : Mapper les secrets du coffre de clés avec un groupe de variables

  1. Connectez-vous à votre organisation Azure DevOps, puis accédez à votre projet.

  2. Sélectionnez Pipelines>Bibliothèque, puis sélectionnez + Groupe de variables.

  3. Nommez votre groupe de variables, puis activez Lier les secrets d’un coffre de clés Azure en tant que variable.

  4. Sélectionnez la connexion de service que vous avez créée précédemment, sélectionnez votre coffre de clés, puis sélectionnez Autoriser.

  5. Sous Variables, sélectionnez Ajouter pour ajouter votre secret, puis sélectionnez Enregistrer.

Remarque

Vérifiez que votre connexion de service dispose des autorisations Get et List et que votre principal de service reçoit le rôle d’utilisateur Key Vault Secrets dans votre key vault privé.

Étape 1.1 : Configurer les autorisations de connexion de service

  1. Accédez à votre coffre de clés Azure, puis sélectionnez Stratégies d'accès.

  2. Sélectionnez Créer, puis, sous Autorisations secrètes, ajoutez les autorisations Obtenir et Répertorier , puis sélectionnez Suivant.

  3. Ajoutez votre connexion de service dans la barre de recherche, sélectionnez-la, puis sélectionnez Suivant.

  4. Sélectionnez Suivant une fois de plus, passez en revue vos paramètres, puis sélectionnez Vérifier + créer.

Étape 1.2 : Configurer les autorisations du principal de service

  1. Accédez à votre coffre de clés Azure, puis sélectionnez Access control (IAM).

  2. Sélectionnez Ajouter une>attribution de rôle, puis sélectionnez l’onglet Rôle .

  3. Sélectionnez le rôle Utilisateur des secrets Key Vault, puis sélectionnez Suivant.

  4. Choisissez Sélectionner des membres, ajoutez votre principal de service, puis sélectionnez Sélectionner.

  5. Sélectionnez Vérifier + attribuer.

  1. Connectez-vous à votre organisation Azure DevOps, puis accédez à votre projet.

  2. Sélectionnez Pipelines>Bibliothèque, puis sélectionnez + Groupe de variables.

  3. Nommez votre groupe de variables, puis activez Lier les secrets d’un coffre de clés Azure en tant que variable.

  4. Sélectionnez la connexion de service Azure que vous avez créée précédemment dans le menu déroulant, puis sélectionnez votre coffre de clés.

    Screenshot qui montre comment lier un groupe de variables à un coffre de clés Azure avec une erreur indiquant l’absence d’autorisations Get et List.

  5. Vous pouvez rencontrer le message d’erreur « La connexion de service Azure spécifiée doit disposer des autorisations de gestion des secrets "Obtenir, Répertorier" sur le coffre de clés sélectionné. Accédez à votre coffre de clés dans le portail Azure, puis sélectionnez Contrôle d'accès (IAM)>Ajouter une attribution de rôle>utilisateur des secrets du coffre de clés>Suivant. Ajoutez votre principal de service, puis sélectionnez Vérifier + affecter.

    Screenshot qui montre comment ajouter un principal de service en tant qu’utilisateur secret pour un coffre de clés Azure.

  6. Ajoutez vos secrets, puis sélectionnez Enregistrer.

Étape 2 : Configurer l’accès entrant à partir de Azure DevOps

Après avoir configuré votre groupe de variables, autorisez l'accès entrant à partir de Azure DevOps à votre coffre de clés en ajoutant les plages d'adresses IP statiques pour la région géographique de votre organisation.

  1. Connectez-vous à votre organisation Azure DevOps.

  2. Sélectionnez Paramètres de l’organisation.

  3. Accédez à Vue d’ensemble pour rechercher l’emplacement géographique.

    Screenshot qui montre comment trouver l’emplacement géographique de votre organisation Azure DevOps.

  4. Trouvez vos plages IP V4 géographiques.

    Important

    Pour les connexions entrantes vers les États-Unis, veillez à ajouter les plages d'adresses IP pour toutes les régions américaines.

  5. Configurez votre coffre de clés pour autoriser l’accès depuis des plages d’IP statiques.

Étape 3 : Interroger un coffre de clés privé avec un groupe de variables

Une fois votre groupe de variables lié et l’accès entrant configuré, utilisez le pipeline suivant pour interroger votre coffre de clés privé et copier le secret ainsi récupéré. Azure Pipelines utilise son adresse IP publique pour interroger le coffre de clés à partir d’un groupe de variables. Veillez donc à configurer l’accès entrant avant d’exécuter le pipeline.

variables:
-  group: mySecret-VG

steps:
- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Méthode alternative : autoriser dynamiquement l’adresse IP de l’agent hébergé par Microsoft

Dans cette approche, le pipeline interroge l’adresse IP de l’agent hébergé par Microsoft au démarrage, l’ajoute à la liste d’autorisation du pare-feu du coffre de clés, exécute les tâches liées au coffre de clés, puis supprime l’adresse IP avant que le pipeline se termine.

Remarque

Cette approche est uniquement à des fins de démonstration. Nous vous déconseillons cette approche pour Azure Pipelines.

- task: AzurePowerShell@5
  displayName: 'Allow agent IP'
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    azurePowerShellVersion: LatestVersion
    ScriptType: InlineScript
    Inline: |
     $ip = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
     Add-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -ResourceGroupName "YOUR_RESOURCE_GROUP_NAME" -IpAddressRange $ip
     echo "##vso[task.setvariable variable=agentIP]$ip"

- task: AzureKeyVault@2
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    KeyVaultName: 'YOUR_KEY_VAULT_NAME'
    SecretsFilter: '*'
    RunAsPreJob: false

- task: AzurePowerShell@5
  displayName: 'Remove agent IP'
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    azurePowerShellVersion: LatestVersion
    ScriptType: InlineScript
    Inline: |
     $ipRange = "$(agentIP)/32"
     Remove-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -IpAddressRange $ipRange
  condition: succeededOrFailed()

Important

Assurez-vous que le principal de service utilisé pour accéder à votre coffre de clés depuis votre pipeline dispose du rôle Contributeur Key Vault dans le contrôle d’accès (IAM) de votre coffre de clés.

Accéder à un coffre de clés privé depuis un agent auto-hébergé

Pour accéder à un coffre de clés privé à partir d’un agent Azure Pipelines, utilisez un agent auto-hébergé (Windows, Linux ou Mac) ou Virtual Machine Scale Sets agents. Les agents hébergés par Microsoft, comme d’autres services de calcul généraux, ne figurent pas dans la liste des services approuvés du coffre de clés.

Pour établir la connectivité à votre coffre de clés privé, configurez un point de terminaison privé pour un accès direct. Ce point de terminaison doit être routable et son nom DNS privé doit être résolu à partir de l’agent de pipeline auto-hébergé.

Étape 1 : Configurer l’accès entrant à partir d’un agent auto-hébergé

  1. Suivez les instructions pour créer un réseau virtuel.

  2. Dans le portail Azure, utilisez la barre de recherche en haut de la page pour rechercher votre coffre de clés Azure.

  3. Sélectionnez votre coffre de clés, puis accédez à Paramètres>réseau.

  4. Sélectionnez Connexions de point de terminaison privé, puis sélectionnez Créer pour créer un nouveau point de terminaison privé.

    Capture d'écran montrant comment créer un point de terminaison privé pour un coffre de clés Azure.

  5. Sélectionnez le groupe de ressources qui héberge le réseau virtuel que vous avez créé précédemment. Entrez un nom et un nom d’interface réseau pour votre instance, puis vérifiez que vous sélectionnez la même région que le réseau virtuel que vous avez créé précédemment. Sélectionnez Suivant.

    Screenshot qui montre comment configurer l’onglet Informations de base lorsque vous créez une instance de point de terminaison privé pour votre coffre de clés Azure.

  6. Pour la méthode Connection, sélectionnez Connecter à une ressource Azure dans mon répertoire. Pour Type de ressource, choisissez Microsoft. KeyVault/vaults dans le menu déroulant. Sélectionnez votre ressource dans le menu déroulant. La sous-ressource cible est renseignée automatiquement avec la valeur coffre. Sélectionnez Suivant.

    Screenshot qui montre comment configurer l’onglet Ressource lorsque vous créez une instance de point de terminaison privé pour votre coffre de clés Azure.

  7. Sous l’onglet Réseau virtuel, sélectionnez le virtual network et le sous-réseau que vous avez créés précédemment, puis laissez le reste des champs comme valeur par défaut. Sélectionnez Suivant.

  8. Acceptez les paramètres par défaut sous les onglets DNS et Balises . Sous l’onglet Vérifier + créer, sélectionnez Créer.

  9. Une fois votre ressource déployée, accédez à votre coffre de clés et sélectionnez Paramètres>Réseau> Connexions de point de terminaison privé. Votre point de terminaison privé doit être répertorié avec l’état de connexionapprouvé. Si vous créez un lien vers une ressource Azure dans un autre répertoire, vous devez attendre que le propriétaire de la ressource approuve votre demande de connexion.

    Capture d’écran montrant une connexion de point de terminaison privé approuvée

Étape 2 : Autoriser votre réseau virtuel

Une fois le point de terminaison privé configuré, autorisez le réseau virtuel qui héberge votre agent auto-hébergé dans les paramètres du pare-feu du coffre de clés.

  1. Accédez au portail Azure, puis recherchez votre coffre de clés Azure.

  2. Sélectionnez Paramètres>Mise en réseau, puis vérifiez que vous êtes sous l’onglet Pare-feux et réseaux virtuels.

  3. Sélectionnez Ajouter un réseau virtuel>Ajouter des réseaux virtuels existants.

  4. Sélectionnez votre abonnement dans le menu déroulant, sélectionnez le réseau virtuel que vous avez créé précédemment, puis sélectionnez vos sous-réseaux.

  5. Sélectionnez Ajouter, puis faites défiler vers le bas de la page, puis sélectionnez Appliquer pour enregistrer vos modifications.

    Capture d’écran montrant comment ajouter un réseau virtuel existant au pare-feu key vault.

Étape 3 : Interroger un Key Vault privé depuis un agent auto-hébergé

Une fois le réseau virtuel autorisé, utilisez le pipeline suivant pour interroger le coffre de clés privé via le groupe de variables associé depuis un agent auto-hébergé :

pool: Self-hosted-pool

variables:
  group: mySecret-VG

steps:
- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Si vous ne souhaitez pas accorder Azure DevOps'accès entrant à votre coffre de clés privé, utilisez la tâche AzureKeyVault pour interroger directement le coffre de clés. Dans ce cas, vérifiez que le réseau virtuel qui héberge votre agent auto-hébergé est autorisé dans les paramètres du pare-feu du coffre de clés.

pool: Self-hosted-pool

steps:
- task: AzureKeyVault@2
  inputs:
    azureSubscription: '$(SERVICE_CONNECTION_NAME)'
    keyVaultName: $(KEY_VAULT_NAME)
    SecretsFilter: '*'

- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Résolution des problèmes

Utilisez les conseils suivants pour résoudre les erreurs courantes d’accès au coffre de clés :

  • Public network access is disabled and request is not from a trusted service nor via an approved private link.

    Cette erreur indique que l’accès public est désactivé, mais aucun point de terminaison privé ni les exceptions de pare-feu requises ne sont configurés. Suivez les étapes décrites dans Configurer l’accès entrant à partir d’un agent auto-hébergé ou Configurer l’accès entrant à partir de Azure DevOps en fonction de votre scénario pour configurer l’accès à votre coffre de clés privé.

  • Request was not allowed by NSP rules and the client address is not authorized and caller was ignored because bypass is set to None Client address: <x.x.x.x>

    Cette erreur indique que l’accès public est désactivé, que l’option Autoriser les services Microsoft approuvés à contourner ce pare-feu n’est pas activée et que l’adresse IP du client ne figure pas dans la liste d’autorisation du pare-feu du coffre de clés. Dans le portail Azure, accédez à votre coffre de clés, sélectionnez Settings>Networking et ajoutez l’adresse IP du client à la liste verte du pare-feu.

  • Error: Client address is not authorized and caller is not a trusted service.

    Vérifiez que les plages IPv4 de votre région sont ajoutées à la liste d’autorisation du coffre de clés. Pour plus d’informations, consultez Configurer l’accès entrant à partir de Azure DevOps.

    Vous pouvez également consulter Autoriser dynamiquement l’adresse IP de l’agent hébergé par Microsoft pour ajouter l’adresse IP du client au pare-feu du coffre de clés lors de l’exécution.