Générer un jeton
Une fois l’App configurée et installée, il reste deux éléments : une politique de confiance (qui peut demander, et pour quoi) et le jeton OIDC qu’une identité présente pour prouver qui elle est.
Écrire une politique de confiance
Les politiques de confiance résident dans le dépôt cible à .github/sts/{app}/{identity}.sts.yaml.
Pour app=default et identity=ci dans myorg/myrepo, c’est :
myorg/myrepo/.github/sts/default/ci.sts.yamlExemple minimal pour un workflow GitHub Actions sur main :
issuer: https://token.actions.githubusercontent.com
subject: repo:myorg/myrepo:ref:refs/heads/main
audience: https://sts.example.com
permissions:
contents: read
pull_requests: write
audienceest obligatoire, et doit correspondre à l’audience que la charge de travail demande dans son jeton OIDC. C’est ce qui lie un jeton à ce déploiement github-sts et à aucun autre. Voir Émetteurs OIDC pour savoir comment les jetons de chaque fournisseur sont validés. Préférezsubjectexact àsubject_pattern: un motif correspond à plus d’identités que celle que vous avez testée.
Demander le jeton OIDC
Depuis un workflow GitHub Actions, demandez un jeton OIDC avec une audience explicite :
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Obtain OIDC token
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c379ccdee # v7.0.1
id: oidc
with:
script: |
const token = await core.getIDToken('https://sts.example.com')
core.setOutput('token', token)Limitez id-token: write au job qui en a besoin, pas à tout le workflow.
L’échanger
curl -H "Authorization: Bearer $OIDC_TOKEN" \
"https://sts.example.com/sts/exchange?scope=myorg/myrepo&app=default&identity=ci"{
"token": "ghs_xxxxxxxxxxxxxxxxxxxx",
"expires_in": 3600,
"scope": "myorg/myrepo",
"app": "default",
"identity": "ci",
"permissions": {
"contents": "read",
"pull_requests": "write"
}
}Le jeton ghs_… est un jeton d’installation GitHub App standard, limité exactement aux dépôts et
permissions déclarés par la politique. expires_in indique le nombre de secondes qu’il lui reste,
ce qui permet à un job de longue durée de le renouveler à temps au lieu de supposer une durée de
vie. Voir la référence API pour les cas où le champ est absent.
Pour un wrapper prêt à l’emploi autour de cet échange dans
Actions, voir le démarrage rapide de la GitHub Action. Le curl manuel
ci-dessus fonctionne depuis n’importe quel système CI capable de produire un jeton OIDC.
Liste de vérification sécurité
-
id-token: writeest limité au job spécifique, pas à tout le workflow - L’audience est explicite et correspond à la politique de confiance
- La politique de confiance utilise
subject(correspondance exacte) autant que possible, passubject_pattern - Les permissions de la politique de confiance sont le minimum requis
- L’URL de github-sts utilise HTTPS en production
Suite
Surveiller l’utilisation : consultez les métriques et le journal d’audit pour confirmer ce qui a été émis.