Les attestations permettent de prouver cryptographiquement l'origine de vos artefacts : qui les a construits, à partir de quel code, avec quel workflow. C'est un élément clé de la sécurité supply chain.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre les attestations et ce qu'elles prouvent cryptographiquement
- Distinguer attestation de provenance (SLSA) et attestation SBOM
- Générer une attestation pour un artefact ou une image Docker
- Attester un SBOM en complément de la provenance
- Savoir où GitHub et Sigstore conservent les attestations
Qu'est-ce qu'une attestation ?
Section intitulée « Qu'est-ce qu'une attestation ? »Une attestation est un document signé qui certifie des informations sur un artefact :
{ "_type": "https://in-toto.io/Statement/v1", "subject": [ { "name": "my-app", "digest": { "sha256": "abc123..." } } ], "predicateType": "https://slsa.dev/provenance/v1", "predicate": { "buildDefinition": { "buildType": "https://actions.github.io/buildtypes/workflow/v1" }, "runDetails": { "builder": { "id": "https://github.com/actions/runner" } } }}Ce que prouve l'attestation :
| Information | Valeur |
|---|---|
| Artefact | Hash SHA256 de l'artefact |
| Builder | GitHub Actions runner |
| Repository | owner/repo |
| Commit | SHA du commit |
| Workflow | Fichier et référence |
| Signataire | Sigstore (Fulcio/Rekor) |
Types d'attestations
Section intitulée « Types d'attestations »GitHub Actions produit deux types d'attestations standard, provenance et SBOM, et autorise des attestations sur mesure.
Attestation de provenance (SLSA)
Section intitulée « Attestation de provenance (SLSA) »Prouve comment l'artefact a été construit :
- Quel code source
- Quel workflow
- Quels paramètres de build
Attestation SBOM
Section intitulée « Attestation SBOM »Prouve ce que contient l'artefact :
- Liste des dépendances
- Versions exactes
- Licences
Attestation personnalisée
Section intitulée « Attestation personnalisée »Vous pouvez ajouter vos propres informations :
- Résultats de tests
- Scan de sécurité
- Métadonnées métier
Générer une attestation
Section intitulée « Générer une attestation »L'action officielle actions/attest-build-provenance génère et signe
l'attestation. Le workflow a besoin de trois permissions : id-token,
contents et attestations.
Avec actions/attest-build-provenance
Section intitulée « Avec actions/attest-build-provenance »Cette action produit une attestation de provenance pour n'importe quel fichier d'artefact.
name: Build and Attest
on: push: branches: [main]
permissions: id-token: write # Pour signer avec Sigstore contents: read attestations: write # Pour publier l'attestation
jobs: build: runs-on: ubuntu-24.04 steps: - name: Récupérer le code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false
- name: Builder l'artefact run: | npm ci npm run build tar -czf dist.tar.gz dist/
- name: Générer l'attestation uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0 with: subject-path: dist.tar.gzPour une image Docker
Section intitulée « Pour une image Docker »Pour une image, l'attestation cible le digest publié et peut être attachée directement au registre.
jobs: build: runs-on: ubuntu-24.04 permissions: id-token: write contents: read attestations: write packages: write steps: - name: Récupérer le code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false
- name: Se connecter à GHCR uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Builder et pousser l'image id: build uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 with: push: true tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
- name: Générer l'attestation uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0 with: subject-name: ghcr.io/${{ github.repository }} subject-digest: ${{ steps.build.outputs.digest }} push-to-registry: trueAttestation SBOM
Section intitulée « Attestation SBOM »Générez un SBOM (Software Bill of Materials) puis attestez-le, pour prouver le contenu exact de l'artefact :
jobs: sbom: runs-on: ubuntu-24.04 permissions: id-token: write contents: read attestations: write steps: - name: Récupérer le code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false
- name: Générer le SBOM uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # v0.24.0 id: sbom with: format: spdx-json output-file: sbom.spdx.json
- name: Attester le SBOM uses: actions/attest-sbom@c604332985a26aa8cf1bdc465b92731239ec6b9e # v4.1.0 with: subject-path: dist.tar.gz sbom-path: sbom.spdx.jsonOù sont stockées les attestations ?
Section intitulée « Où sont stockées les attestations ? »Une attestation générée est conservée à deux endroits, ce qui la rend à la fois interrogeable et infalsifiable.
GitHub Attestations API
Section intitulée « GitHub Attestations API »Les attestations sont stockées dans GitHub et accessibles via :
- L'API REST :
GET /repos/{owner}/{repo}/attestations/{digest} - La CLI :
gh attestation verify
Sigstore Transparency Log
Section intitulée « Sigstore Transparency Log »Les attestations sont aussi enregistrées dans Rekor, le log de transparence de Sigstore. Cela garantit qu'elles ne peuvent pas être modifiées après coup.
Workflow complet
Section intitulée « Workflow complet »Voici un workflow de release complet : build, SBOM, double attestation (provenance et SBOM), puis publication.
name: Build, Attest and Release
on: push: tags: - 'v*'
permissions: id-token: write contents: write attestations: write packages: write
jobs: build: runs-on: ubuntu-24.04 outputs: digest: ${{ steps.build.outputs.digest }} steps: - name: Récupérer le code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: persist-credentials: false
- name: Builder l'artefact id: build env: REF_NAME: ${{ github.ref_name }} run: | npm ci npm run build tar -czf "my-app-$REF_NAME.tar.gz" dist/ echo "digest=$(sha256sum "my-app-$REF_NAME.tar.gz" | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
- name: Générer le SBOM uses: anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 # v0.24.0 with: format: spdx-json output-file: sbom.spdx.json
- name: Attester la provenance uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0 with: subject-path: my-app-${{ github.ref_name }}.tar.gz
- name: Attester le SBOM uses: actions/attest-sbom@c604332985a26aa8cf1bdc465b92731239ec6b9e # v4.1.0 with: subject-path: my-app-${{ github.ref_name }}.tar.gz sbom-path: sbom.spdx.json
- name: Créer la release uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0 with: files: | my-app-${{ github.ref_name }}.tar.gz sbom.spdx.jsonBonnes pratiques
Section intitulée « Bonnes pratiques »Quelques réflexes garantissent que vos attestations servent réellement à sécuriser la chaîne de livraison.
1. Toujours attester les releases
Section intitulée « 1. Toujours attester les releases »Chaque artefact distribué doit avoir une attestation de provenance, sans elle, le consommateur ne peut pas vérifier d'où il vient.
2. Attester les images Docker
Section intitulée « 2. Attester les images Docker »Pour une image, push-to-registry: true attache l'attestation directement à
l'image dans le registre.
- uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0 with: subject-name: ghcr.io/${{ github.repository }} subject-digest: ${{ steps.build.outputs.digest }} push-to-registry: true # Attache l'attestation à l'image3. Générer aussi un SBOM
Section intitulée « 3. Générer aussi un SBOM »L'attestation de provenance dit comment l'artefact est construit ; le SBOM dit ce qu'il contient. Les deux sont complémentaires.
4. Vérifier avant déploiement
Section intitulée « 4. Vérifier avant déploiement »Une attestation n'a de valeur que si elle est vérifiée côté consommateur. Avant de déployer un artefact, validez sa provenance, voir Vérifier les attestations.
À retenir
Section intitulée « À retenir »- Une attestation est un document signé qui prouve l'origine d'un artefact : code source, workflow, builder.
- L'attestation de provenance (SLSA) dit comment l'artefact a été construit ; l'attestation SBOM dit ce qu'il contient.
actions/attest-build-provenanceetactions/attest-sbomexigent les permissionsid-token: writeetattestations: write.- Les attestations sont signées via Sigstore et enregistrées dans le log de transparence Rekor, impossible de les modifier après coup.
- Une attestation ne protège que si elle est vérifiée avant déploiement.
Prochaines étapes
Section intitulée « Prochaines étapes »Pour la référence complète, consultez la documentation officielle sur les artifact attestations.