Syft CLI für die Generierung von Software Bill of Materials (SBOM)

Syft CLI für die Generierung von Software Bill of Materials (SBOM)

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

  1. Beispiel Repository mit React Frontend bei GitHub - Github: SecuraPoint/react-frontend
  2. 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.json oder 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.

App screenshot

Ähnliche Posts

Trivy als vielseitiger Open Source Security Scanner

Trivy als vielseitiger Open Source Security Scanner

Im folgenden Artikel beschäftigen wir uns mit dem Open Source Security Scanner Trivy. Ich werde zeigen, welche Artefakte mit ihm gescannt und welche Art von Reports erzeugt werden können. Außerdem werde ich anhand eines exemplarischen DevSecOps Prozesses zeigen, wie Trivy darin eingesetzt werden kann.

Mehr lesen
ISO/IEC 5230 als Grundlage für sicheres Open Source Management

ISO/IEC 5230 als Grundlage für sicheres Open Source Management

Jeden Tag werden mehr als 20 000 neue Open-Source-Software Komponenten released. Ein Softwareprojekt ohne den Einsatz von Open-Source-Software Komponenten ist in der Realität nicht mehr vorstellbar. Doch mit den vielen Vorteilen kommen natürlich auch Pflichten. Welche Lizenz gilt für welchen Code? Was muss ich mitliefern? Welche Risiken gehe ich ein? Wenn Unternehmen Open Source professionell einsetzen, brauchen sie klare, wiederholbare Prozesse. Genau hier setzt die ISO/IEC 5230 an.

Mehr lesen
VEX erklärt: Welche Schwachstellen sind wirklich relevant?

VEX erklärt: Welche Schwachstellen sind wirklich relevant?

Durch den vermehrten Einsatz von Dritt-Software-Komponenten und die steigende Anzahl an täglichen neuen Schwachstellen führt kein Weg mehr an der systematischen Analyse von Schwachstellen vorbei. Wer sich bereits mit den bekannten CVE-Datenbanken beschäftigt hat, weiß, dass die Flut an gefundenen CVEs oft nur bedingt hilfreich ist. Nicht jede gemeldete Schwachstelle stellt tatsächlich ein Risiko dar, oftmals sind diese nicht relevant für das eingesetzte Produkt, die Konfiguration oder den Nutzungskontext. Hier kommt der VEX-Standard (Vulnerability Exploitability eXchange) ins Spiel.

Mehr lesen