Aller au contenu

Supply chain security

Garantir l'intégrité de chaque maillon — du code source au déploiement en production.


La chaîne d'approvisionnement logicielle

La supply chain d'un système couvre tout le chemin de la source au déploiement : code source, dépendances, build, image Docker, configuration, déploiement. Un attaquant qui compromet un maillon de cette chaîne peut injecter du code malveillant sans toucher directement au système cible.

Les vecteurs d'attaque courants :

  • Image Docker modifiée dans un registre non sécurisé
  • Dépendance npm/pip malveillante (typosquatting, maintainer compromis)
  • Artefact de build remplacé pendant le transit
  • Pipeline CI compromise (injection dans les scripts de build)
  • Configuration modifiée entre le build et le déploiement

Les incidents réels sont nombreux : SolarWinds (2020, build compromise), Codecov (2021, script bash modifie dans la CI), event-stream (2018, dépendance npm detournee), ua-parser-js (2021, maintainer compromis). Chacun exploitait un maillon différent de la chaîne.


SBOM — Software Bill of Materials

Un SBOM est un inventaire exhaustif de toutes les dépendances d'un artefact : bibliotheques directes et transitives, versions, licences, provenance. Il permet de répondre immédiatement à la question "est-ce que cette vulnérabilité CVE-XXXX nous affecte ?" sans auditer manuellement chaque service.

Formats standards

Format Maintenu par Forces
CycloneDX OWASP Focus sécurité, supporte VEX, extensible
SPDX Linux Foundation Focus licences + sécurité, standard ISO/IEC

Les deux formats sont interoperables et largement supportes. CycloneDX est plus courant dans le contexte sécurité, SPDX dans le contexte compliance et licences.

Outils de génération

Outil Sources supportees Sortie
Syft Images OCI, répertoires, archives CycloneDX, SPDX, JSON
Trivy Images, code, IaC, configs CycloneDX, SPDX, JSON
pip-audit Projets Python CycloneDX, JSON
cdxgen Multi-langage (Java, JS, Python) CycloneDX

Intégration dans la CI

Le SBOM devient un artefact de première classe dans le pipeline CI. Il est généré à chaque build, signe avec l'image, et stocke dans le registre.

# Extrait de pipeline CI (GitHub Actions)
- name: Build image
  run: docker build -t myapp:${{ github.sha }} .

- name: Generate SBOM
  run: syft myapp:${{ github.sha }} -o cyclonedx-json > sbom.json

- name: Scan vulnerabilities
  run: grype sbom:sbom.json --fail-on critical

- name: Sign and push
  run: |
    cosign sign myapp:${{ github.sha }}
    cosign attach sbom --sbom sbom.json myapp:${{ github.sha }}

Les outils de scanning de vulnérabilités (Grype, Trivy) utilisent ensuite le SBOM pour identifier les composants affectes par de nouvelles CVEs — sans avoir a re-analyser l'image complète.

Une pratique courante : configurer une alerte automatique quand une nouvelle CVE critique est publiee pour un composant present dans un SBOM en production. L'équipe est notifiee en quelques minutes au lieu de découvrir la vulnérabilité lors du prochain scan planifie.


Signature des artefacts et Sigstore

cosign

cosign est l'outil de la fondation Sigstore pour signer les images OCI. La signature est stockee dans le registre OCI lui-même, couplee à l'image.

# Signer une image
cosign sign --key cosign.key myregistry.io/myapp:v1.2.3

# Verifier une image
cosign verify --key cosign.pub myregistry.io/myapp:v1.2.3

cosign supporte aussi la signature "keyless" via Sigstore Fulcio — pas besoin de gérer une clé privee. L'identité est prouvee via OIDC (Google, GitHub, Microsoft), et le certificat éphémère est enregistre dans le log de transparence.

Sigstore — infrastructure de transparence

Sigstore est une infrastructure de transparence pour les signatures logicielles. Trois composants clés :

Composant Rôle
Fulcio CA éphémère — emet des certificats de signature courts
Rekor Log de transparence — enregistre les signatures de manière immutable
cosign Client — signe et vérifié les artefacts OCI
graph LR
    DEV[Developpeur / CI] --text--> OIDC[Identity Provider\nGitHub, Google]
    OIDC --text--> FULCIO[Fulcio\nCA ephemere]
    FULCIO --text--> CERT[Certificat ephemere]
    CERT --text--> SIGN[Signature]
    SIGN --text--> REKOR[Rekor\nLog de transparence]
    SIGN --text--> REG[Registre OCI]

L'avantage du modèle keyless : pas de clé privee a protéger, pas de rotation de clé a gérer. L'identité est liee au fournisseur OIDC. Le log de transparence Rekor permet de vérifier qu'une signature existait à un instant donne et n'a pas été retro-datee.


SLSA — Supply chain Levels for Software Artifacts

SLSA (prononce "salsa") est un framework de niveaux de maturité pour la sécurité de la supply chain. Il définit des exigences progressives pour garantir l'intégrité des artefacts produits.

Les niveaux SLSA

Niveau Exigence Ce que ca garantit
SLSA 1 Processus de build documente On sait comment l'artefact a été construit
SLSA 2 Build automatise + provenance signee L'artefact a été construit par une CI connue
SLSA 3 Build hermetique sur infrastructure vérifiée Le build n'a pas été influence par l'environnement
SLSA 4 Revue a deux personnes + build reproductible Double vérification humaine + reproductibilite

Provenance SLSA

La provenance est un document qui atteste comment un artefact a été construit : quel code source, quel builder, quels parametres, quand. La provenance est signee et peut être vérifiée independamment.

{
  "_type": "https://in-toto.io/Statement/v0.1",
  "subject": [{
    "name": "myapp",
    "digest": { "sha256": "abc123..." }
  }],
  "predicateType": "https://slsa.dev/provenance/v0.2",
  "predicate": {
    "builder": { "id": "https://github.com/actions/runner" },
    "buildType": "https://github.com/actions/workflow",
    "invocation": {
      "configSource": {
        "uri": "git+https://github.com/acme/myapp@refs/heads/main",
        "digest": { "sha256": "def456..." }
      }
    }
  }
}

Objectifs par criticite

Criticite du système Niveau SLSA cible Effort
Standard SLSA 1 SBOM + build documente
Important SLSA 2 CI automatisee + provenance signee
Critique SLSA 3 Build hermetique + infra vérifiée
Haute sécurité SLSA 4 Revue a 2 + build reproductible

Pour la plupart des systèmes, SLSA 2 est la cible pragmatique : build automatise dans une CI connue avec une provenance signee. Le rapport effort/valeur est le plus favorable.


in-toto — attestations de la supply chain

in-toto est un framework pour attester chaque étape de la supply chain logicielle. La ou SLSA se concentre sur la provenance du build, in-toto couvre l'ensemble du pipeline : code review, build, test, scan, déploiement.

Concept

Chaque étape de la supply chain produit une attestation signee ("link") qui enregistre les inputs et les outputs de l'étape. Un "layout" définit les étapes attendues et qui est autorise à les exécuter.

graph LR
    CODE["Code review\n(attestation signee)"] --text--> BUILD["Build\n(attestation signee)"]
    BUILD --text--> TEST["Tests\n(attestation signee)"]
    TEST --text--> SCAN["Security scan\n(attestation signee)"]
    SCAN --text--> DEPLOY["Deploiement\n(verification)"]
    LAYOUT["Layout\n(regles attendues)"] --verifie--> DEPLOY

Utilisation avec cosign

cosign peut stocker des attestations in-toto dans le registre OCI aux cotes de l'image :

# Attacher une attestation de provenance
cosign attest --predicate provenance.json \
  --type slsaprovenance \
  myregistry.io/myapp:v1.2.3

# Verifier les attestations
cosign verify-attestation \
  --type slsaprovenance \
  myregistry.io/myapp:v1.2.3

Vérification au déploiement

Un admission controller Kubernetes intercepte chaque tentative de déploiement et vérifié que l'image est signee par une clé de confiance. Les images non signees ou signees par une clé inconnue sont refusees avant même de démarrer.

Outils d'enforcement

Outil Rôle Intégration
Kyverno Admission controller polyvalent Policies en YAML, natif K8s
OPA Gatekeeper Admission controller base sur Rego Policies en Rego
Sigstore Policy Controller Vérification cosign native Intégration Sigstore directe
Connaisseur Vérification de signatures d'images Lightweight, focus unique

Politique Kyverno

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-image-signature
spec:
  validationFailureAction: enforce
  rules:
    - name: verify-cosign
      match:
        resources:
          kinds:
            - Pod
      verifyImages:
        - imageReferences:
            - "myregistry.io/*"
          attestors:
            - entries:
                - keys:
                    publicKeys: |-
                      -----BEGIN PUBLIC KEY-----
                      MFkwEwYHKoZI...
                      -----END PUBLIC KEY-----

Vérification au-delà de la signature

La vérification peut aller au-delà de la signature simple :

Vérification Ce que ca garantit
Image signee L'image n'a pas été modifiée depuis le build
Provenance SLSA L'image a été construite depuis un commit connu
SBOM sans CVE critique Aucune vulnérabilité critique connue
Attestation de tests Les tests ont passe avant le déploiement
Build sur infrastructure de confiance Le build n'a pas été compromis

Pipeline de référence

Un pipeline de supply chain security complet combine tous ces éléments :

graph TD
    SRC["Code source\n+ commit signe"] --text--> CI["Pipeline CI\n(infra verifiee)"]
    CI --text--> BUILD["Build hermetique"]
    BUILD --text--> SBOM["SBOM generation\n(Syft)"]
    BUILD --text--> SIGN["Signature\n(cosign)"]
    SBOM --text--> SCAN["Vulnerability scan\n(Grype)"]
    SIGN --text--> REG["Registre OCI\n+ attestations"]
    SBOM --text--> REG
    SCAN --pass--> REG
    REG --text--> ADM["Admission controller\n(Kyverno)"]
    ADM --text--> K8S["Deploiement K8s"]
    SCAN --fail--> BLOCK["Deploiement bloque"]
Étape Outil Artefact produit
Build Docker, Bazel, ko Image OCI
SBOM Syft, Trivy CycloneDX / SPDX JSON
Scan vulnérabilités Grype, Trivy Rapport CVE
Signature cosign Signature OCI + log Rekor
Provenance SLSA GitHub generator Attestation SLSA
Vérification deploy Kyverno, Gatekeeper Admission décision

Tip

La supply chain security commence au build — signez les artefacts dans la CI, verifiez-les au déploiement. Ne faites jamais confiance a un artefact non signe, même interne.

Chapitre suivant : Valider et gouverner — mesurer, réviser, maintenir l'architecture dans le temps.