OIDC (OpenID Connect) permet à vos workflows de s'authentifier auprès des cloud providers (AWS, Azure, GCP) sans stocker de credentials statiques. Plus de secrets à gérer, plus de rotation à planifier.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre OIDC et pourquoi il remplace les secrets cloud statiques
- Lire le JWT émis par GitHub et ses claims (
sub,repository,environment) - Déclarer
id-token: writeet brancher l'action cloud officielle - Restreindre la trust policy par dépôt, branche ou environnement
- Migrer un workflow existant des secrets vers OIDC
Pourquoi OIDC ?
Section intitulée « Pourquoi OIDC ? »Authentifier un workflow auprès d'un cloud impose historiquement de stocker une clé d'accès dans les secrets. OIDC supprime ce stockage : GitHub prouve l'identité du workflow, le cloud délivre un accès temporaire.
Problèmes des secrets statiques
Section intitulée « Problèmes des secrets statiques »Une clé d'accès AWS placée dans les secrets GitHub est un credential longue durée qui cumule les risques.
# ❌ Secrets statiques : risques multiples- name: Configure AWS env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}| Risque | Description |
|---|---|
| Exposition | Un workflow compromis exfiltre les credentials |
| Rotation | Obligation de changer régulièrement les clés |
| Scope | Difficile de limiter les permissions par workflow |
| Audit | Qui a utilisé ces credentials ? Impossible à tracer |
Avantages d'OIDC
Section intitulée « Avantages d'OIDC »OIDC remplace ce credential statique par un token éphémère, négocié à chaque exécution du workflow.
# ✅ OIDC : tokens éphémères, pas de secrets- uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6.1.1 with: role-to-assume: arn:aws:iam::123456789012:role/github-actions aws-region: eu-west-1| Avantage | Description |
|---|---|
| Éphémère | Token valide quelques minutes seulement |
| Sans secret | Rien à stocker dans GitHub Secrets |
| Traçable | Chaque token identifie le workflow, le repo, la branche |
| Granulaire | Politiques différentes par repo/branche/environment |
Comment ça fonctionne
Section intitulée « Comment ça fonctionne »L'échange OIDC se déroule en cinq étapes, sans qu'aucun secret ne transite ni ne soit stocké :
- Le workflow demande un token OIDC à GitHub
- GitHub génère un JWT (JSON Web Token) signé
- Le workflow présente ce JWT au cloud provider
- Le provider vérifie la signature avec les clés publiques de GitHub
- Le provider émet des credentials temporaires
Le JWT GitHub Actions
Section intitulée « Le JWT GitHub Actions »Le token OIDC contient des informations sur le workflow — autant de claims que le cloud provider peut vérifier :
{ "iss": "https://token.actions.githubusercontent.com", "sub": "repo:owner/repo:ref:refs/heads/main", "aud": "https://github.com/owner", "ref": "refs/heads/main", "repository": "owner/repo", "repository_owner": "owner", "actor": "username", "workflow": "Deploy", "job_workflow_ref": "owner/repo/.github/workflows/deploy.yml@refs/heads/main", "environment": "production"}Ces claims permettent de créer des politiques granulaires :
- Autoriser uniquement le repo
owner/repo - Autoriser uniquement la branche
main - Autoriser uniquement l'environment
production
Permissions requises
Section intitulée « Permissions requises »Pour utiliser OIDC, le workflow doit demander la permission id-token: write — sans elle, la demande de token échoue.
permissions: id-token: write # Nécessaire pour OIDC contents: read # Pour checkout
jobs: deploy: runs-on: ubuntu-24.04 steps: - name: Récupérer le code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false
- name: Configurer les credentials AWS via OIDC uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6.1.1 with: role-to-assume: arn:aws:iam::123456789012:role/github-actions aws-region: eu-west-1Configurer OIDC par cloud
Section intitulée « Configurer OIDC par cloud »La configuration côté cloud — créer le rôle ou l'identité fédérée — diffère selon le provider. Le guide OIDC pour AWS, Azure et GCP détaille chaque cas ; voici la vue d'ensemble.
Résumé par provider
Section intitulée « Résumé par provider »Chaque cloud a son action officielle et son propre mécanisme de confiance.
| Provider | Action officielle | Trust policy |
|---|---|---|
| AWS | aws-actions/configure-aws-credentials | IAM Role avec OIDC |
| Azure | azure/login | App Registration + Federated credentials |
| GCP | google-github-actions/auth | Workload Identity Federation |
Bonnes pratiques
Section intitulée « Bonnes pratiques »OIDC supprime les secrets, mais la sécurité réelle dépend de la trust policy côté cloud. Quatre réflexes la verrouillent.
1. Restreindre par branche et environment
Section intitulée « 1. Restreindre par branche et environment »La condition sub de la trust policy limite quel dépôt, branche ou
environnement peut assumer le rôle.
{ "Condition": { "StringEquals": { "token.actions.githubusercontent.com:sub": "repo:owner/repo:environment:production" } }}2. Utiliser les environments GitHub
Section intitulée « 2. Utiliser les environments GitHub »Déclarer un environment GitHub ajoute le claim correspondant au JWT — et
permet d'exiger une approbation manuelle avant le déploiement.
jobs: deploy: environment: production # Le claim 'environment' sera dans le JWT runs-on: ubuntu-24.04 permissions: id-token: write steps: - name: Configurer les credentials AWS via OIDC uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6.1.1 with: role-to-assume: ${{ vars.AWS_ROLE_ARN }}3. Permissions minimales sur le rôle cloud
Section intitulée « 3. Permissions minimales sur le rôle cloud »Le rôle assumé applique le moindre privilège : uniquement les actions cloud strictement nécessaires.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": "arn:aws:s3:::my-bucket/*" } ]}4. Auditer les utilisations
Section intitulée « 4. Auditer les utilisations »Chaque assume-role est journalisé côté cloud provider :
- AWS : CloudTrail
- Azure : Activity Log
- GCP : Cloud Audit Logs
Cas d'usage
Section intitulée « Cas d'usage »Deux scénarios fréquents illustrent OIDC de bout en bout : publier un site statique sur S3 et pousser une image Docker vers ECR.
Déploiement S3
Section intitulée « Déploiement S3 »Synchroniser un dossier dist/ vers un bucket S3, sans aucune clé AWS stockée.
jobs: deploy: runs-on: ubuntu-24.04 permissions: id-token: write contents: read steps: - name: Récupérer le code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false
- name: Configurer les credentials AWS via OIDC uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6.1.1 with: role-to-assume: arn:aws:iam::123456789012:role/deploy-s3 aws-region: eu-west-1
- name: Synchroniser le site vers S3 run: aws s3 sync ./dist s3://my-website-bucketPush image vers ECR
Section intitulée « Push image vers ECR »Construire une image Docker et la pousser vers Amazon ECR — l'authentification au registre passe elle aussi par OIDC.
jobs: push: runs-on: ubuntu-24.04 permissions: id-token: write contents: read steps: - name: Récupérer le code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false
- name: Configurer les credentials AWS via OIDC uses: aws-actions/configure-aws-credentials@d979d5b3a71173a29b74b5b88418bfda9437d885 # v6.1.1 with: role-to-assume: arn:aws:iam::123456789012:role/push-ecr aws-region: eu-west-1
- name: Se connecter à Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@fa648b43de3d4d023bcb3f89ed6940096949c419 # v2.1.5
- name: Builder et pousser l'image env: ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} run: | docker build -t "$ECR_REGISTRY/app:$GITHUB_SHA" . docker push "$ECR_REGISTRY/app:$GITHUB_SHA"Migration depuis les secrets
Section intitulée « Migration depuis les secrets »Basculer un workflow existant vers OIDC se fait en cinq étapes, sans interruption de service :
- Créer le rôle cloud avec une trust policy OIDC
- Ajouter
permissions: id-token: writeau workflow - Remplacer les secrets par l'action OIDC
- Tester sur une branche dédiée
- Supprimer les anciens secrets statiques
À retenir
Section intitulée « À retenir »- OIDC remplace les credentials cloud statiques par des tokens éphémères négociés à chaque exécution.
- Le workflow doit déclarer la permission
id-token: writepour demander un token OIDC. - GitHub émet un JWT signé dont les claims (
repository,ref,environment) pilotent la trust policy côté cloud. - La sécurité réelle se joue dans la trust policy : restreignez par dépôt, branche ou environnement.
- Le rôle cloud assumé applique le moindre privilège — uniquement les actions strictement nécessaires.
Prochaines étapes
Section intitulée « Prochaines étapes »Pour la référence complète, consultez la documentation officielle sur OIDC.