CI/CD-Integration

Eine manuell gepflegte SBOM ist in dem Moment veraltet, in dem sie entsteht. Das Multi-Arch-Docker-Image (amd64/arm64) bringt kunnus in jede Pipeline, sodass jedes Release mit einer aktuellen SBOM erscheint.

GitHub Actions

.github/workflows/sbom.yml
- name: Generate SBOM
  env:
    # Schlüsselt die serialNumber der SBOM: aufeinanderfolgende Pipeline-Läufe
    # bilden so eine Dokumentenserie statt unverbundener Dokumente.
    KUNNUS_COMPONENT_ID: ${{ vars.KUNNUS_COMPONENT_ID }}
    KUNNUS_COMPONENT_VERSION: ${{ github.ref_name }}
    # Trägt Ihre Organisation als SBOM-Autor ein (CISA-Mindestangabe).
    KUNNUS_AUTHOR: ${{ vars.KUNNUS_AUTHOR }}
  run: |
    docker run --rm -v ${{ github.workspace }}:/src \
      -e KUNNUS_COMPONENT_ID -e KUNNUS_COMPONENT_VERSION -e KUNNUS_AUTHOR \
      ghcr.io/think-ahead-technologies/kunnus-scanner:latest \
      sbom repo /src --output /src/sbom.cdx.json

- name: Upload to kunnus platform
  env:
    KUNNUS_API_KEY: ${{ secrets.KUNNUS_API_KEY }}
    KUNNUS_COMPONENT_ID: ${{ vars.KUNNUS_COMPONENT_ID }}
  run: |
    docker run --rm -v ${{ github.workspace }}:/src \
      -e KUNNUS_API_KEY -e KUNNUS_COMPONENT_ID \
      ghcr.io/think-ahead-technologies/kunnus-scanner:latest \
      upload /src/sbom.cdx.json

Die drei Identitäts-Variablen machen aus einem Stapel Einzel-SBOMs eine Dokumentenserie, der ein Prüfer folgen kann: KUNNUS_COMPONENT_ID schlüsselt die Seriennummer, KUNNUS_COMPONENT_VERSION benennt das Release, KUNNUS_AUTHOR hält fest, wer den Scanner betrieben hat. Verwenden Sie dieselbe Component-ID wie für kunnus upload. Ohne sie läuft der Scan trotzdem — jeder Lauf bekommt dann nur eine zufällige Seriennummer und einen Platzhalter-Autor.

GitLab CI

.gitlab-ci.yml
sbom:
  image:
    name: ghcr.io/think-ahead-technologies/kunnus-scanner:latest
    entrypoint: [""]
  script:
    - /kunnus sbom repo . --output sbom.cdx.json
    - /kunnus upload sbom.cdx.json
  variables:
    KUNNUS_API_KEY: $KUNNUS_API_KEY
    KUNNUS_COMPONENT_ID: $KUNNUS_COMPONENT_ID
    KUNNUS_COMPONENT_VERSION: $CI_COMMIT_REF_NAME
    KUNNUS_AUTHOR: $KUNNUS_AUTHOR
  artifacts:
    paths: [sbom.cdx.json]

Exit-Codes: vollständige vs. unvollständige SBOMs

Exit 0 bedeutet: Jeder Extraktor lief sauber durch. Schließt der Scan ab, aber einzelne Plugins sind fehlgeschlagen, wird die SBOM trotzdem geschrieben und kunnus beendet sich mit Exit 1 und einer Liste der fehlgeschlagenen Plugins — die Pipeline kann eine vollständige SBOM von einer mit Lücken unterscheiden, statt Letztere stillschweigend auszuliefern. --verbosity info (oder KUNNUS_VERBOSITY=info) liefert Details pro Plugin.

Upload-Konfiguration

kunnus upload liest seine Flags aus Umgebungsvariablen — KUNNUS_API_KEY (erforderlich), KUNNUS_COMPONENT_ID und KUNNUS_UPLOAD_URL — die natürliche Form für CI-Secrets. Die Server-Antwort geht nach stdout.

Supply-Chain-Härtung: Release-Images sind mit cosign signiert und tragen SLSA-Build-L2-Provenance als GitHub Artifact Attestations, dazu je Release eine signierte CycloneDX-SBOM. Das Image per Digest pinnen und mit gh attestation verify prüfen — SECURITY.md im Repository zeigt wie.