Permissions minimales
Définissez permissions: au niveau workflow avec contents: read par défaut,
puis accordez des permissions spécifiques au niveau job.
Mise à jour :
Signer des artefacts logiciels, c’est bien. Mais gérer des clés cryptographiques sur le long terme ? C’est un cauchemar opérationnel : rotation, stockage sécurisé, révocation, distribution des clés publiques…
Sigstore résout ce problème fondamental avec la signature keyless : vous signez avec votre identité (OIDC), pas avec une clé que vous devez protéger. Chaque signature est enregistrée dans un log de transparence public qui garantit l’auditabilité et la non-répudiation.
Avant Sigstore, signer un artefact nécessitait de :
Chaque étape est une source potentielle d’erreur ou de compromission.
| Approche traditionnelle | Approche Sigstore |
|---|---|
| Clé privée à protéger pendant des années | Clé détruite après 10 minutes |
| Rotation complexe et manuelle | Pas de rotation (certificat éphémère) |
| Révocation problématique | Pas de révocation nécessaire |
| Distribution des clés publiques | Identité vérifiée par OIDC |
| Confiance basée sur la clé | Confiance basée sur l’identité + log public |
Sigstore est un projet de l’OpenSSF (Open Source Security Foundation, Linux Foundation) composé de quatre briques complémentaires qui fonctionnent ensemble.
Authentification OIDC
Vous vous authentifiez via un provider OIDC (GitHub, Google, Microsoft, GitLab…). C’est la même authentification que vous utilisez pour vous connecter à ces services.
Délivrance du certificat (Fulcio)
Fulcio vérifie votre token OIDC et génère un certificat X.509 éphémère lié à votre identité. Ce certificat contient votre email (ou l’identité du workflow CI/CD) et expire après 10 minutes.
Signature de l’artefact (Cosign/gitsign)
L’outil de signature utilise la clé privée associée au certificat pour signer votre artefact. La clé privée est immédiatement détruite après usage.
Enregistrement (Rekor)
La signature est envoyée à Rekor qui l’enregistre dans un log immuable avec un timestamp RFC3161. Même si le certificat expire, la signature reste vérifiable grâce à cette preuve temporelle.
Vérification
N’importe qui peut vérifier que la signature est valide, qu’elle a été créée pendant la période de validité du certificat, et qu’elle est enregistrée dans Rekor (non-répudiation).
Un log de transparence est un registre public où chaque entrée est cryptographiquement liée aux précédentes (arbre de Merkle). Cette structure garantit que :
| Sans log de transparence | Avec Rekor |
|---|---|
| Impossible de prouver quand une signature a été créée | Timestamp cryptographique |
| Si quelqu’un signe en votre nom, comment le savoir ? | Toutes vos signatures sont auditables |
| La révocation d’une clé est complexe | Les signatures passées restent valides |
| Confiance aveugle dans le signataire | Traçabilité publique |
Pour comprendre en détail le fonctionnement des arbres de Merkle et des preuves d’inclusion, consultez le guide Rekor.
Sigstore propose des instances publiques gratuites pour l’écosystème open source, mais peut aussi être déployé en privé.
| Service | URL | SLA | Usage |
|---|---|---|---|
| Fulcio | fulcio.sigstore.dev | 99.5% | Certificats OIDC |
| Rekor | rekor.sigstore.dev | 99.5% | Log de transparence |
| Rekor Search | search.sigstore.dev | — | Interface web |
Pour les environnements qui nécessitent confidentialité, air-gapped ou contrôle total, vous pouvez déployer votre propre stack Sigstore. Consultez le guide de déploiement privé Rekor.
Que voulez-vous signer ?│├─► Images conteneur ──────────────► Cosign│├─► Commits Git ───────────────────► gitsign│├─► Fichiers binaires / archives ──► Cosign (blob signing)│├─► SBOM / attestations ───────────► Cosign attest│└─► Politiques supply chain ───────► in-toto + CosignGitHub Actions fournit nativement des tokens OIDC compatibles Sigstore :
name: Build and Sign
on: push: tags: ['v*']
# Permissions minimales au top-levelpermissions: contents: read
jobs: build-sign: runs-on: ubuntu-24.04
# Permissions spécifiques au job permissions: contents: read packages: write # Pour push vers GHCR id-token: write # Pour OIDC Sigstore attestations: write # Pour GitHub Attestations
steps: - name: Checkout code uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Set up Docker Buildx uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
- name: Install Cosign uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
- name: Build and push id: build uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: push: true tags: ghcr.io/${{ github.repository }}:${{ github.ref_name }} provenance: true # Génère l'attestation SLSA sbom: true # Génère le SBOM avec Syft
- name: Generate SLSA attestation uses: actions/attest-build-provenance@00014ed6ed5efc5b1ab7f7f34a39eb55d41aa4f8 # v3.1.0 with: subject-name: ghcr.io/${{ github.repository }} subject-digest: ${{ steps.build.outputs.digest }} push-to-registry: true
- name: Sign image run: | IMAGE="ghcr.io/${{ github.repository }}@${{ steps.build.outputs.digest }}" cosign sign --yes "${IMAGE}"
# Vérification immédiate cosign verify \ --certificate-identity-regexp="https://github.com/${{ github.repository }}" \ --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \ "${IMAGE}"Pour plus de détails sur les attestations SBOM et l’intégration Kubernetes, consultez le guide Cosign.
| Plateforme | Support OIDC | Documentation |
|---|---|---|
| GitHub Actions | ✅ Natif | guide Cosign |
| GitLab CI | ✅ Natif | guide gitsign |
| Google Cloud Build | ✅ Natif | docs.sigstore.dev ↗ |
| CircleCI | ✅ Disponible | circleci.com ↗ |
SLSA (Supply chain Levels for Software Artifacts) définit des niveaux de maturité pour la sécurité supply chain. Sigstore est l’outil de référence pour atteindre ces niveaux :
| Niveau SLSA | Exigence | Outil Sigstore |
|---|---|---|
| Build L1 | Provenance existe | Cosign (signature) |
| Build L2 | Provenance signée | Cosign + Fulcio |
| Build L3 | Build isolé, provenance non-forgeable | Cosign + attestations in-toto |
Pour des attestations avancées, combinez Sigstore avec in-toto.
Le log public contient plus de 100 millions d’entrées, avec une croissance de ~500K signatures/jour.
Permissions minimales
Définissez permissions: au niveau workflow avec contents: read par défaut,
puis accordez des permissions spécifiques au niveau job.
Actions pinnées par SHA
Utilisez toujours des SHA de commit pour les actions tierces :
uses: actions/checkout@8e8c483... # v6.0.1
Vérification post-signature
Toujours vérifier la signature immédiatement après l’avoir créée pour détecter les problèmes tôt.
Attestations SLSA
Utilisez actions/attest-build-provenance pour atteindre SLSA Build L3 et
faciliter la vérification avec gh attestation verify.
| Garantie | Explication |
|---|---|
| Authenticité | L’artefact a été signé par l’identité déclarée |
| Intégrité | L’artefact n’a pas été modifié depuis la signature |
| Non-répudiation | La signature est enregistrée publiquement |
| Horodatage | On sait quand la signature a été créée |
| Non-garantie | Explication |
|---|---|
| Qualité du code | Un artefact signé peut contenir des bugs ou failles |
| Intentions | Le signataire peut être malveillant |
| Sécurité du build | Sigstore ne protège pas le pipeline de build |