Le Blog Amazon Web Services

Comment fédérer AWS depuis Azure DevOps en utilisant OpenID Connect

Dans ce blog post, nous allons montrer comment utiliser les options OpenID Connect (OIDC) du AWS Toolkit for Azure DevOps version 1.15.0+ en fédérant l’accès dans les comptes AWS et obtenir des informations d’identification temporaire sans gérer d’identifiant statique de AWS Identity and Access Management (IAM).

Introduction

Azure DevOps Pipelines permet de créer, de tester et de déployer en continu sur différentes plateformes et clouds. Le Toolkit for Azure DevOps, une extension gratuite disponible pour les environnements hébergés et sur site, simplifie la gestion des ressources AWS. Le Toolkit for Azure Devops s’intègre aux services AWS clés tels que Amazon Simple Storage Service (Amazon S3), AWS CodeDeploy, AWS Lambda, AWS CloudFormation, et Amazon Simple Queue Service (Amazon SQS).

Azure DevOps prend désormais en charge la fédération d’identité des applications. Combinées aux capacités OIDC du AWS Toolkit, les équipes peuvent exploiter la gestion native des identités pour déployer et accéder aux ressources AWS en utilisant les contrôles IAM standard. Le processus utilise un jeton fourni par Azure DevOps pour appeler le AWS Security Token Service (STS), qui génère des informations d’identification de sécurité temporaires et à privilèges limités, conformément aux bonnes pratiques de sécurité. La figure 1 illustre le flux d’obtention et d’utilisation des informations d’identification du service AWS STS via la fédération.

informations d'identification Azure DevOps via AWS STS FlowFigure 1 – informations d’identification Azure DevOps via AWS STS Flow

Aperçu de haut niveau

Note : Comme ce blog post utilise IAM dans le cadre de la solution, il nécessitera au minimum l’autorisation de CreateRole, ListOpenIDConnectProviders et CreateOpenIDConnectProvider. Dans la plupart des cas, vous devriez attacher des autorisations au rôle, mais ce n’est pas nécessaire dans notre exemple.

  1. Créez un pipeline YAML dans Azure DevOps et récupérer le GUID de l’organisation.
  2. Configurez un fournisseur d’identité dans AWS pour la fédération OIDC.
  3. Créez un rôle IAM dans AWS qui peut être assumé par le fournisseur d’identité.
  4. Exécutez le pipeline Azure DevOps pour confirmer la réussite de la fédération.

Prérequis

  • Un compte AWS avec des autorisations suffisantes pour créer des fournisseurs IAM, des rôles IAM, et des politiques IAM
  • Un projet Azure DevOps avec accès pour configurer des connexions de service, qui sont des connexions authentifiées entre Azure Pipelines et des services externes ou distants.
  • La version 1.15 ou ultérieure de AWS Toolkit for Azure DevOps doit être installée pour ce projet. Consultez la marketplace Visual Studio pour obtenir les instructions d’installation.

Création d’une pipeline YAML dans Azure DevOps et récupérer le GUID de l’organisation

Pour la configuration du fournisseur d’identité dans AWS, nous aurons besoin du GUID de l’organisation d’Azure DevOps. Tout d’abord, nous devons créer une connexion de service qui fera référence à un rôle IAM nommé azdo-federation que nous créerons plus tard.

Depuis les paramètres de votre projet Azure DevOps (Project Settings):

  1. Sous Pipelines, sélectionnez Service Connections.
  2. Sélectionnez New service connection.
  3. Choisissez AWS, puis cliquez sur Next.
  4. Dans Role to Assume, utilisez l’ARN du rôle pour notre exemple nous utiliserons un rôle nommé azdo-federation, pour obtenir l’ARN remplacez votre ID de compte AWS dans ce qui suit : arn:aws:iam::123456789012:role/azdo-federation.
  5. (Optionnel) Le champ Role Session Name s’il est laissé vide prendra par défaut aws-vsts-tools, vous pouvez saisir une autre valeur ici.
  6. Cochez l’option use OIDC.
  7. Pour le Service Connection Name, utilisez aws-oidc-federation.
  8. Sélectionnez Save.

Obtention du GUID de l’organisation auprès d’Azure DevOps en exécutant le pipeline

Note : Comme la configuration est incomplète, notre pipeline échouera mais les informations nécessaires pour configurer un fournisseur d’identité seront disponibles dans les journaux.

Depuis vos pipelines de projet Azure DevOps :

  1. Sélectionnez New pipeline.
  2. Choisissez Azure Repos Git.
  3. Sélectionnez Starter Pipeline.
  4. Copiez et collez le code YAML suivant, en ajustant awsCredentials pour le nom de connection du service et le regionName.
# Sample pipeline to test connectivity to AWS (adjust service connection name (awsCredentials), and regionName as needed)

trigger:
    - main

pool:
    vmImage: ubuntu-latest

variables:
  aws.rolecredential.maxduration: "3600" # Can be set from 900 - 43200s
  
steps:
    - task: AWSCLI@1
      displayName: "Running aws-cli get-caller-identity"
      # continueOnError: true # If you need the pipeline to succeed
      inputs:
        awsCredentials: "aws-oidc-federation"
        regionName: 'aws-region-name'
        awsCommand: 'sts'
        awsSubCommand: 'get-caller-identity'
  1. Sélectionnez Save and run.

Après quelques secondes, votre pipeline vous demandera l’autorisation d’utiliser la connexion au service (Figure 2).

pipeline Azure DevOps nécessite une autorisation pour utiliser la connexion au service

Figure 2 : le pipeline Azure DevOps nécessite une autorisation pour utiliser la connexion au service

 

Sélectionnez View et passez en revue les informations pour accorder l’autorisation à l’aide du bouton Permit.

Après l’exécution de la pipeline, vérifiez les journaux de la tâche nommée Running aws-cli get-caller-identity pour une ligne commençant par OIDC Token generated. À partir de là, vous aurez le issuer, l’audience et le subject nécessaires pour le reste de la configuration (Figure 3).

- Journaux de la tâche Running aws-cli get-caller-identity

Figure 3 – Journaux de la tâche Running aws-cli get-caller-identity

Avec ces informations, nous pouvons créer le fournisseur d’identité dans notre compte AWS.

Configuration du fournisseur d’identité dans AWS pour la fédération OIDC

Dans cette étape, nous utiliserons l’émetteur (issuer) obtenu à partir des journaux.

Dans la console AWS IAM, suivez ces étapes :

  1. Dans le menu de gauche sous Gestion des accès, sélectionnez Fournisseurs d’identité.
  2. Sélectionnez Ajouter un fournisseur.
  3. Choisissez OpenID Connect comme type de fournisseur.
  4. Dans l’URL du fournisseur, utilisez l’URL de l’émetteur (issuer) obtenue dans la section précédente. Chaque organisation d’Azure DevOps disposera d’un OrganizationGUID unique, le format attendu est https://vstoken.dev.azure.com/{OrganizationGUID}.
  5. Dans le champ Audience, utilisez api://AzureAdTokenExchange. C’est une valeur fixe pour Azure DevOps. Elle a également été trouvée dans les journaux de l’exécution de la pipeline.
  6. Sélectionnez Ajouter un fournisseur.
  7. Notez l’ARN du fournisseur nouvellement créé, il sera nécessaire à l’étape suivante.

Création d’un rôle IAM dans AWS qui peut être assumé à partir du fournisseur d’identité

Un rôle IAM est une entité qui permet d’attribuer des autorisations spécifiques. Pour contrôler qui peut utiliser ce rôle et sous quelles conditions, nous utilisons une politique d’approbation. Pour suivre le principe du moindre privilège, nous ajouterons une condition dans la politique d’approbation afin que seule une connexion de service spécifique d’Azure DevOps puisse utiliser le rôle IAM que nous créons. Azure DevOps transmet la connexion de service dans le champ subject comme suit : « sc://{NomOrganisation}/{NomProjet}/{NomConnexionService} ».

Continuez depuis la console AWS IAM :

Dans cette étape, nous utiliserons le « subject » obtenu des journaux lors de notre première exécution. Le format attendu est sc://{NomOrganisation}/{NomProjet}/{NomConnexionService}.

  1. Sous Gestion des accès, sélectionnez Rôles
  2. Sélectionnez Créer un rôle.
  3. Pour Type d’entitée approuvée, sélectionnez Identité Web.
  4. Sélectionnez le bon fournisseur d’identité dans le menu déroulant, il commence par vstoken.dev.azure.com/{OrganizationGUID}
  5. Dans la liste déroulante Audience, sélectionnez api://AzureADTokenExchange
  6. Pour limiter ce rôle à une seule connexion de service, nous ajouterons une condition. Sous Condition, sélectionnez Ajouter une condition, dans Clé, sélectionnez vstoken.dev.azure.com/{OrganizationGUID}:sub. Dans Condition, sélectionnez StringEquals. Pour la Valeur, utilisez le subject obtenu des journaux, il devrait avoir ce format : sc://{NomOrganisation}/{NomProjet}/{NomConnexionService}
  7. Sélectionnez Suivant, vous pouvez laisser les permissions vides car notre pipeline valide uniquement notre identité, mais dans un pipeline réel, c’est ici que vous attacheriez la politique nécessaire.
  8. Sélectionnez Suivant, saisissez azdo-federation comme nom de rôle, vérifiez les détails.

Voici la politique d’approbation complète. Remplacez le texte en gras avec les bons identifiants.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::123456789012:oidc-provider/vstoken.dev.azure.com/{OrganizationGUID}"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "vstoken.dev.azure.com/00000000-0000-0000-0000-000000000000:aud": "api://AzureADTokenExchange",
          "vstoken.dev.azure.com/00000000-0000-0000-0000-000000000000:sub": "sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}"
        }
      }
    }
  ]
}
  1. Sélectionnez Créer un rôle.

Exécution de la pipeline Azure DevOps pour confirmer la fédération réussie

À ce stade, si nous exécutons à nouveau la pipeline que nous avons créé, la fédération devrait maintenant réussir et nous fournir un résultat similaire du journal des tâches (Figure 4).

– Journaux de la tâche aws-cli get-caller-identity

Figure 4 – Journaux de la tâche aws-cli get-caller-identity

Modifications nécessaires aux pipelines/tâches existants

Vous venez d’apprendre à utiliser OIDC dans vos pipelines. Cette option ne nécessite pas de modifications de votre tâche actuelle. Pour mettre à jour vos pipelines, vous devez reconfigurer la connexion de service pour activer l’option use OIDC, le rôle à assumer, et supprimer les clés d’accès/secrètes statiques (si définies).

Utilisation de la fédération avec d’autres outils

Bien que le AWS Toolkit for Azure DevOps fournisse des tâches pour de nombreux services AWS, il ne couvre pas tous les cas d’utilisation. Cette technique de fédération peut être utilisée avec n’importe quel outil tiers car elle fournit des identifiants temporaires comme le fournisseur standardisé de base des SDK AWS.

En utilisant la tâche AWSShellScript, nous allons configurer les identifiants AWS pour qu’ils puissent être utilisés par les outils dans le pipeline. Notre exemple d’utilisation sera Terraform. De plus, si vous avez des processus de longue durée, vous pouvez ajuster la variable aws.rolecredential.maxduration dans votre pipeline pour vous assurer que vos informations d’identification restent valides pendant toute la durée de la tâche (de 900 à 43200 secondes).

Voici un exemple de pipeline qui réalise cela avec Terraform :

# Sample pipeline that pass AWS credential to another task

trigger:
- main

variables:
  aws.rolecredential.maxduration: "3600" # Duration in seconds of the temporary credentials, can be set from 900 - 43200

pool:
  vmImage: ubuntu-latest

steps:
- task: AWSShellScript@1
  continueOnError: true
  displayName: "Running aws-cli get-caller-identity"
  inputs:
    awsCredentials: "aws-oidc-federation"
    regionName: "aws-region-name"
    scriptType: inline
    inlineScript: |
      terraform init
      terraform apply -auto-approve

Et la sortie correspondante appelant la source de données du fournisseur de données aws_caller_identity (Figure 5).

Sortie de la tâche terraform utilisant la source de données aws_caller_identityFigure 5 – Sortie de la tâche terraform utilisant la source de données aws_caller_identity

Si vous avez besoin d’aide pour configurer l’état terraform pour utiliser un bucket Amazon S3, vous pouvez consulter la documentation Terraform pour le stockage backend S3.

Nettoyage

Dans votre compte AWS, supprimez le rôle IAM et le fournisseur d’identité qui ont été créés pour supprimer tout droit d’accès depuis Azure DevOps.

Dans Azure DevOps, supprimez la connexion de service, le pipeline créé et les fichiers qui ont été poussés dans le dépôt.

Conclusion

Avec cette nouvelle fonctionnalité faisant partie d’AWS Toolkit for Azure DevOps, vous pouvez maintenant vous appuyer sur les meilleures pratiques d’utilisation d’identifiants temporaires sans avoir à provisionner et de faire la rotation des clés statiques ou des utilisateurs IAM. Cela vous permettra d’utiliser un rôle IAM avec des identifiants temporaires, minimisant le besoin de rotation des identifiants et réduisant les besoins opérationnels. Vous pouvez contrôler la durée de session pour les identifiants, vous offrant une flexibilité maximale dans la sécurisation de votre environnement.

Pour aller plus loin : AWS Toolkit pour Azure DevOps Marketplace

Benoît Mariaux

Mathieu Bruneau

Mathieu Bruneau est Spécialiste Containers chez Amazon Web Services Canada. Il fait le pont entre les équipes d’Opérations et les équipes de Développements. Mathieu est basé à Montréal, Canada et aime passer du temps avec sa femme et ses 3 garçons et lancer quelques frisbees.