{"id":534,"date":"2026-02-25T07:39:53","date_gmt":"2026-02-25T06:39:53","guid":{"rendered":"https:\/\/secure-pipelines.com\/?p=534"},"modified":"2026-03-24T12:58:43","modified_gmt":"2026-03-24T11:58:43","slug":"lab-configuring-oidc-workload-identity-github-actions-aws","status":"publish","type":"post","link":"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-configuring-oidc-workload-identity-github-actions-aws\/","title":{"rendered":"Lab : Configuration du Workload Identity OIDC pour GitHub Actions avec AWS"},"content":{"rendered":"<h2>Aper\u00e7u<\/h2>\n<p>Si vos workflows GitHub Actions s&rsquo;authentifient aupr\u00e8s d&rsquo;AWS en utilisant <code>AWS_ACCESS_KEY_ID<\/code> et <code>AWS_SECRET_ACCESS_KEY<\/code> stock\u00e9s comme secrets de d\u00e9p\u00f4t, vous avez un s\u00e9rieux probl\u00e8me de s\u00e9curit\u00e9. Ces credentials \u00e0 longue dur\u00e9e de vie n&rsquo;expirent jamais d&rsquo;eux-m\u00eames, peuvent \u00eatre exfiltr\u00e9s par n&rsquo;importe quelle \u00e9tape du workflow (y compris les actions tierces), et donnent aux attaquants un acc\u00e8s persistant \u00e0 votre compte AWS en cas de compromission.<\/p>\n<p>La f\u00e9d\u00e9ration OpenID Connect (OIDC) \u00e9limine enti\u00e8rement ce risque. Au lieu de stocker des credentials AWS statiques dans GitHub, votre workflow demande un jeton OIDC \u00e0 courte dur\u00e9e de vie aupr\u00e8s du fournisseur d&rsquo;identit\u00e9 de GitHub. AWS valide ce jeton, v\u00e9rifie les claims (d\u00e9p\u00f4t, branche, environnement), et \u00e9met des credentials temporaires qui expirent en quelques minutes. Aucun secret n&rsquo;est stock\u00e9 nulle part \u2014 la relation de confiance est \u00e9tablie entre le fournisseur OIDC de GitHub et votre r\u00f4le IAM AWS.<\/p>\n<p>Dans ce lab pratique, vous allez :<\/p>\n<ul>\n<li>Mettre en place la configuration de base non s\u00e9curis\u00e9e (cl\u00e9s AWS statiques) afin de comprendre ce que vous remplacez<\/li>\n<li>Cr\u00e9er un fournisseur d&rsquo;identit\u00e9 OIDC dans AWS qui fait confiance \u00e0 GitHub Actions<\/li>\n<li>Cr\u00e9er un r\u00f4le IAM avec une politique de confiance limit\u00e9e \u00e0 votre d\u00e9p\u00f4t et branche sp\u00e9cifiques<\/li>\n<li>Mettre \u00e0 jour votre workflow GitHub Actions pour utiliser l&rsquo;authentification OIDC<\/li>\n<li>Impl\u00e9menter des contr\u00f4les d&rsquo;acc\u00e8s bas\u00e9s sur les branches et les environnements<\/li>\n<li>Auditer les \u00e9v\u00e9nements d&rsquo;authentification OIDC dans CloudTrail<\/li>\n<li>Supprimer les anciens credentials statiques pour finaliser la migration<\/li>\n<\/ul>\n<p>\u00c0 la fin de ce lab, votre pipeline CI\/CD n&rsquo;aura aucun credential AWS stock\u00e9, et chaque \u00e9v\u00e9nement d&rsquo;authentification sera tra\u00e7able jusqu&rsquo;\u00e0 un d\u00e9p\u00f4t, une branche, un commit et une ex\u00e9cution de workflow sp\u00e9cifiques.<\/p>\n<h2>Pr\u00e9requis<\/h2>\n<p>Avant de commencer ce lab, assurez-vous de disposer des \u00e9l\u00e9ments suivants :<\/p>\n<ul>\n<li><strong>Compte AWS<\/strong> avec un acc\u00e8s administratif IAM (capacit\u00e9 \u00e0 cr\u00e9er des fournisseurs d&rsquo;identit\u00e9, des r\u00f4les et des politiques)<\/li>\n<li><strong>Compte GitHub<\/strong> avec un d\u00e9p\u00f4t que vous contr\u00f4lez (le niveau gratuit est suffisant)<\/li>\n<li><strong>AWS CLI v2<\/strong> install\u00e9 et configur\u00e9 localement (<code>aws --version<\/code> doit retourner 2.x)<\/li>\n<li><strong>Terraform v1.5+<\/strong> (optionnel mais recommand\u00e9 \u2014 ce lab fournit les instructions Console et Terraform)<\/li>\n<li><strong>Compr\u00e9hension de base des r\u00f4les IAM<\/strong>, des politiques de confiance et de la syntaxe des workflows GitHub Actions<\/li>\n<\/ul>\n<p>Dur\u00e9e estim\u00e9e : <strong>60 \u00e0 90 minutes<\/strong><\/p>\n<h2>Configuration de l&rsquo;environnement : la base non s\u00e9curis\u00e9e<\/h2>\n<p>Avant d&rsquo;impl\u00e9menter OIDC, \u00e9tablissons le mod\u00e8le non s\u00e9curis\u00e9 que vous allez remplacer. Cela rend l&rsquo;am\u00e9lioration de la s\u00e9curit\u00e9 concr\u00e8te et vous donne un workflow fonctionnel \u00e0 migrer.<\/p>\n<h3>\u00c9tape 1 : Cr\u00e9er un d\u00e9p\u00f4t de test<\/h3>\n<p>Cr\u00e9ez un nouveau d\u00e9p\u00f4t GitHub appel\u00e9 <code>oidc-lab<\/code>. Initialisez-le avec un README et clonez-le localement :<\/p>\n<pre><code class=\"language-bash\">gh repo create oidc-lab --public --clone\ncd oidc-lab<\/code><\/pre>\n<h3>\u00c9tape 2 : Stocker les credentials AWS comme secrets GitHub (la m\u00e9thode non s\u00e9curis\u00e9e)<\/h3>\n<p>Si vous avez un utilisateur IAM existant avec un acc\u00e8s programmatique, stockez ses credentials comme secrets GitHub :<\/p>\n<pre><code class=\"language-bash\">gh secret set AWS_ACCESS_KEY_ID --body \"AKIAIOSFODNN7EXAMPLE\"\ngh secret set AWS_SECRET_ACCESS_KEY --body \"wJalrXUtnFEMI\/K7MDENG\/bPxRfiCYEXAMPLEKEY\"<\/code><\/pre>\n<p><strong>Pourquoi c&rsquo;est dangereux :<\/strong><\/p>\n<ul>\n<li><strong>Pas d&rsquo;expiration :<\/strong> Ces credentials sont valides jusqu&rsquo;\u00e0 rotation ou suppression manuelle. En cas de fuite, un attaquant a un acc\u00e8s ind\u00e9fini.<\/li>\n<li><strong>Exposition large :<\/strong> Chaque ex\u00e9cution de workflow, chaque fork (si public), et chaque action tierce dans votre workflow peut lire ces secrets.<\/li>\n<li><strong>Pas de piste d&rsquo;audit granulaire :<\/strong> CloudTrail montre l&rsquo;utilisateur IAM, mais pas quel d\u00e9p\u00f4t, quelle branche ou quel workflow a d\u00e9clench\u00e9 l&rsquo;appel API.<\/li>\n<li><strong>Charge de rotation :<\/strong> Vous devez manuellement faire la rotation de ces cl\u00e9s et mettre \u00e0 jour les secrets GitHub \u2014 un processus souvent n\u00e9glig\u00e9.<\/li>\n<\/ul>\n<h3>\u00c9tape 3 : Cr\u00e9er le workflow de base non s\u00e9curis\u00e9<\/h3>\n<p>Cr\u00e9ez <code>.github\/workflows\/deploy.yml<\/code> avec des credentials statiques :<\/p>\n<pre><code class=\"language-yaml\">name: Deploy (Insecure - Static Keys)\n\non:\n  push:\n    branches: [main]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions\/checkout@v4\n\n      - name: Configure AWS Credentials (INSECURE)\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: us-east-1\n\n      - name: Verify Identity\n        run: aws sts get-caller-identity\n\n      - name: List S3 Buckets\n        run: aws s3 ls<\/code><\/pre>\n<p>Committez et poussez ce workflow. Confirmez qu&rsquo;il s&rsquo;ex\u00e9cute avec succ\u00e8s \u2014 c&rsquo;est la base que vous allez remplacer par OIDC.<\/p>\n<h2>Exercice 1 : Cr\u00e9er le fournisseur d&rsquo;identit\u00e9 OIDC dans AWS<\/h2>\n<p>La premi\u00e8re \u00e9tape de la f\u00e9d\u00e9ration OIDC consiste \u00e0 indiquer \u00e0 AWS de faire confiance au fournisseur d&rsquo;identit\u00e9 de GitHub. C&rsquo;est une configuration unique par compte AWS.<\/p>\n<h3>Option A : Console AWS<\/h3>\n<ol>\n<li>Ouvrez la <strong>Console IAM<\/strong> \u2192 <strong>Fournisseurs d&rsquo;identit\u00e9<\/strong> \u2192 <strong>Ajouter un fournisseur<\/strong><\/li>\n<li>S\u00e9lectionnez <strong>OpenID Connect<\/strong><\/li>\n<li>Pour <strong>URL du fournisseur<\/strong>, entrez : <code>https:\/\/token.actions.githubusercontent.com<\/code><\/li>\n<li>Cliquez sur <strong>Obtenir l&#8217;empreinte<\/strong> (AWS r\u00e9cup\u00e8re et valide le certificat TLS)<\/li>\n<li>Pour <strong>Audience<\/strong>, entrez : <code>sts.amazonaws.com<\/code><\/li>\n<li>Cliquez sur <strong>Ajouter le fournisseur<\/strong><\/li>\n<\/ol>\n<h3>Option B : AWS CLI<\/h3>\n<pre><code class=\"language-bash\"># Obtenir l'empreinte du fournisseur OIDC de GitHub\n# Depuis 2024, l'empreinte de GitHub est g\u00e9r\u00e9e par AWS et auto-v\u00e9rifi\u00e9e\n# Vous pouvez la r\u00e9cup\u00e9rer avec :\nTHUMBPRINT=$(openssl s_client -servername token.actions.githubusercontent.com \\\n  -showcerts -connect token.actions.githubusercontent.com:443 &lt; \/dev\/null 2&gt;\/dev\/null \\\n  | openssl x509 -fingerprint -noout \\\n  | cut -d'=' -f2 \\\n  | tr -d ':' \\\n  | tr '[:upper:]' '[:lower:]')\n\naws iam create-open-id-connect-provider \\\n  --url https:\/\/token.actions.githubusercontent.com \\\n  --client-id-list sts.amazonaws.com \\\n  --thumbprint-list \"$THUMBPRINT\"<\/code><\/pre>\n<h3>Option C : Terraform<\/h3>\n<pre><code class=\"language-hcl\">resource \"aws_iam_openid_connect_provider\" \"github\" {\n  url             = \"https:\/\/token.actions.githubusercontent.com\"\n  client_id_list  = [\"sts.amazonaws.com\"]\n  thumbprint_list = [\"6938fd4d98bab03faadb97b34396831e3780aea1\"]\n\n  tags = {\n    Name        = \"GitHub Actions OIDC\"\n    Environment = \"shared\"\n    ManagedBy   = \"terraform\"\n  }\n}<\/code><\/pre>\n<p><strong>Note :<\/strong> AWS v\u00e9rifie d\u00e9sormais automatiquement l&#8217;empreinte du fournisseur OIDC de GitHub. La valeur de l&#8217;empreinte dans la ressource Terraform est requise par l&rsquo;API mais AWS validera la cha\u00eene de certificats quelle que soit la valeur fournie.<\/p>\n<h3>V\u00e9rification<\/h3>\n<p>Confirmez que le fournisseur a \u00e9t\u00e9 cr\u00e9\u00e9 :<\/p>\n<pre><code class=\"language-bash\">aws iam list-open-id-connect-providers<\/code><\/pre>\n<p>Vous devriez voir un ARN comme :<\/p>\n<pre><code>arn:aws:iam::123456789012:oidc-provider\/token.actions.githubusercontent.com<\/code><\/pre>\n<h2>Exercice 2 : Cr\u00e9er le r\u00f4le IAM avec la politique de confiance<\/h2>\n<p>Cr\u00e9ez maintenant un r\u00f4le IAM que GitHub Actions peut assumer via OIDC. La politique de confiance est la partie la plus critique \u2014 elle d\u00e9termine exactement quels d\u00e9p\u00f4ts, branches et environnements peuvent assumer ce r\u00f4le.<\/p>\n<h3>\u00c9tape 1 : Cr\u00e9er la politique de confiance<\/h3>\n<p>Enregistrez ce qui suit dans <code>trust-policy.json<\/code>. Remplacez <code>123456789012<\/code> par votre ID de compte AWS, et <code>myorg\/myrepo<\/code> par votre organisation et d\u00e9p\u00f4t GitHub :<\/p>\n<pre><code class=\"language-json\">{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"Federated\": \"arn:aws:iam::123456789012:oidc-provider\/token.actions.githubusercontent.com\"\n      },\n      \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"token.actions.githubusercontent.com:aud\": \"sts.amazonaws.com\"\n        },\n        \"StringLike\": {\n          \"token.actions.githubusercontent.com:sub\": \"repo:myorg\/myrepo:ref:refs\/heads\/main\"\n        }\n      }\n    }\n  ]\n}<\/code><\/pre>\n<h3>Comprendre les champs de la politique de confiance<\/h3>\n<ul>\n<li><strong><code>Principal.Federated<\/code><\/strong> \u2014 L&rsquo;ARN du fournisseur OIDC GitHub que vous avez cr\u00e9\u00e9 dans l&rsquo;exercice 1. Cela indique \u00e0 AWS quel fournisseur d&rsquo;identit\u00e9 approuver.<\/li>\n<li><strong><code>Action: sts:AssumeRoleWithWebIdentity<\/code><\/strong> \u2014 L&rsquo;action STS sp\u00e9cifique pour la f\u00e9d\u00e9ration OIDC. Elle est diff\u00e9rente de <code>sts:AssumeRole<\/code> (utilis\u00e9e pour les r\u00f4les inter-comptes) ou <code>sts:AssumeRoleWithSAML<\/code> (utilis\u00e9e pour la f\u00e9d\u00e9ration SAML).<\/li>\n<li><strong><code>Condition.StringEquals.aud<\/code><\/strong> \u2014 Valide le claim d&rsquo;audience dans le jeton OIDC. Cela doit \u00eatre <code>sts.amazonaws.com<\/code> pour correspondre \u00e0 ce que l&rsquo;action <code>configure-aws-credentials<\/code> envoie.<\/li>\n<li><strong><code>Condition.StringLike.sub<\/code><\/strong> \u2014 Valide le claim de sujet. C&rsquo;est le contr\u00f4le de s\u00e9curit\u00e9 le plus important. Le sujet contient le d\u00e9p\u00f4t, le type de ref et la valeur de ref. L&rsquo;utilisation de <code>StringLike<\/code> avec des caract\u00e8res g\u00e9n\u00e9riques permet une correspondance flexible, tandis que <code>StringEquals<\/code> exige une correspondance exacte.<\/li>\n<\/ul>\n<h3>\u00c9tape 2 : Cr\u00e9er le r\u00f4le IAM<\/h3>\n<pre><code class=\"language-bash\">aws iam create-role \\\n  --role-name github-actions-deploy \\\n  --assume-role-policy-document file:\/\/trust-policy.json \\\n  --description \"Role for GitHub Actions OIDC deployment\" \\\n  --max-session-duration 3600<\/code><\/pre>\n<h3>\u00c9tape 3 : Attacher une politique IAM minimale<\/h3>\n<p>Suivez le principe du moindre privil\u00e8ge. Pour ce lab, attachez une politique qui accorde un acc\u00e8s en lecture seule \u00e0 un bucket S3 sp\u00e9cifique :<\/p>\n<pre><code class=\"language-json\">{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"s3:GetObject\",\n        \"s3:ListBucket\"\n      ],\n      \"Resource\": [\n        \"arn:aws:s3:::my-deployment-bucket\",\n        \"arn:aws:s3:::my-deployment-bucket\/*\"\n      ]\n    }\n  ]\n}<\/code><\/pre>\n<pre><code class=\"language-bash\"># Enregistrez ce qui pr\u00e9c\u00e8de dans permissions-policy.json, puis :\naws iam put-role-policy \\\n  --role-name github-actions-deploy \\\n  --policy-name S3ReadAccess \\\n  --policy-document file:\/\/permissions-policy.json<\/code><\/pre>\n<h3>\u00c9quivalent Terraform<\/h3>\n<pre><code class=\"language-hcl\">data \"aws_iam_policy_document\" \"github_actions_trust\" {\n  statement {\n    effect  = \"Allow\"\n    actions = [\"sts:AssumeRoleWithWebIdentity\"]\n\n    principals {\n      type        = \"Federated\"\n      identifiers = [aws_iam_openid_connect_provider.github.arn]\n    }\n\n    condition {\n      test     = \"StringEquals\"\n      variable = \"token.actions.githubusercontent.com:aud\"\n      values   = [\"sts.amazonaws.com\"]\n    }\n\n    condition {\n      test     = \"StringLike\"\n      variable = \"token.actions.githubusercontent.com:sub\"\n      values   = [\"repo:myorg\/myrepo:ref:refs\/heads\/main\"]\n    }\n  }\n}\n\nresource \"aws_iam_role\" \"github_actions_deploy\" {\n  name                 = \"github-actions-deploy\"\n  assume_role_policy   = data.aws_iam_policy_document.github_actions_trust.json\n  max_session_duration = 3600\n\n  tags = {\n    Name      = \"GitHub Actions Deploy\"\n    ManagedBy = \"terraform\"\n  }\n}\n\nresource \"aws_iam_role_policy\" \"s3_read\" {\n  name = \"S3ReadAccess\"\n  role = aws_iam_role.github_actions_deploy.id\n\n  policy = jsonencode({\n    Version = \"2012-10-17\"\n    Statement = [\n      {\n        Effect = \"Allow\"\n        Action = [\n          \"s3:GetObject\",\n          \"s3:ListBucket\"\n        ]\n        Resource = [\n          \"arn:aws:s3:::my-deployment-bucket\",\n          \"arn:aws:s3:::my-deployment-bucket\/*\"\n        ]\n      }\n    ]\n  })\n}<\/code><\/pre>\n<h3>V\u00e9rification<\/h3>\n<pre><code class=\"language-bash\"># Confirmez que le r\u00f4le existe et poss\u00e8de la bonne politique de confiance\naws iam get-role --role-name github-actions-deploy \\\n  --query 'Role.AssumeRolePolicyDocument' --output json<\/code><\/pre>\n<h2>Exercice 3 : Mettre \u00e0 jour le workflow GitHub Actions<\/h2>\n<p>Remplacez maintenant le workflow avec credentials statiques par l&rsquo;authentification OIDC. C&rsquo;est l&rsquo;\u00e9tape principale de la migration.<\/p>\n<h3>\u00c9tape 1 : Mettre \u00e0 jour le workflow<\/h3>\n<p>Remplacez le contenu de <code>.github\/workflows\/deploy.yml<\/code> par ce qui suit :<\/p>\n<pre><code class=\"language-yaml\">name: Deploy (Secure - OIDC)\n\non:\n  push:\n    branches: [main]\n\npermissions:\n  id-token: write   # Requis pour la demande de jeton OIDC\n  contents: read     # Requis pour actions\/checkout\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions\/checkout@v4\n\n      - name: Configure AWS Credentials via OIDC\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::123456789012:role\/github-actions-deploy\n          role-session-name: github-actions-${{ github.run_id }}\n          aws-region: us-east-1\n\n      - name: Verify Identity\n        run: |\n          aws sts get-caller-identity\n          echo \"Successfully authenticated via OIDC!\"\n\n      - name: List S3 Bucket Contents\n        run: aws s3 ls s3:\/\/my-deployment-bucket\/<\/code><\/pre>\n<h3>Changements cl\u00e9s expliqu\u00e9s<\/h3>\n<ul>\n<li><strong><code>permissions: id-token: write<\/code><\/strong> \u2014 C&rsquo;est obligatoire. Cela accorde au workflow la permission de demander un jeton OIDC aupr\u00e8s du fournisseur d&rsquo;identit\u00e9 de GitHub. Sans cela, l&rsquo;action <code>configure-aws-credentials<\/code> ne peut pas obtenir de jeton.<\/li>\n<li><strong><code>permissions: contents: read<\/code><\/strong> \u2014 Lorsque vous d\u00e9finissez une permission explicite, toutes les autres permissions sont par d\u00e9faut \u00e0 <code>none<\/code>. Vous devez explicitement accorder <code>contents: read<\/code> pour que <code>actions\/checkout<\/code> fonctionne.<\/li>\n<li><strong><code>role-to-assume<\/code><\/strong> \u2014 L&rsquo;ARN du r\u00f4le IAM cr\u00e9\u00e9 dans l&rsquo;exercice 2. L&rsquo;action appellera <code>sts:AssumeRoleWithWebIdentity<\/code> en utilisant le jeton OIDC.<\/li>\n<li><strong><code>role-session-name<\/code><\/strong> \u2014 Un nom de session descriptif qui appara\u00eet dans CloudTrail. Inclure le <code>github.run_id<\/code> rend chaque session tra\u00e7able jusqu&rsquo;\u00e0 une ex\u00e9cution de workflow sp\u00e9cifique.<\/li>\n<li><strong>Pas de <code>aws-access-key-id<\/code> ni <code>aws-secret-access-key<\/code><\/strong> \u2014 Ces champs sont compl\u00e8tement supprim\u00e9s. L&rsquo;action d\u00e9tecte que <code>role-to-assume<\/code> est d\u00e9fini sans credentials statiques et utilise automatiquement OIDC.<\/li>\n<\/ul>\n<h3>\u00c9tape 2 : Pousser et v\u00e9rifier<\/h3>\n<pre><code class=\"language-bash\">git add .github\/workflows\/deploy.yml\ngit commit -m \"Migrate to OIDC authentication\"\ngit push origin main<\/code><\/pre>\n<p>Naviguez vers l&rsquo;onglet <strong>Actions<\/strong> dans votre d\u00e9p\u00f4t GitHub. Vous devriez voir le workflow en cours d&rsquo;ex\u00e9cution. Dans l&rsquo;\u00e9tape \u00ab Verify Identity \u00bb, la sortie ressemblera \u00e0 :<\/p>\n<pre><code class=\"language-json\">{\n    \"UserId\": \"AROA3XFRBF23ZCEXAMPLE:github-actions-9876543210\",\n    \"Account\": \"123456789012\",\n    \"Arn\": \"arn:aws:sts::123456789012:assumed-role\/github-actions-deploy\/github-actions-9876543210\"\n}<\/code><\/pre>\n<p>Remarquez que l&rsquo;ARN montre <code>assumed-role\/github-actions-deploy<\/code> \u2014 cela confirme que le workflow s&rsquo;authentifie via le r\u00f4le OIDC, et non via un utilisateur IAM.<\/p>\n<h2>Exercice 4 : Restreindre par branche, environnement et tag<\/h2>\n<p>Le claim <code>sub<\/code> de la politique de confiance est votre m\u00e9canisme principal de contr\u00f4le d&rsquo;acc\u00e8s. Le claim de sujet de GitHub Actions suit un format pr\u00e9visible qui encode le d\u00e9p\u00f4t, le type de d\u00e9clencheur et la ref.<\/p>\n<h3>Mod\u00e8les courants de claims de sujet<\/h3>\n<table>\n<thead>\n<tr>\n<th>D\u00e9clencheur<\/th>\n<th>Format du claim de sujet<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Push vers une branche<\/td>\n<td><code>repo:OWNER\/REPO:ref:refs\/heads\/BRANCH<\/code><\/td>\n<\/tr>\n<tr>\n<td>Pull request<\/td>\n<td><code>repo:OWNER\/REPO:pull_request<\/code><\/td>\n<\/tr>\n<tr>\n<td>Environnement<\/td>\n<td><code>repo:OWNER\/REPO:environment:ENV_NAME<\/code><\/td>\n<\/tr>\n<tr>\n<td>Push de tag<\/td>\n<td><code>repo:OWNER\/REPO:ref:refs\/tags\/TAG<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Restriction \u00e0 la branche main uniquement<\/h3>\n<p>C&rsquo;est la configuration de l&rsquo;exercice 2. Seuls les workflows d\u00e9clench\u00e9s par un push vers <code>main<\/code> peuvent assumer le r\u00f4le :<\/p>\n<pre><code class=\"language-json\">\"StringLike\": {\n  \"token.actions.githubusercontent.com:sub\": \"repo:myorg\/myrepo:ref:refs\/heads\/main\"\n}<\/code><\/pre>\n<h3>Restriction \u00e0 un environnement sp\u00e9cifique<\/h3>\n<p>Les environnements GitHub fournissent une couche suppl\u00e9mentaire de contr\u00f4le d&rsquo;acc\u00e8s. Lorsqu&rsquo;un job sp\u00e9cifie un <code>environment<\/code>, le claim de sujet change pour inclure le nom de l&rsquo;environnement :<\/p>\n<pre><code class=\"language-json\">\"StringLike\": {\n  \"token.actions.githubusercontent.com:sub\": \"repo:myorg\/myrepo:environment:production\"\n}<\/code><\/pre>\n<h3>Restriction aux releases tagg\u00e9es<\/h3>\n<p>Autoriser uniquement les releases tagg\u00e9es (par exemple, <code>v1.0.0<\/code>, <code>v2.3.1<\/code>) \u00e0 assumer le r\u00f4le :<\/p>\n<pre><code class=\"language-json\">\"StringLike\": {\n  \"token.actions.githubusercontent.com:sub\": \"repo:myorg\/myrepo:ref:refs\/tags\/v*\"\n}<\/code><\/pre>\n<h3>Tester les restrictions<\/h3>\n<p>Cr\u00e9ez une branche de fonctionnalit\u00e9 et poussez une ex\u00e9cution de workflow :<\/p>\n<pre><code class=\"language-bash\">git checkout -b feature\/test-oidc-restriction\ngit commit --allow-empty -m \"Test OIDC restriction\"\ngit push origin feature\/test-oidc-restriction<\/code><\/pre>\n<p>Si votre politique de confiance restreint \u00e0 <code>refs\/heads\/main<\/code>, le workflow sur la branche de fonctionnalit\u00e9 \u00e9chouera avec :<\/p>\n<pre><code>Error: Could not assume role with OIDC: Not authorized to perform\nsts:AssumeRoleWithWebIdentity\n\nAccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity<\/code><\/pre>\n<p>Maintenant, poussez le m\u00eame changement vers <code>main<\/code> :<\/p>\n<pre><code class=\"language-bash\">git checkout main\ngit merge feature\/test-oidc-restriction\ngit push origin main<\/code><\/pre>\n<p>Le workflow sur <code>main<\/code> r\u00e9ussit. Cela d\u00e9montre le <strong>contr\u00f4le d&rsquo;acc\u00e8s bas\u00e9 sur les claims<\/strong> \u2014 la politique de confiance AWS \u00e9value les claims int\u00e9gr\u00e9s dans le jeton OIDC pour prendre des d\u00e9cisions d&rsquo;autorisation. Aucun credential n&rsquo;est impliqu\u00e9 ; le jeton lui-m\u00eame porte le contexte d&rsquo;autorisation.<\/p>\n<h2>Exercice 5 : R\u00f4les par environnement<\/h2>\n<p>Les d\u00e9ploiements en production doivent avoir des contr\u00f4les plus stricts que le staging. Dans cet exercice, vous cr\u00e9ez des r\u00f4les IAM s\u00e9par\u00e9s pour chaque environnement, avec des politiques de confiance et des permissions diff\u00e9rentes.<\/p>\n<h3>\u00c9tape 1 : Cr\u00e9er les environnements GitHub<\/h3>\n<p>Dans votre d\u00e9p\u00f4t, allez dans <strong>Param\u00e8tres<\/strong> \u2192 <strong>Environnements<\/strong> :<\/p>\n<ol>\n<li>Cr\u00e9ez un environnement <strong>staging<\/strong> (sans r\u00e8gles de protection)<\/li>\n<li>Cr\u00e9ez un environnement <strong>production<\/strong> avec :\n<ul>\n<li><strong>R\u00e9viseurs requis<\/strong> : Ajoutez au moins un membre de l&rsquo;\u00e9quipe<\/li>\n<li><strong>Branches de d\u00e9ploiement<\/strong> : Restreindre \u00e0 <code>main<\/code> uniquement<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>\u00c9tape 2 : Cr\u00e9er le r\u00f4le IAM de staging<\/h3>\n<p>Le r\u00f4le de staging fait confiance \u00e0 toutes les branches du d\u00e9p\u00f4t :<\/p>\n<pre><code class=\"language-json\">{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"Federated\": \"arn:aws:iam::123456789012:oidc-provider\/token.actions.githubusercontent.com\"\n      },\n      \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"token.actions.githubusercontent.com:aud\": \"sts.amazonaws.com\"\n        },\n        \"StringLike\": {\n          \"token.actions.githubusercontent.com:sub\": \"repo:myorg\/myrepo:*\"\n        }\n      }\n    }\n  ]\n}<\/code><\/pre>\n<pre><code class=\"language-bash\">aws iam create-role \\\n  --role-name github-actions-staging \\\n  --assume-role-policy-document file:\/\/staging-trust-policy.json \\\n  --description \"Staging deployment role - all branches\"<\/code><\/pre>\n<h3>\u00c9tape 3 : Cr\u00e9er le r\u00f4le IAM de production<\/h3>\n<p>Le r\u00f4le de production fait confiance uniquement \u00e0 l&rsquo;environnement <code>production<\/code> sur la branche <code>main<\/code> :<\/p>\n<pre><code class=\"language-json\">{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"Federated\": \"arn:aws:iam::123456789012:oidc-provider\/token.actions.githubusercontent.com\"\n      },\n      \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"token.actions.githubusercontent.com:aud\": \"sts.amazonaws.com\",\n          \"token.actions.githubusercontent.com:sub\": \"repo:myorg\/myrepo:environment:production\"\n        }\n      }\n    }\n  ]\n}<\/code><\/pre>\n<pre><code class=\"language-bash\">aws iam create-role \\\n  --role-name github-actions-production \\\n  --assume-role-policy-document file:\/\/production-trust-policy.json \\\n  --description \"Production deployment role - main branch + production environment only\"<\/code><\/pre>\n<h3>\u00c9tape 4 : Workflow multi-environnement<\/h3>\n<p>Cr\u00e9ez un workflow qui d\u00e9ploie automatiquement en staging et en production avec approbation manuelle :<\/p>\n<pre><code class=\"language-yaml\">name: Deploy Multi-Environment\n\non:\n  push:\n    branches: [main]\n\npermissions:\n  id-token: write\n  contents: read\n\njobs:\n  deploy-staging:\n    runs-on: ubuntu-latest\n    environment: staging\n    steps:\n      - name: Checkout\n        uses: actions\/checkout@v4\n\n      - name: Configure AWS Credentials (Staging)\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::123456789012:role\/github-actions-staging\n          role-session-name: staging-${{ github.run_id }}\n          aws-region: us-east-1\n\n      - name: Deploy to Staging\n        run: |\n          aws sts get-caller-identity\n          echo \"Deploying to staging environment...\"\n          # Your staging deployment commands here\n\n  deploy-production:\n    runs-on: ubuntu-latest\n    needs: deploy-staging\n    environment: production\n    steps:\n      - name: Checkout\n        uses: actions\/checkout@v4\n\n      - name: Configure AWS Credentials (Production)\n        uses: aws-actions\/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::123456789012:role\/github-actions-production\n          role-session-name: production-${{ github.run_id }}\n          aws-region: us-east-1\n\n      - name: Deploy to Production\n        run: |\n          aws sts get-caller-identity\n          echo \"Deploying to production environment...\"\n          # Your production deployment commands here<\/code><\/pre>\n<p>Lorsque ce workflow s&rsquo;ex\u00e9cute :<\/p>\n<ol>\n<li>Le job <strong>staging<\/strong> s&rsquo;ex\u00e9cute imm\u00e9diatement, assume <code>github-actions-staging<\/code>, et d\u00e9ploie<\/li>\n<li>Le job <strong>production<\/strong> attend que le staging soit termin\u00e9, puis se met en pause pour approbation manuelle<\/li>\n<li>Un r\u00e9viseur requis approuve le d\u00e9ploiement dans l&rsquo;interface GitHub<\/li>\n<li>Le job de production s&rsquo;ex\u00e9cute, assume <code>github-actions-production<\/code>, et d\u00e9ploie<\/li>\n<\/ol>\n<p>La politique de confiance du r\u00f4le de production utilise <code>StringEquals<\/code> (et non <code>StringLike<\/code>) avec le sujet exact <code>repo:myorg\/myrepo:environment:production<\/code>. Cela signifie que seuls les jobs qui d\u00e9clarent <code>environment: production<\/code> peuvent assumer le r\u00f4le de production \u2014 et les environnements GitHub imposent que seuls les d\u00e9ploiements depuis la branche <code>main<\/code> avec approbation d&rsquo;un r\u00e9viseur peuvent utiliser cet environnement.<\/p>\n<h3>Terraform pour les deux r\u00f4les<\/h3>\n<pre><code class=\"language-hcl\">locals {\n  github_oidc_arn = aws_iam_openid_connect_provider.github.arn\n  github_repo     = \"myorg\/myrepo\"\n}\n\n# R\u00f4le staging - fait confiance \u00e0 toutes les branches\nresource \"aws_iam_role\" \"github_actions_staging\" {\n  name = \"github-actions-staging\"\n\n  assume_role_policy = jsonencode({\n    Version = \"2012-10-17\"\n    Statement = [\n      {\n        Effect = \"Allow\"\n        Principal = {\n          Federated = local.github_oidc_arn\n        }\n        Action = \"sts:AssumeRoleWithWebIdentity\"\n        Condition = {\n          StringEquals = {\n            \"token.actions.githubusercontent.com:aud\" = \"sts.amazonaws.com\"\n          }\n          StringLike = {\n            \"token.actions.githubusercontent.com:sub\" = \"repo:${local.github_repo}:*\"\n          }\n        }\n      }\n    ]\n  })\n}\n\n# R\u00f4le production - fait confiance uniquement \u00e0 l'environnement production\nresource \"aws_iam_role\" \"github_actions_production\" {\n  name = \"github-actions-production\"\n\n  assume_role_policy = jsonencode({\n    Version = \"2012-10-17\"\n    Statement = [\n      {\n        Effect = \"Allow\"\n        Principal = {\n          Federated = local.github_oidc_arn\n        }\n        Action = \"sts:AssumeRoleWithWebIdentity\"\n        Condition = {\n          StringEquals = {\n            \"token.actions.githubusercontent.com:aud\" = \"sts.amazonaws.com\"\n            \"token.actions.githubusercontent.com:sub\" = \"repo:${local.github_repo}:environment:production\"\n          }\n        }\n      }\n    ]\n  })\n}<\/code><\/pre>\n<h2>Exercice 6 : V\u00e9rifier et auditer<\/h2>\n<p>L&rsquo;authentification OIDC cr\u00e9e des pistes d&rsquo;audit d\u00e9taill\u00e9es dans AWS CloudTrail. Chaque appel <code>AssumeRoleWithWebIdentity<\/code> est journalis\u00e9 avec l&rsquo;ensemble complet des claims OIDC de GitHub.<\/p>\n<h3>\u00c9tape 1 : Interroger CloudTrail pour les \u00e9v\u00e9nements OIDC<\/h3>\n<pre><code class=\"language-bash\">aws cloudtrail lookup-events \\\n  --lookup-attributes AttributeKey=EventName,AttributeValue=AssumeRoleWithWebIdentity \\\n  --max-results 10 \\\n  --query 'Events[].{Time:EventTime,Username:Username,Resources:Resources}' \\\n  --output table<\/code><\/pre>\n<h3>\u00c9tape 2 : Examiner l&rsquo;\u00e9v\u00e9nement CloudTrail<\/h3>\n<p>Un \u00e9v\u00e9nement <code>AssumeRoleWithWebIdentity<\/code> typique dans CloudTrail contient les champs cl\u00e9s suivants :<\/p>\n<pre><code class=\"language-json\">{\n  \"eventName\": \"AssumeRoleWithWebIdentity\",\n  \"eventSource\": \"sts.amazonaws.com\",\n  \"requestParameters\": {\n    \"roleArn\": \"arn:aws:iam::123456789012:role\/github-actions-deploy\",\n    \"roleSessionName\": \"github-actions-9876543210\"\n  },\n  \"requestID\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n  \"responseElements\": {\n    \"credentials\": {\n      \"accessKeyId\": \"ASIAEXAMPLE...\",\n      \"expiration\": \"Mar 23, 2026 2:00:00 PM\"\n    },\n    \"subjectFromWebIdentityToken\": \"repo:myorg\/myrepo:ref:refs\/heads\/main\",\n    \"provider\": \"arn:aws:iam::123456789012:oidc-provider\/token.actions.githubusercontent.com\"\n  },\n  \"additionalEventData\": {\n    \"WebIdFederationData\": {\n      \"federatedProvider\": \"arn:aws:iam::123456789012:oidc-provider\/token.actions.githubusercontent.com\",\n      \"attributes\": {\n        \"sub\": \"repo:myorg\/myrepo:ref:refs\/heads\/main\",\n        \"aud\": \"sts.amazonaws.com\",\n        \"iss\": \"https:\/\/token.actions.githubusercontent.com\",\n        \"repository\": \"myorg\/myrepo\",\n        \"ref\": \"refs\/heads\/main\",\n        \"sha\": \"abc123def456...\",\n        \"actor\": \"github-username\",\n        \"workflow\": \"Deploy (Secure - OIDC)\",\n        \"run_id\": \"9876543210\"\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>Remarquez la richesse de cette piste d&rsquo;audit : vous pouvez voir le d\u00e9p\u00f4t exact, la branche, le SHA du commit, l&rsquo;utilisateur GitHub qui a d\u00e9clench\u00e9 le workflow, et le nom du workflow. C&rsquo;est bien plus d\u00e9taill\u00e9 que ce que vous obtenez avec des credentials d&rsquo;utilisateur IAM statiques.<\/p>\n<h3>\u00c9tape 3 : Cr\u00e9er une alarme CloudWatch pour les tentatives \u00e9chou\u00e9es d&rsquo;AssumeRole<\/h3>\n<p>Les appels <code>AssumeRoleWithWebIdentity<\/code> \u00e9chou\u00e9s peuvent indiquer des tentatives d&rsquo;acc\u00e8s non autoris\u00e9es ou des politiques de confiance mal configur\u00e9es. Configurez un filtre de m\u00e9triques et une alarme :<\/p>\n<pre><code class=\"language-bash\"># Cr\u00e9er un filtre de m\u00e9triques CloudWatch Logs pour les AssumeRoleWithWebIdentity \u00e9chou\u00e9s\naws logs put-metric-filter \\\n  --log-group-name CloudTrail\/DefaultLogGroup \\\n  --filter-name FailedOIDCAssumeRole \\\n  --filter-pattern '{ ($.eventName = \"AssumeRoleWithWebIdentity\") &amp;&amp; ($.errorCode = \"AccessDenied\") }' \\\n  --metric-transformations \\\n    metricName=FailedOIDCAssumeRoleCount,metricNamespace=SecurityMetrics,metricValue=1\n\n# Cr\u00e9er une alarme CloudWatch qui se d\u00e9clenche quand les \u00e9checs d\u00e9passent le seuil\naws cloudwatch put-metric-alarm \\\n  --alarm-name FailedOIDCAssumeRole \\\n  --alarm-description \"Alert on failed OIDC AssumeRoleWithWebIdentity attempts\" \\\n  --metric-name FailedOIDCAssumeRoleCount \\\n  --namespace SecurityMetrics \\\n  --statistic Sum \\\n  --period 300 \\\n  --threshold 3 \\\n  --comparison-operator GreaterThanOrEqualToThreshold \\\n  --evaluation-periods 1 \\\n  --alarm-actions arn:aws:sns:us-east-1:123456789012:security-alerts \\\n  --treat-missing-data notBreaching<\/code><\/pre>\n<h3>\u00c9tape 4 : Auditer quels d\u00e9p\u00f4ts et branches ont acc\u00e9d\u00e9 au r\u00f4le<\/h3>\n<p>Utilisez CloudTrail Lake ou Athena pour interroger les mod\u00e8les d&rsquo;acc\u00e8s historiques :<\/p>\n<pre><code class=\"language-bash\"># Utiliser CloudTrail lookup pour trouver toutes les authentifications OIDC des derni\u00e8res 24 heures\naws cloudtrail lookup-events \\\n  --lookup-attributes AttributeKey=EventName,AttributeValue=AssumeRoleWithWebIdentity \\\n  --start-time $(date -u -d '24 hours ago' '+%Y-%m-%dT%H:%M:%SZ' 2>\/dev\/null || date -u -v-24H '+%Y-%m-%dT%H:%M:%SZ') \\\n  --end-time $(date -u '+%Y-%m-%dT%H:%M:%SZ') \\\n  --query 'Events[].CloudTrailEvent' \\\n  --output text | jq -r '.responseElements.subjectFromWebIdentityToken \/\/ \"N\/A\"' | sort | uniq -c | sort -rn<\/code><\/pre>\n<p>Cela vous donne un d\u00e9compte de fr\u00e9quence des d\u00e9p\u00f4ts et branches qui se sont authentifi\u00e9s via OIDC \u2014 essentiel pour les revues d&rsquo;acc\u00e8s et les audits de conformit\u00e9.<\/p>\n<h2>Exercice 7 : Supprimer les anciennes cl\u00e9s d&rsquo;acc\u00e8s<\/h2>\n<p>C&rsquo;est l&rsquo;exercice le plus important de tout le lab. La migration des credentials statiques vers OIDC est incompl\u00e8te \u2014 et votre posture de s\u00e9curit\u00e9 n&rsquo;est pas am\u00e9lior\u00e9e \u2014 tant que les anciennes cl\u00e9s d&rsquo;acc\u00e8s n&rsquo;ont pas \u00e9t\u00e9 supprim\u00e9es. Tant que les deux m\u00e9thodes d&rsquo;authentification coexistent, un attaquant peut toujours utiliser les cl\u00e9s statiques.<\/p>\n<h3>\u00c9tape 1 : Supprimer les secrets GitHub<\/h3>\n<p>Supprimez les anciens secrets de votre d\u00e9p\u00f4t GitHub :<\/p>\n<pre><code class=\"language-bash\">gh secret delete AWS_ACCESS_KEY_ID --repo myorg\/myrepo\ngh secret delete AWS_SECRET_ACCESS_KEY --repo myorg\/myrepo<\/code><\/pre>\n<p>V\u00e9rifiez qu&rsquo;ils ont \u00e9t\u00e9 supprim\u00e9s :<\/p>\n<pre><code class=\"language-bash\">gh secret list --repo myorg\/myrepo<\/code><\/pre>\n<p>Vous ne devriez plus voir <code>AWS_ACCESS_KEY_ID<\/code> ni <code>AWS_SECRET_ACCESS_KEY<\/code> dans la liste.<\/p>\n<h3>\u00c9tape 2 : D\u00e9sactiver les cl\u00e9s d&rsquo;acc\u00e8s IAM<\/h3>\n<p>Avant de supprimer, d\u00e9sactivez d&rsquo;abord les cl\u00e9s. Cela vous donne une option de retour en arri\u00e8re si quelque chose ne fonctionne plus :<\/p>\n<pre><code class=\"language-bash\"># Lister les cl\u00e9s d'acc\u00e8s de l'utilisateur IAM\naws iam list-access-keys --user-name github-deploy-user\n\n# D\u00e9sactiver (pas supprimer) la cl\u00e9 d'acc\u00e8s\naws iam update-access-key \\\n  --user-name github-deploy-user \\\n  --access-key-id AKIAIOSFODNN7EXAMPLE \\\n  --status Inactive<\/code><\/pre>\n<h3>\u00c9tape 3 : V\u00e9rifier que le pipeline fonctionne toujours<\/h3>\n<p>D\u00e9clenchez le workflow OIDC et confirmez qu&rsquo;il se termine avec succ\u00e8s :<\/p>\n<pre><code class=\"language-bash\">git commit --allow-empty -m \"Verify OIDC-only authentication\"\ngit push origin main<\/code><\/pre>\n<p>V\u00e9rifiez l&rsquo;onglet Actions \u2014 le workflow devrait r\u00e9ussir en utilisant uniquement OIDC.<\/p>\n<h3>\u00c9tape 4 : Supprimer d\u00e9finitivement les cl\u00e9s d&rsquo;acc\u00e8s<\/h3>\n<p>Apr\u00e8s avoir confirm\u00e9 que le pipeline fonctionne sans cl\u00e9s statiques (attendez au moins 24 \u00e0 48 heures par s\u00e9curit\u00e9), supprimez d\u00e9finitivement les cl\u00e9s :<\/p>\n<pre><code class=\"language-bash\">aws iam delete-access-key \\\n  --user-name github-deploy-user \\\n  --access-key-id AKIAIOSFODNN7EXAMPLE<\/code><\/pre>\n<p>Si l&rsquo;utilisateur IAM n&rsquo;\u00e9tait utilis\u00e9 que pour GitHub Actions, supprimez enti\u00e8rement l&rsquo;utilisateur :<\/p>\n<pre><code class=\"language-bash\">aws iam delete-user-policy --user-name github-deploy-user --policy-name DeployPolicy\naws iam delete-user --user-name github-deploy-user<\/code><\/pre>\n<p>La migration est maintenant termin\u00e9e. Votre pipeline s&rsquo;authentifie exclusivement via la f\u00e9d\u00e9ration OIDC avec z\u00e9ro credential stock\u00e9.<\/p>\n<h2>Nettoyage<\/h2>\n<p>S&rsquo;il s&rsquo;agissait d&rsquo;un environnement de lab, nettoyez toutes les ressources :<\/p>\n<pre><code class=\"language-bash\"># Supprimer les r\u00f4les IAM\naws iam delete-role-policy --role-name github-actions-deploy --policy-name S3ReadAccess\naws iam delete-role --role-name github-actions-deploy\n\naws iam delete-role-policy --role-name github-actions-staging --policy-name StagingPolicy\naws iam delete-role --role-name github-actions-staging\n\naws iam delete-role-policy --role-name github-actions-production --policy-name ProductionPolicy\naws iam delete-role --role-name github-actions-production\n\n# Supprimer le fournisseur OIDC\nOIDC_ARN=$(aws iam list-open-id-connect-providers \\\n  --query \"OpenIDConnectProviderList[?ends_with(Arn, 'token.actions.githubusercontent.com')].Arn\" \\\n  --output text)\naws iam delete-open-id-connect-provider --open-id-connect-provider-arn \"$OIDC_ARN\"\n\n# Supprimer le d\u00e9p\u00f4t de test (optionnel)\ngh repo delete myorg\/oidc-lab --yes<\/code><\/pre>\n<p>Si vous avez utilis\u00e9 Terraform, le nettoyage est plus simple :<\/p>\n<pre><code class=\"language-bash\">terraform destroy -auto-approve<\/code><\/pre>\n<h2>Points cl\u00e9s \u00e0 retenir<\/h2>\n<ul>\n<li><strong>La f\u00e9d\u00e9ration OIDC \u00e9limine les credentials stock\u00e9s.<\/strong> Plus de <code>AWS_ACCESS_KEY_ID<\/code> ni de <code>AWS_SECRET_ACCESS_KEY<\/code> dans GitHub \u2014 la relation de confiance est entre le fournisseur d&rsquo;identit\u00e9 de GitHub et votre r\u00f4le IAM AWS.<\/li>\n<li><strong>Les credentials \u00e0 courte dur\u00e9e de vie r\u00e9duisent le rayon d&rsquo;impact.<\/strong> Les jetons OIDC et les credentials de session AWS r\u00e9sultants expirent en quelques minutes, pas en mois. Un jeton compromis est inutilisable apr\u00e8s expiration.<\/li>\n<li><strong>Les politiques de confiance fournissent un contr\u00f4le d&rsquo;acc\u00e8s bas\u00e9 sur les claims.<\/strong> Le claim <code>sub<\/code> dans le jeton OIDC encode le d\u00e9p\u00f4t, la branche et l&rsquo;environnement \u2014 utilisez les conditions <code>StringEquals<\/code> et <code>StringLike<\/code> pour imposer un acc\u00e8s granulaire.<\/li>\n<li><strong>Les r\u00f4les par environnement imposent la s\u00e9paration des responsabilit\u00e9s.<\/strong> Le staging et la production doivent utiliser des r\u00f4les IAM diff\u00e9rents avec des politiques de confiance et des niveaux de permissions diff\u00e9rents.<\/li>\n<li><strong>CloudTrail fournit des pistes d&rsquo;audit compl\u00e8tes.<\/strong> Chaque \u00e9v\u00e9nement d&rsquo;authentification OIDC journalise le d\u00e9p\u00f4t, la branche, le commit, l&rsquo;acteur et le workflow \u2014 bien plus riche que l&rsquo;audit des credentials statiques.<\/li>\n<li><strong>La migration est incompl\u00e8te tant que les anciennes cl\u00e9s ne sont pas supprim\u00e9es.<\/strong> Ex\u00e9cuter OIDC en parall\u00e8le avec des cl\u00e9s statiques n&rsquo;apporte aucune am\u00e9lioration de s\u00e9curit\u00e9. Supprimez les anciens credentials apr\u00e8s avoir v\u00e9rifi\u00e9 que OIDC fonctionne.<\/li>\n<\/ul>\n<h2>Prochaines \u00e9tapes<\/h2>\n<p>Continuez \u00e0 renforcer la posture de s\u00e9curit\u00e9 de votre CI\/CD avec ces guides connexes :<\/p>\n<ul>\n<li><a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/short-lived-credentials-workload-identity-federation-ci-cd\/\">Credentials \u00e0 courte dur\u00e9e de vie et f\u00e9d\u00e9ration d&rsquo;identit\u00e9 de charge de travail<\/a> \u2014 Plong\u00e9e approfondie dans les mod\u00e8les de f\u00e9d\u00e9ration OIDC pour AWS, GCP et Azure, y compris les strat\u00e9gies d&rsquo;identit\u00e9 de charge de travail multi-cloud.<\/li>\n<li><a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/secrets-management-ci-cd-pipelines-patterns-vault-2\/\">Gestion des secrets dans les pipelines CI\/CD<\/a> \u2014 Pour les secrets qui ne peuvent pas \u00eatre remplac\u00e9s par OIDC (mots de passe de bases de donn\u00e9es, cl\u00e9s API), apprenez comment int\u00e9grer HashiCorp Vault, AWS Secrets Manager et d&rsquo;autres solutions de gestion des secrets dans vos pipelines.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Aper\u00e7u Si vos workflows GitHub Actions s&rsquo;authentifient aupr\u00e8s d&rsquo;AWS en utilisant AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY stock\u00e9s comme secrets de d\u00e9p\u00f4t, vous avez un s\u00e9rieux probl\u00e8me de s\u00e9curit\u00e9. Ces credentials \u00e0 longue dur\u00e9e de vie n&rsquo;expirent jamais d&rsquo;eux-m\u00eames, peuvent \u00eatre exfiltr\u00e9s par n&rsquo;importe quelle \u00e9tape du workflow (y compris les actions tierces), et donnent aux attaquants un &#8230; <a title=\"Lab : Configuration du Workload Identity OIDC pour GitHub Actions avec AWS\" class=\"read-more\" href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-configuring-oidc-workload-identity-github-actions-aws\/\" aria-label=\"En savoir plus sur Lab : Configuration du Workload Identity OIDC pour GitHub Actions avec AWS\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49,52],"tags":[],"post_folder":[],"class_list":["post-534","post","type-post","status-publish","format-standard","hentry","category-ci-cd-security","category-github-actions"],"_links":{"self":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/534","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/comments?post=534"}],"version-history":[{"count":2,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/534\/revisions"}],"predecessor-version":[{"id":583,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/534\/revisions\/583"}],"wp:attachment":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/media?parent=534"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/categories?post=534"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/tags?post=534"},{"taxonomy":"post_folder","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/post_folder?post=534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}