Sécurité

Syft

Générateur de SBOM Anchore pour images OCI et systèmes de fichiers. Formats SPDX, CycloneDX, JSON. Entrée native pour Grype et Trivy.

Syft est un générateur de SBOM (Software Bill of Materials) open source développé par Anchore. Il analyse les images OCI, les systèmes de fichiers et les archives pour produire un inventaire complet des composants logiciels : packages OS, dépendances applicatives, licences, versions et métadonnées. Le SBOM généré sert ensuite d'entrée pour des scanners de vulnérabilités (Grype, Trivy) ou pour répondre aux exigences de conformité supply chain (SLSA, EO 14028).

Syft est le complément naturel de Grype dans l'écosystème Anchore : Syft génère le SBOM, Grype le scanne pour les CVE.


Informations essentielles

Origine : Anchore Inc.  ·  Licence : Apache 2.0  ·  Architectures : x86_64, ARM64

Liens : Documentation  ·  GitHub  ·  Releases

Support : Projet actif maintenu par Anchore.

Stack par défaut

ComposantValeur
Sources analyséesImages OCI, répertoires, tarballs, fichiers de lock (go.sum, package-lock.json…)
Formats de sortieSyft JSON (natif), SPDX 2.3, CycloneDX 1.4/1.5, GitHub SBOM
Langages détectésGo, Java, Python, Ruby, Node, Rust, PHP, .NET, C/C++, Dart, Swift…
Intégration GrypeEntrée directe grype sbom:<syft-output.json>
AttestationCompatible avec Cosign pour SBOM signé

Prérequis

RessourceValeur
OSLinux, macOS, Windows
Docker (optionnel)Pour analyser des images locales ou distantes

Installation

# Via script officiel (Linux/macOS)
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin

# Homebrew (macOS)
brew install anchore/syft/syft

# Vérifier
syft version

Vérification de l'installation

# 1. Version
syft version
# Application Version: x.y.z

# 2. Générer un SBOM simple depuis une image légère
syft alpine:latest -o table
# Doit lister les packages (apk, musl, busybox, etc.)

# 3. Générer un SBOM JSON complet
syft alpine:latest -o syft-json > sbom.json
cat sbom.json | jq '.artifacts | length'
# Nombre de composants trouvés (ex: 14)

# 4. Générer un SBOM SPDX
syft alpine:latest -o spdx-json > sbom.spdx.json
cat sbom.spdx.json | jq '.packages | length'

# 5. Tester la chaîne Syft → Grype
grype sbom:./sbom.json
# Mêmes résultats qu'un scan direct de l'image

Pièges courants

SymptômeCauseCorrection
Dépendances manquantesImage multi-stage, layers intermédiaires ignorésUtiliser --scope all-layers
Packages UNKNOWN typeLangage/packaging non reconnuVérifier les cataloguers supportés
SBOM incomplet (app Go)Binary Go sans debug symbolsAjouter -ldflags=-extldflags=-static au build pour que Syft détecte les dépendances
Sortie vide avec dir:Pas de fichiers de lock dans le répertoireAjouter les lock files (go.sum, package-lock.json, etc.)

Utilisation

Générer un SBOM depuis une image

# Format natif Syft (compatible Grype)
syft nginx:latest -o syft-json > nginx-sbom.json

# Format SPDX 2.3 (standard industrie)
syft nginx:latest -o spdx-json > nginx-sbom.spdx.json

# Format CycloneDX (standard OWASP)
syft nginx:latest -o cyclonedx-json > nginx-sbom.cdx.json

# Affichage table en terminal
syft nginx:latest -o table

Analyser un répertoire (code source)

# Analyser le code source local
syft dir:./my-app -o syft-json > source-sbom.json

# Analyser tous les layers d'une image (plus complet)
syft nginx:latest --scope all-layers -o syft-json > full-sbom.json

Analyser une image distante sans pull

# Sans télécharger l'image (utilise le manifest registry)
syft registry:nginx:latest -o syft-json > sbom.json

Pipeline SBOM + scan de vulnérabilités

# Générer le SBOM
syft my-app:v1.0 -o syft-json > sbom.json

# Scanner le SBOM avec Grype
grype sbom:./sbom.json --fail-on critical

# Scanner le SBOM avec Trivy
trivy sbom ./sbom.json

Attester et signer le SBOM avec Cosign

# Générer le SBOM
syft my-app:v1.0 -o spdx-json > sbom.spdx.json

# Attacher le SBOM à l'image dans le registry avec Cosign
cosign attach sbom --sbom sbom.spdx.json my-registry.io/my-app:v1.0

# Ou utiliser l'attestation Cosign directement
cosign attest --predicate sbom.spdx.json --type spdx my-registry.io/my-app:v1.0

Intégration CI/CD

GitHub Actions

- name: Générer le SBOM
  uses: anchore/sbom-action@v0
  with:
    image: ${{ env.IMAGE }}
    format: spdx-json
    output-file: sbom.spdx.json

- name: Scanner le SBOM avec Grype
  uses: anchore/scan-action@v3
  with:
    sbom: sbom.spdx.json
    fail-build: true
    severity-cutoff: high

- name: Publier le SBOM en artefact
  uses: actions/upload-artifact@v4
  with:
    name: sbom
    path: sbom.spdx.json

Mise à jour

curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
syft version

Troubleshooting

# Mode verbeux pour voir tous les cataloguers actifs
syft -vv nginx:latest 2>&1 | grep cataloger

# Lister les cataloguers disponibles (langages supportés)
syft packages --catalogers list

# Vérifier la complétude du SBOM
cat sbom.json | jq '[.artifacts[] | .type] | group_by(.) | map({type: .[0], count: length})'

Commandes utiles

syft <image>                               # SBOM en table terminal
syft <image> -o syft-json > sbom.json     # SBOM JSON natif (pour Grype)
syft <image> -o spdx-json > sbom.spdx     # SBOM SPDX
syft <image> -o cyclonedx-json > sbom.cdx # SBOM CycloneDX
syft dir:<chemin>                          # Analyser un répertoire
syft <image> --scope all-layers            # Inclure tous les layers

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic