Hoe u een CRA-conforme SBOM genereert: tools, formaten en CI/CD-integratie

Een praktische gids voor het genereren van Software Bills of Materials voor CRA-compliance. Behandelt open-source tools, formaatkeuze en geautomatiseerde pipeline-integratie.

CRA Evidence Team
Auteur
5 februari 2026
Bijgewerkt 25 februari 2026, 00:00:00 UTC
10 min. lezen
Hoe u een CRA-conforme SBOM genereert: tools, formaten en CI/CD-integratie
In this article

De CRA vereist een Software Bill of Materials. Elk concurrerend artikel vertelt u dit. Geen enkel laat u zien hoe u er een genereert.

Deze gids behandelt open-source tools, formaatkeuze en CI/CD-integratie — zonder vendor lock-in.

Tip: Begin met Syft of Trivy voor SBOM-generatie — beide ondersteunen CycloneDX- en SPDX-uitvoer en integreren eenvoudig in CI/CD-pipelines.

Samenvatting

  • De CRA vereist machineleesbare SBOM's die "ten minste top-level dependencies" omvatten
  • Aanbevolen formaten: CycloneDX 1.4+ of SPDX 2.3+ (per BSI TR-03183)
  • Open-source tools: Syft (images/bestandssystemen), Trivy (containers), cdxgen (broncode)
  • SBOM-generatie integreren in CI/CD voor automatische updates
  • Kwaliteit telt: minimumvelden omvatten pakketnaam, versie, leverancier, hash, licentie

Belangrijk: De CRA vereist machineleesbare SBOM's die alle transitive dependencies omvatten. Een eenvoudig package.json of requirements.txt volstaat NIET.

CI/CD SBOM-pipeline — Code, Build, Genereren, Ondertekenen, Opslaan, Bewaken

Wat de CRA daadwerkelijk vereist

Laten we beginnen met wat de verordening zegt. Bijlage I, Deel II van de CRA vereist dat fabrikanten:

"kwetsbaarheden en componenten van het product identificeren en documenteren, onder meer door het opstellen van een softwarestuklijst in een gangbaar en machineleesbaar formaat"

Kernpunten:

  • Machineleesbaar formaat: Geen PDF, geen spreadsheet, maar gestructureerde data
  • Minimaal top-level dependencies: Het minimum, meer is beter
  • Niet verplicht openbaar: Verstrekt aan autoriteiten op verzoek
  • Moet worden bijgewerkt: Bij elke release, patch of componentwijziging

De CRA schrijft geen specifiek formaat voor, maar standaardiseringsinitiatieven wijzen duidelijk naar CycloneDX en SPDX.

Formaatkeuze: CycloneDX vs. SPDX

Twee formaten domineren het SBOM-landschap. Beide zijn acceptabel voor CRA-compliance.

CycloneDX

Oorsprong: OWASP-project, beveiligingsgericht Huidige versie: 1.6 (1.4+ aanbevolen voor CRA) Beste voor: Beveiligings- en kwetsbaarheidsbeheer

Sterke punten:

  • Native VEX-ondersteuning (Vulnerability Exploitability eXchange)
  • Ontworpen voor beveiligingsgebruiksscenario's
  • Lichtere specificatie, eenvoudiger te implementeren
  • Sterk tools-ecosysteem
  • Directe CVE-/kwetsbaarheidskoppeling

JSON-voorbeeld:

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.5",
  "version": 1,
  "components": [
    {
      "type": "library",
      "name": "lodash",
      "version": "4.17.21",
      "purl": "pkg:npm/lodash@4.17.21",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "cc6d..."
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ]
    }
  ]
}

SPDX

Oorsprong: Linux Foundation, licentie-compliance-gericht Huidige versie: 2.3 (ISO/IEC 5962:2021-norm) Beste voor: Licentie-compliance en juridische review

Sterke punten:

  • ISO internationale norm
  • Uitgebreide licentie-expressiesyntax
  • Sterk in open-source compliance-contexten
  • Langere staat van dienst
  • Beter voor complexe licentiescenario's

JSON-voorbeeld:

{
  "spdxVersion": "SPDX-2.3",
  "dataLicense": "CC0-1.0",
  "SPDXID": "SPDXRef-DOCUMENT",
  "name": "my-application",
  "packages": [
    {
      "SPDXID": "SPDXRef-Package-lodash",
      "name": "lodash",
      "versionInfo": "4.17.21",
      "downloadLocation": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
      "licenseConcluded": "MIT",
      "checksums": [
        {
          "algorithm": "SHA256",
          "checksumValue": "cc6d..."
        }
      ]
    }
  ]
}

Welk formaat kiezen?

Gebruiksscenario Aanbeveling
Primaire focus is beveiliging/kwetsbaarheden CycloneDX
Primaire focus is licentie-compliance SPDX
VEX-integratie nodig CycloneDX
Onderneming met bestaande SPDX-tooling SPDX
Duitse markt (BSI TR-03183) Beide (beide aanbevolen)
Nieuw beginnen, geen voorkeur CycloneDX (eenvoudiger, beveiligingsgericht)

Voor CRA-compliance werkt elk formaat. Kies er één en wees consistent.

Open-source SBOM-generatietools

Geen vendor lock-in vereist. Deze tools zijn gratis, open-source en productieklaar.

Syft (Anchore)

Beste voor: Containerimages, bestandssystemen, archieven Licentie: Apache 2.0 Uitvoerformaten: CycloneDX, SPDX, Syft JSON

Installatie:

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

# Homebrew
brew install syft

# Docker
docker pull anchore/syft

Gebruiksvoorbeelden:

# Containerimage scannen
syft alpine:latest -o cyclonedx-json > sbom.cdx.json

# Map scannen
syft dir:/pad/naar/project -o cyclonedx-json > sbom.cdx.json

# Archief scannen
syft /pad/naar/archief.tar.gz -o spdx-json > sbom.spdx.json

# Scannen met specifieke catalogiseerders (bijv. alleen Python)
syft dir:. -o cyclonedx-json --select-catalogers python

Ondersteunde ecosystemen: Python, Node.js, Ruby, Java, Go, Rust, PHP, .NET en meer.

Trivy (Aqua Security)

Beste voor: Containerimages met ingebouwde kwetsbaarheidscontext Licentie: Apache 2.0 Uitvoerformaten: CycloneDX, SPDX plus kwetsbaarheidsrapporten

Installatie:

# Linux (Debian/Ubuntu)
sudo apt-get install trivy

# macOS
brew install trivy

# Docker
docker pull aquasec/trivy

Gebruiksvoorbeelden:

# SBOM genereren vanuit containerimage
trivy image --format cyclonedx --output sbom.cdx.json alpine:latest

# SBOM genereren vanuit bestandssysteem
trivy fs --format cyclonedx --output sbom.cdx.json /pad/naar/project

# SBOM genereren met kwetsbaarheidsinfo
trivy image --format cyclonedx --output sbom.cdx.json \
  --scanners vuln nginx:latest

Voordeel: Trivy kan SBOM's genereren én kwetsbaarheden scannen in één stap.

cdxgen (CycloneDX)

Beste voor: Broncodeanalyse in veel talen Licentie: Apache 2.0 Uitvoerformaat: CycloneDX

Installatie:

# npm (vereist Node.js)
npm install -g @cyclonedx/cdxgen

# Docker
docker pull ghcr.io/cyclonedx/cdxgen

Gebruiksvoorbeelden:

# Huidige map scannen
cdxgen -o sbom.json

# Specifiek projecttype scannen
cdxgen -t python -o sbom.json

# Scannen met diepe afhankelijkheidresolutie
cdxgen --deep -o sbom.json

# Specifieke map scannen
cdxgen -o sbom.json /pad/naar/project

Ondersteunde talen: JavaScript, Python, Java, Go, Rust, PHP, Ruby, .NET, C/C++ en meer.

Toolsvergelijking

Functie Syft Trivy cdxgen
Containerimages Uitstekend Uitstekend Goed
Broncode Goed Goed Uitstekend
Bestandssysteemscanning Uitstekend Goed Goed
Kwetsbaarheidsscanning Nee (gebruik Grype) Ja Nee
CycloneDX-uitvoer Ja Ja Ja
SPDX-uitvoer Ja Ja Nee
Snelheid Snel Gemiddeld Gemiddeld
Taaldekking Zeer breed Breed Zeer breed

Aanbeveling: Begin met Syft voor de meeste gebruiksscenario's. Voeg Trivy toe als u geïntegreerde kwetsbaarheidsscanning nodig heeft. Gebruik cdxgen voor complexe broncodeprojecten.

CI/CD-integratie

Handmatige SBOM-generatie schaalt niet. Integreer het in uw buildpipeline.

GitHub Actions

name: SBOM-generatie

on:
  push:
    branches: [main]
  release:
    types: [published]

jobs:
  sbom:
    runs-on: ubuntu-latest
    steps:
      - name: Code uitchecken
        uses: actions/checkout@v4

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

      - name: SBOM genereren
        run: |
          syft dir:. -o cyclonedx-json > sbom.cdx.json

      - name: SBOM uploaden als artifact
        uses: actions/upload-artifact@v4
        with:
          name: sbom
          path: sbom.cdx.json
          retention-days: 90

      # Optioneel: uploaden naar CRA Evidence
      - name: Uploaden naar CRA Evidence
        if: github.event_name == 'release'
        env:
          CRA_EVIDENCE_TOKEN: ${{ secrets.CRA_EVIDENCE_TOKEN }}
        run: |
          curl -X POST https://app.craevidence.com/api/v1/ci/sbom \
            -H "Authorization: Bearer $CRA_EVIDENCE_TOKEN" \
            -F "file=@sbom.cdx.json" \
            -F "product_id=${{ vars.PRODUCT_ID }}" \
            -F "version=${{ github.ref_name }}"

GitLab CI

generate-sbom:
  stage: build
  image: anchore/syft:latest
  script:
    - syft dir:. -o cyclonedx-json > sbom.cdx.json
  artifacts:
    paths:
      - sbom.cdx.json
    expire_in: 90 days
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
    - if: $CI_COMMIT_TAG

Jenkins

pipeline {
    agent any

    stages {
        stage('SBOM genereren') {
            steps {
                sh '''
                    curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b .
                    ./syft dir:. -o cyclonedx-json > sbom.cdx.json
                '''
            }
        }

        stage('SBOM archiveren') {
            steps {
                archiveArtifacts artifacts: 'sbom.cdx.json', fingerprint: true
            }
        }
    }
}

Docker Build-integratie

SBOM genereren tijdens Docker build:

# Multi-stage build met SBOM-generatie
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# SBOM genereren in buildstage
FROM anchore/syft:latest AS sbom
COPY --from=builder /app /app
RUN syft dir:/app -o cyclonedx-json > /sbom.cdx.json

# Eindimage
FROM node:20-slim
COPY --from=builder /app/dist /app
COPY --from=sbom /sbom.cdx.json /app/sbom.cdx.json
CMD ["node", "/app/index.js"]

SBOM-kwaliteit: voldoen aan TR-03183

De Duitse BSI Technische Richtlijn TR-03183 breidt de NTIA-minimumelementen uit. Hoewel niet wettelijk verplicht in de hele EU, garandeert het volgen van TR-03183 hoge kwaliteit SBOM's.

Vereiste velden

Veld Vereist door Opmerkingen
Componentnaam NTIA + TR-03183 Pakketidentificatie
Versie NTIA + TR-03183 Exacte versiereeks
Leverancier NTIA + TR-03183 Leverancier of beheerder
Unieke identifier NTIA + TR-03183 PURL aanbevolen
Afhankelijkheidsrelatie NTIA + TR-03183 Direct vs. transitief
Auteur van SBOM NTIA + TR-03183 Wie de SBOM heeft gemaakt
Tijdstempel NTIA + TR-03183 Wanneer SBOM is gemaakt
Hashwaarden TR-03183 Minimaal SHA-256
Licentie TR-03183 SPDX-licentie-ID
Bronrepository TR-03183 VCS-URL indien beschikbaar

SBOM-kwaliteit valideren

Gebruik deze tools om uw SBOM te controleren:

# CycloneDX-formaat valideren
npm install -g @cyclonedx/cyclonedx-cli
cyclonedx validate --input-file sbom.cdx.json

# Controleren op minimumvelden met jq
jq '.components[] | select(.version == null or .purl == null)' sbom.cdx.json

# Componenten met hashes tellen
jq '[.components[] | select(.hashes != null)] | length' sbom.cdx.json

SBOM-kwaliteit verbeteren

Als uw SBOM gegevens mist:

  1. Gebruik lockfiles: package-lock.json, Pipfile.lock, go.sum bevatten meer metadata
  2. Scan gebouwde artefacten: Completer dan alleen broncodeScans
  3. Combineer tools: Verschillende tools vinden verschillende componenten
  4. Handmatige vermeldingen toevoegen: Voor commerciële of interne componenten

SBOM's actueel houden

Een SBOM is een momentopname. Deze moet worden bijgewerkt om bruikbaar te blijven.

Wanneer opnieuw genereren

  • Bij elke release (major, minor, patch)
  • Na afhankelijkheidsupdates
  • Na beveiligingspatches
  • Als de buildconfiguratie verandert

Versioneringsstrategie

product-v1.0.0-sbom.cdx.json
product-v1.0.1-sbom.cdx.json
product-v1.1.0-sbom.cdx.json

Of gebruik tijdstempels:

product-sbom-2026-01-15T10-30-00Z.cdx.json

Bewaring

De CRA vereist 10 jaar bewaring. Sla historische SBOM's op:

  • In uw artefactrepository
  • In S3/cloudopslag met levenscyclusbeleid
  • In CRA Evidence voor geïntegreerde compliance-tracking

Veelgemaakte fouten

Eenmalige SBOM-generatie

Probleem: Eenmalig een SBOM aanmaken en nooit bijwerken.

Oplossing: SBOM-generatie automatiseren in CI/CD. Elke build moet een verse SBOM produceren.

Ontbrekende transitive dependencies

Probleem: SBOM vermeldt alleen directe afhankelijkheden, niet geneste pakketten.

Oplossing: Gebruik lockfiles, scan gebouwde artefacten, schakel opties voor diep scannen in.

Onjuiste formaatversie

Probleem: CycloneDX 1.3 gebruiken terwijl TR-03183 1.4+ aanbeveelt.

Oplossing: Controleer de uitvoerversie van uw tool. Houd tools regelmatig up-to-date.

Geen hashwaarden

Probleem: Componenten zonder cryptografische hashes kunnen niet worden geverifieerd.

Oplossing: Zorg dat uw tool hashes opneemt. Scan gebouwde artefacten in plaats van alleen broncode.

Handmatig aanmaken

Probleem: Handmatig SBOM's opstellen is foutgevoelig en onhoudbaar.

Oplossing: Altijd automatiseren. Handmatige vermeldingen alleen voor componenten die tools niet kunnen detecteren.

Interne componenten negeren

Probleem: Alleen open-source afhankelijkheden documenteren, niet de eigen code.

Oplossing: Interne componenten moeten ook worden gedocumenteerd. Voeg ze handmatig toe of configureer tools op de juiste manier.

SBOM-implementatiechecklist

SBOM-IMPLEMENTATIECHECKLIST

FORMAATKEUZE:
[ ] CycloneDX 1.4+ of SPDX 2.3+ gekozen
[ ] JSON-formaat (machineleesbaar)
[ ] Beslissing gedocumenteerd

TOOLING:
[ ] Primaire tool geselecteerd (Syft/Trivy/cdxgen)
[ ] Tool lokaal geïnstalleerd en getest
[ ] Uitvoer gevalideerd tegen schema

CI/CD-INTEGRATIE:
[ ] SBOM-generatie toegevoegd aan buildpipeline
[ ] Artefacten opgeslagen met passende bewaring
[ ] Generatie getriggerd bij releases

KWALITEITSBORGING:
[ ] Alle componenten hebben: naam, versie, leverancier
[ ] Hashwaarden aanwezig (SHA-256+)
[ ] Licentie-informatie opgenomen
[ ] Transitive dependencies vastgelegd
[ ] PURL-identifiers gebruikt

OPERATIONEEL:
[ ] SBOM geversioned naast productreleases
[ ] Historische SBOM's gearchiveerd (10 jaar bewaring)
[ ] Proces gedocumenteerd voor het team

OPTIONEEL - CRA EVIDENCE-INTEGRATIE:
[ ] API-token geconfigureerd
[ ] Upload geautomatiseerd bij release
[ ] Kwaliteitsscoring ingeschakeld

Volgende stappen

Met geautomatiseerde SBOM-generatie bent u klaar voor:

  1. Kwetsbaarheidsscanning: SBOM's koppelen aan kwetsbaarheidsdatabases
  2. Licentie-compliance: Licentieveplichtingen analyseren
  3. Integratie technisch dossier: SBOM's opnemen in CRA-documentatie
  4. Voorbereiding ENISA-melding: SBOM's maken snelle kwetsbaarheidsidentificatie mogelijk

CRA Evidence automatiseert deze volledige workflow:

  • SBOM's uploaden via CLI of CI/CD
  • Automatische kwetsbaarheidsscanning met Trivy
  • TR-03183-kwaliteitsscoring
  • Export technisch dossier met geïntegreerde SBOM's

Begin met het genereren van conforme SBOM's op app.craevidence.com.

Vereisten: Begrijp wat de CRA vereist voor SBOM's in onze SBOM-vereistengids.

Kwaliteit: Valideer uw SBOM aan de hand van de BSI TR-03183-norm.

VEX: Voeg kwetsbaarheidscontext toe aan uw SBOM met VEX-documenten.


Dit artikel is uitsluitend bedoeld ter informatie en vormt geen juridisch advies. Raadpleeg voor specifieke compliancebegeleiding een gekwalificeerde juridisch adviseur met kennis van EU-productregelgeving.

In diesem Artikel behandelte Themen

Diesen Artikel teilen

Gerelateerde artikelen

Does the CRA apply to your product?

Beantworte 6 einfache Fragen, um herauszufinden, ob dein Produkt unter den Geltungsbereich des EU Cyber Resilience Act fällt. Erhalte dein Ergebnis in weniger als 2 Minuten.

Bereit für CRA-Konformität?

Beginnen Sie mit der Verwaltung Ihrer SBOMs und Konformitätsdokumentation mit CRA Evidence.