Accéder à Azure DevOps avec l’identité de charge de travail Microsoft Entra

Azure DevOps Services

Note

Cette fonctionnalité est déployée cette semaine et la prochaine. Si vous ne voyez pas encore la fonctionnalité sur votre projet Azure DevOps Services, revenez en quelques jours.

Une connexion de service Azure DevOps permet à vos pipelines de s’authentifier auprès de Azure DevOps sans jetons d’accès personnels (PAT) à l’aide de Microsoft Entra identités de charge de travail. Les principaux de service et les identités managées accèdent à Azure DevOps via la fédération d'identité de charges de travail, une méthode sans secret qui élimine la nécessité de gérer et de renouveler les secrets.

Avantages

  • Authentification sans mot de passe : éliminez la nécessité de créer, stocker et faire pivoter des jetons d’accès personnels.
  • Privilège minimum : utilisez des autorisations par pipeline au lieu des autorisations de compte de service de build partagées.
  • Sécurité améliorée : Utilisez les informations d’identification fédérées Entra avec la rotation automatique des jetons.
  • Accès inter-organisationnel : Accéder aux ressources Azure DevOps dans différentes organisations via une seule connexion de service.
  • Audit trail : toutes les tentatives d’authentification sont enregistrées dans les journaux d’audit d’Azure DevOps.

Scénarios pris en charge

La connexion de service Azure DevOps prend en charge les scénarios suivants :

  • Ressources du référentiel : vérifier le code à partir des référentiels dans différentes organisations Azure DevOps.
  • flux Artifact : Accéder aux flux d'Azure Artifacts (NuGet, npm, Maven, Python, Cargo, Conda) dans les organisations sans PATs.
  • appels d’API REST : s’authentifier auprès des API REST d'Azure DevOps à partir de scripts intégrés.
  • Publication des extensions : Publiez des extensions sur le Visual Studio Marketplace.

Prerequisites

Pour créer une connexion de service Azure DevOps, vous avez besoin des éléments suivants :

Étape 1 : Créer une connexion de service au sein de la même organisation

Si votre principal de service se trouve dans la même organisation Azure DevOps que la connexion de service :

Ajouter le principal de service à votre organisation

  1. Dans votre organisation Azure DevOps, accédez à Organization Settings>Users.

  2. Sélectionnez Ajouter des utilisateurs.

  3. Entrez les détails du principal de service :

    • Nom : le principal de service ou le nom d’identité managée ou l’ID d’objet
    • Niveau d’accès : sélectionnez le niveau d’accès approprié. Utiliser Basic pour l’accès standard
  4. Affectez le principal de service ou l’identité managée au projet dans lequel vous allez créer la connexion de service, par exemple en l’ajoutant au groupe Lecteurs

  5. Sélectionnez Ajouter pour confirmer.

  6. Attribuer des autorisations de niveau de ressource supplémentaires au principal de service ou à l’identité managée

Étape 2 : Créer la connexion de service

  1. Dans votre Azure DevOps project, accédez à Project Settings>Service connections.

  2. Sélectionnez Nouvelle connexion de service.

  3. Sélectionnez Azure DevOps comme type de connexion de service.

  4. Remplissez le formulaire :

    • Identité : sélectionnez le principal de service que vous avez ajouté à votre organisation
    • Nom de la connexion de service : entrez un nom descriptif pour la connexion (par exemple, my-azdo-connection)
    • Description (facultatif) : Ajouter des détails sur l’objectif de la connexion
  5. Sélectionnez Enregistrer pour créer la connexion de service.

Créer une connexion de service pour l’accès inter-organisation

Pour accéder aux ressources d’une autre organisation Azure DevOps jointe au même locataire Entra ID :

  1. Suivez les étapes décrites dans Créer une connexion de service au sein de la même organisation, mais sélectionnez Autre organisation lors de la création de la connexion de service.

  2. Entrez le nom de l’organisation Azure DevOps cible.

  3. Vous devez également ajouter le principal de service en tant qu’utilisateur dans l’organisation cible.

Utiliser la connexion de service dans votre pipeline

Consulter les dépôts de différentes organisations

pool:
  vmImage: 'ubuntu-latest'

resources:
  repositories:
  - repository: external-repo
    type: git
    endpoint: my-azdo-connection
    name: 'external-project/external-repo'
    ref: 'refs/heads/main'

steps:
- checkout: self
- checkout: external-repo

Référencer un modèle d’une autre organisation

resources:
  repositories:
    - repository: templates 
      type: git
      endpoint: my-azdo-connection
      name: 'external-project/external-repo'
      ref: "refs/heads/main"    
      
steps:
- template: azdosc-template.yml@templates

Accéder aux flux d’artefacts

Utilisez la connexion de service avec les tâches d’authentification d’artefacts :

- task: NuGetAuthenticate@1
  inputs:
    nuGetServiceConnections: 'my-azdo-connection'

- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'
    projects: '**/*.csproj'

Appeler Azure DevOps à partir d’un script

- task: AzureCLI@3
  displayName: Secret-less
  inputs:
    connectionType: 'azureDevOps'
    azureDevOpsServiceConnection: 'my-azdo-connection'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az rest --method get `
              --url "https://status.dev.azure.com/_apis/status/health?api-version=7.1-preview.1" `
              --resource 499b84ac-1321-427f-aa17-267ca6975798 `
              --query "sort_by(services[?id=='Pipelines'].geographies | [], &name)" `
              -o table

      az devops configure -l

      az devops project list --query "value[].{Name:name, Id:id}" `
                            -o table

      az pipelines pool list --query "[].{Id:id, Name:name}" `
                            -o table

- task: AzureCLI@3
  displayName: Use Entra access token
  inputs:
    connectionType: 'azureDevOps'
    azureDevOpsServiceConnection: 'my-azdo-connection'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # Get access token for Azure DevOps
      $token = az account get-access-token --resource "499b84ac-1321-427f-aa17-267ca6975798" `
                                           --query "accessToken" `
                                           --output tsv
      
      # Use token in REST API call
      $headers = @{
        Authorization = "Bearer $token"
        "Content-Type" = "application/json"
      }
      
      $body = @{
        name = "Test Build"
      } | ConvertTo-Json
      
      Invoke-RestMethod -Uri "$(System.CollectionUri)$(System.TeamProject)/_apis/build/definitions?api-version=7.1" `
                        -Method POST `
                        -Headers $headers `
                        -Body $body

La tâche AzureCLI@3 utilise l’interface CLI Azure DevOps qui est préinstallée sur les agents hébergés Microsoft. Sur les agents auto-hébergés, vous avez besoin du Azure CLI avec l’extension azure-devops. Si l’extension azure-devops n’est pas installée, la tâche AzureCLI@3 l’installe au moment de l’exécution.

Bonnes pratiques de sécurité

  • Autorisations minimales : attribuez uniquement au principal de service les autorisations dont il a besoin pour vos tâches de pipeline spécifiques.
  • Accès à l'audit : passez régulièrement en revue les journaux d’audit pour surveiller l’utilisation de la connexion de service.
  • Utilisation de la portée : utilisez des connexions de service distinctes pour différents projets ou organisations afin de limiter les autorisations partagées.

Résolution des problèmes

Conseil / Astuce

Pour une meilleure sécurité, attribuez au principal de service uniquement les autorisations dont il a besoin, examinez régulièrement les journaux d’audit et utilisez des connexions de service distinctes pour différents projets ou organisations.

Échec de la création de la connexion de service

Cause : Le principal de service n’est pas ajouté à votre organisation ou vous ne disposez pas des autorisations requises.

Correctif :

  • Vérifiez que vous avez ajouté le principal de service en tant qu’utilisateur à votre organisation.
  • Vérifiez que vous disposez des autorisations appropriées pour créer des connexions de service.
  • Vérifiez que le principal de service a le niveau d’accès requis dans l’organisation.

Le pipeline ne parvient pas à s’authentifier

Cause : Le nom de la connexion de service ne correspond pas à la référence YAML, ou le principal de service ne dispose pas d’autorisations pour les ressources cibles.

Correctif :

  • Vérifiez que le nom de la connexion de service dans votre pipeline YAML correspond au nom que vous avez créé.
  • Vérifiez que le principal de service dispose des autorisations appropriées pour les ressources auxquelles vous accédez.
  • Vérifiez les journaux d’audit Azure DevOps pour les échecs d’authentification.
  • Reportez-vous aux questions fréquemment posées pour les principaux de service et les identités managées.
  • Pour les codes d’état AADSTS de Microsoft Entra, consultez la liste des messages d'erreur .

L’accès inter-organisations ne fonctionne pas

Cause : Vous n’avez pas ajouté le principal de service en tant qu’utilisateur dans les deux organisations, ou vous avez mal orthographié le nom de l’organisation cible.

Correctif :

  • Ajoutez le principal de service en tant qu’utilisateur dans les deux organisations.
  • Vérifiez que le nom de l’organisation cible est correctement orthographié dans la configuration de la connexion de service.
  • Vérifiez que le principal de service dispose des autorisations requises dans l’organisation cible.

Messages d'erreur courants

Message Signification et atténuation
ERREUR : TF401444 : Connectez-vous au moins une fois en tant que 72f988bf-86f1-41af-91ab-2d7cd011db47\72f988bf-86f1-41af-91ab-2d7cd011db47\115c3ab3-943b-4e0c-96ed-1a1763fbaa44 dans un navigateur web pour permettre l’accès au service. Vérifiez que vous avez ajouté le principal de service en tant qu’utilisateur à votre organisation.
L’identité managée / principal de service <sp/msi name> n’a pas accès à l'organisation Azure DevOps <org>. Vérifiez que l’identité a été ajoutée à l’organisation. Voir https://aka.ms/azdosc#prerequisites Ajoutez le principal de service en tant qu’utilisateur à l’organisation cible et affectez-le au projet requis.
Vous n’êtes pas autorisé à accéder à l’identité sélectionnée. La connexion de service est enregistrée en tant que brouillon. Pour terminer la configuration, contactez le propriétaire de l’identité pour créer des informations d’identification fédérées dans le portail Azure à l’aide de l’émetteur et de l’identificateur d’objet ci-dessous. L’utilisateur connecté ne dispose pas des autorisations suffisantes pour créer des informations d’identification fédérées. Suivez les instructions affichées pour créer des informations d’identification fédérées directement sur l’identité.
VS800075 : le projet avec l’ID « vstfs:///Classification/TeamProject/00000000-0000-00000000-000000000000 » n’existe pas ou vous n’êtes pas autorisé à y accéder. L’identité de connexion de service n’est pas ajoutée au projet. Accédez à la page des détails de la connexion de service >Afficher l’accès dans l’organisation actuelle>Membre de> Sélectionnez un groupe pour ajouter l’identité, par exemple, au Readers groupe. Accédez alternativement aux Paramètres de l'organisation>Utilisateurs> L’identité utilisée pour la connexion > de service Gérer l'accès> sélectionnez les projets auxquels l’identité doit accéder.

messages d’erreur Microsoft Entra ID

Le tableau suivant répertorie les codes d'erreur courants de Microsoft Entra ID et les problèmes possibles liés aux connexions du service d'identité pour la charge de travail :

Message Problème possible
AADSTS700016 : L'application avec l'identifiant '****' n'a pas été trouvée L’identité utilisée pour la connexion de service n’existe plus, a peut-être été supprimée de la connexion de service, ou est mal configurée. Si vous configurez la connexion de service manuellement avec une identité pré-créée, vérifiez la configuration de appID/clientId.
AADSTS7000215 : clé secrète client non valide fournie. Vous utilisez une connexion de service possédant un secret qui a expiré. Convertissez la connexion de service en fédération d’identité de charge de travail et remplacez le secret expiré par des informations d’identification fédérées.
AADSTS700024 : l’assertion du client n’est pas dans son intervalle de temps valide Si l'erreur se produit après environ 1 heure, utilisez plutôt une connexion de service avec fédération d'identité de charge de travail et une identité gérée. Les jetons d'identité gérés ont une durée de validité d'environ 24 heures.
Si l’erreur se produit avant 1 heure, mais après 10 minutes, déplacez les commandes qui (implicitement) demandent un jeton d’accès pour accéder à Azure stockage au début de votre script. Le jeton d'accès sera mis en cache pour les commandes suivantes.
AADSTS70021 : aucun enregistrement d’identité fédéré correspondant n’a été trouvé pour l’assertion présentée. Émetteur d’assertion : https://app.vstoken.visualstudio.com. Aucune information d’identification fédérée n’a été créée, ou l’URL de l’émetteur est incorrecte. L’URL de l’émetteur correcte a le format https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Vous pouvez corriger l’URL de l’émetteur en modifiant et en enregistrant une connexion de service. Si Azure DevOps n’a pas créé votre identité, vous devez mettre à jour manuellement l'émetteur. Vous pouvez trouver l’émetteur correct dans la boîte de dialogue d’édition de la connexion de service ou dans la réponse si vous utilisez l’API REST.
AADSTS70021 : aucun enregistrement d’identité fédéré correspondant n’a été trouvé pour l’assertion présentée. Émetteur d’assertion : https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Objet de l’assertion : sc://<org>/<project>/<service-connection>. L’URL de l’émetteur ou le sujet de fédération ne sont pas identiques. L’organisation ou le projet Azure DevOps a été renommé ou une connexion de service créée manuellement a été renommée sans mettre à jour le sujet de fédération sur l’identité.
AADSTS700211 : Aucun enregistrement d’identité fédérée correspondant trouvé pour l’émetteur de l’assertion présenté Aucun justificatif fédéré n’a été créé ou l’URL de l’émetteur n’est pas correcte.
AADSTS700213 : Aucun enregistrement d’identité fédérée correspondant trouvé pour le sujet de l’assertion présentée Aucun justificatif fédéré n’a été créé ou le sujet n’est pas correct.
AADSTS700223 La fédération d'identités de charge de travail est limitée ou désactivée sur le locataire Microsoft Entra. Dans ce scénario, il est possible d’utiliser plutôt une identité managée pour la fédération. Pour plus d’informations, consultez Identité de charge de travail avec identité managée.
AADSTS70025 : L’application cliente n’a pas de justificatifs d’identité fédérée configurés Assurez-vous que les justificatifs fédérés sont configurés sur l’enregistrement d’App ou l’identité managée.
Microsoft Entra a rejeté le jeton émis par Azure DevOps avec le code d’erreur AADSTS700238 La fédération d'identité de charge de travail a été limitée sur le locataire Microsoft Entra. L’émetteur de votre organisation (https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) n’est pas autorisé à utiliser la fédération d’identité de charge de travail avec le type d’identité de charge de travail (inscription d’application et/ou identité managée) que vous utilisez. Demandez à votre administrateur de locataire Microsoft Entra ou à votre équipe d'administration d'autoriser la fédération des identités de charge de travail pour votre organisation Azure DevOps.
AADSTS70052 : l’identité doit être une identité managée, une application cliente unique ou un compte de service Les inscriptions d’applications mutualisées qui ont signInAudience: AzureADMultipleOrgs ne sont actuellement pas prises en charge par l’émetteur Microsoft Entra. Utilisez signInAudience: AzureADMyOrg et divisez l'accès à plusieurs locataires afin d'utiliser des connexions de service distinctes pour chaque locataire. Si vous dépendez des opérations ARM qui accèdent à plusieurs locataires dans une seule requête (par exemple, Peering des réseaux virtuels), vous pouvez contacter le support pour que votre organisation Azure DevOps utilise plutôt l'émetteur Azure DevOps.
AADSTS900382 : Le client confidentiel n’est pas pris en charge dans Cross Cloud Certains clouds souverains bloquent la fédération de l'identité de charge de travail.

L’erreur AADSTS que vous voyez ne figure-t-elle pas dans la liste ci-dessus ? Consultez les codes d'erreur d'authentification et d'autorisation de Microsoft Entra.

Étapes suivantes