Syft CLI für die Generierung von Software Bill of Materials (SBOM)
- Marco Berger
- DevSecOps
- 28. Mai 2025
Inhaltsverzeichnis
Eine kurze Einführung in die Generierung von Software Bill of Materials (SBOM) mit Hilfe von Syft. Anhand eines Beispielprojekts werden wichtige Aspekte erklärt.
Wichtige Links
- Beispiel Repository mit React Frontend bei GitHub - Github: SecuraPoint/react-frontend
- Beispiel Docker Image, welches das React Frontend enthält, bei dockerhub - dockerhub: securapoint/react-frontend
SBOMs mit Syft generieren
Syft Cataloger sind spezialisierte Module innerhalb des Syft-Tools, die bestimmte Arten von Informationen aus einem Software-Artefakt extrahieren, wie z. B. Pakete, Dateien oder Metadaten. Jeder Cataloger ist dafür zuständig, ein bestimmtes Ökosystem oder Format zu analysieren, z. B. RPM, DEB, Python, Java oder Go. Syft verwendet eine Sammlung dieser Cataloger, um systematisch verschiedene Ebenen eines Software-Containers, Dateisystems oder Quellcodes zu durchsuchen. Während der Analyse orchestriert Syft die Cataloger so, dass sie parallel oder nacheinander laufen, je nach Konfiguration und Abhängigkeiten. Das Ergebnis ist eine umfassende Software Bill of Materials (SBOM), die alle identifizierten Komponenten und ihre Eigenschaften enthält.
Von Syft unterstützte Sources für Scans
Mit Syft lassen sich unterschiedliche Sources scannen und aus dem Ergebnis eine SBOM generieren. Die analysierbaren Sourcen sind:
- Dateien: Einzelne Dateien wie zum Beispiel eine
package-lock.jsonoder Archive (.tar) - Pfade: Hier können zum Beispiel komplette Repositories gescannt werden. Über glob expressions können dabei wiederum einzelne Pfade, Dateien oder Dateiendungen ausgeschlossen werden.
- Images: Docker, Podman oder Containerd Images aus öffentlichen oder privaten Registries.
Vielzahl an Formaten kann erzeugt werden
Aus den oben erwähnten Sources kann Syft SBOM in verschiedenen Formaten erstellen. Dabei ist wählbar, ob json, Text oder XML ausgegeben werden sollen. Die verfügbaren Formate sind:
- SPDX
- CycloneDX
- Syft-eigenes Format (dieses Format kann auch zur Erstellung eigener Templates verwendet werden)
- GitHub
Die genauen Versionsnummern von CycloneDX und SPDX können im Syft Wiki nachvollzogen werden.
Beispiele für Syft CLI Commands
Im Folgenden schauen wir auf einige Beispiele von Syft CLI-Aufrufen. Diese Aufrufe scannen Images sowie Pfade und erzeugen daraus SBOMs im CycloneDX-Format.
# Generierung einer CycloneDX SBOM vom Root-Ordner eines Projekts
syft ./ -o cyclonedx-json
# Generierung einer Syft SBOM durch Scan eines Docker Images
syft securapoint/react-frontend:latest -o syft-json
# Generierung einer CycloneDX SBOM durch Scan eines Docker Images
syft securapoint/react-frontend:latest -o cyclonedx-json
Weitere Beispiele für Syft CLI Commands sind im README.md des Beispiel Repositories zu finden.
Konfiguration von Syft
Sollten die Standardeinstellungen von Syft nicht ausreichen oder nicht das gewünschte SBOM-Format erzeugen, kann es einfach umkonfiguriert werden.
Wichtige Flags in der Syft Konfiguration
Die Konfiguration von Syft Command erfolgt mittels Optionen (wie -o cyclonedx-json) oder mittels eines Konfigurationsfiles. Im Beispiel Repository ist ein Syft-Konfigurationsfile unter .syft.yaml abgelegt. Die darin enthaltenen Konfigurationen müssen nicht mehr als Optionen an das CLI übergeben werden.
Hier sind einige der wichtigen Konfigurationen zu sehen. Sie übernehmen folgende Funktionen:
pretty: true: Formatierung der JSON-Dateien.select-catalogers: ["javascript"]: Sollte auf die Source angepasst sein. In diesen Beispiel ein, nmp-basiertes JavaScript Projekt.content: 'all': Bestimmt, ob/wie viele Lizenz-Informationen in der SBOM enthalten sind.enrich: ["javascript"]: Reichert die SBOM mit Informationen aus öffentlichen Paketquellen an.include-dev-dependencies: true: Bestimmt, ob Dev-Dependencies in SBOM enthalten sind.exclude: ['**/.git']: Schließt bestimmte Pfade oder Dateien vom Scan aus. Wichtig, um Übersichtlichkeit und Korrektheit der SBOM zu gewährleisten.
# [...]
format:
# default value for all formats that support the "pretty" option (default is unset) (env: SYFT_FORMAT_PRETTY)
pretty: true
# [...]
# add, remove, and filter the catalogers to be used (env: SYFT_SELECT_CATALOGERS)
select-catalogers: ["javascript"]
# [...]
license:
# include the content of licenses in the SBOM for a given syft scan; valid values are: [all unknown none] (env: SYFT_LICENSE_CONTENT)
content: 'all'
# [...]
# Enable data enrichment operations, which can utilize services such as Maven Central and NPM.
# By default all enrichment is disabled, use: all to enable everything.
# Available options are: all, golang, java, javascript (env: SYFT_ENRICH)
enrich: ["javascript"]
# [...]
javascript:
# enables Syft to use the network to fill in more detailed license information (env: SYFT_JAVASCRIPT_SEARCH_REMOTE_LICENSES)
search-remote-licenses: true
# base NPM url to use (env: SYFT_JAVASCRIPT_NPM_BASE_URL)
npm-base-url: 'https://registry.npmjs.org'
# include development-scoped dependencies (env: SYFT_JAVASCRIPT_INCLUDE_DEV_DEPENDENCIES)
include-dev-dependencies: true
# [...]
# exclude paths from being scanned using a glob expression (env: SYFT_EXCLUDE)
exclude: ['**/.git']
Ausschnitt aus .syft.yaml
Konfigurationsfile für einheitliche Generierung
Die Konfiguration mittels eingecheckter Konfigurationsdatei hat den Vorteil, dass die SBOM Generierungen immer einheitlich ablaufen (sofern sie nicht im CLI Command explizit überschrieben werden). Das ist vor allem im Sinne einer Automatisierung im Rahmen eines DevSecOp-Ansatzes.
Die SBOM Generierung mit einer bestimmten Konfiguration von Syft kann lokal getestet und wenn zufriedenstellend konfiguriert, reproduzierbar in einer CI-Pipeline ausgeführt werden. So kann in einer CI-Pipeline zu jedem Release (oder jedem Build) eine SBOM einheitlich generiert und als Artefakt des Releases erzeugt werden.
Hier ist der Aufruf einer GitHub Action zu sehen, die die Syft-Konfigurationsdatei verwendet.
- name: Generate path SBOM and upload artifact
uses: anchore/sbom-action@v0
with:
path: ./
format: cyclonedx-json
output-file: syft-sbom-file-${{ steps.vars.outputs.sha_short }}.cyclonedx.json
config: .syft.yaml
Fazit und selbst ausprobieren
Die Syft CLI besticht vor allem durch ihre einfache Verwendung und ihre Geschwindigkeit. Syft ist in Go geschrieben und das spürt man direkt bei der Geschwindigkeit, mit der die Command ausgeführt werden.
Die Syft Scans können mit einfach mit einer Source aufgerufen werden. Syft selbst wählt dann die zur Source passenden Cataloger und generiert eine passende SBOM. Ist das zu wenig, kann es über die Konfiguration gut an die eigenen Bedürfnisse angepasst werden.
Anhand des Beispielprojekts in GitHub kann man auch Pfad- und Dateiscans ausprobieren. Dazu kann das öffentliche Projekt Github: SecuraPoint/react-frontend einfach ausgecheckt werden. Im Anschluss muss Syft nur noch lokal installiert werden und schon kannst du Syft selbst ausprobieren.
Du möchtest mehr zum Thema erfahren?
Vereinbare einen kostenlosen Gesprächstermin mit uns oder sende uns deine Anfrage über unser Kontaktformular.
