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
| Composant | Valeur |
|---|---|
| Sources analysées | Images OCI, répertoires, tarballs, fichiers de lock (go.sum, package-lock.json…) |
| Formats de sortie | Syft JSON (natif), SPDX 2.3, CycloneDX 1.4/1.5, GitHub SBOM |
| Langages détectés | Go, Java, Python, Ruby, Node, Rust, PHP, .NET, C/C++, Dart, Swift… |
| Intégration Grype | Entrée directe grype sbom:<syft-output.json> |
| Attestation | Compatible avec Cosign pour SBOM signé |
Prérequis
| Ressource | Valeur |
|---|---|
| OS | Linux, 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ôme | Cause | Correction |
|---|---|---|
| Dépendances manquantes | Image multi-stage, layers intermédiaires ignorés | Utiliser --scope all-layers |
Packages UNKNOWN type | Langage/packaging non reconnu | Vérifier les cataloguers supportés |
| SBOM incomplet (app Go) | Binary Go sans debug symbols | Ajouter -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épertoire | Ajouter 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
- GitHub : https://github.com/anchore/syft
- Releases : https://github.com/anchore/syft/releases
- Écosystèmes supportés : https://github.com/anchore/syft#supported-ecosystems
- GitHub Actions : https://github.com/anchore/sbom-action
- Grype (scanner CVE complémentaire) : https://github.com/anchore/grype