Meldora

Jak wygenerować SBOM

SBOM powstaje z gotowego artefaktu (obrazu firmware, katalogu, pakietu) albo z kodu źródłowego. Najprościej dodać jedno polecenie do pipeline'u, które po każdym wydaniu wysyła plik do Meldory.

Syft (obraz, katalog, archiwum)

Firmware Linux (Yocto, Buildroot, OpenWrt), obrazy kontenerów, dowolny katalog z binariami.
syft dir:./rootfs -o cyclonedx-json > sbom.cdx.json
syft dir:./rootfs-unpacked -o cyclonedx-json > sbom.cdx.json   # obraz firmware najpierw rozpakuj, np. unblob
Dodaj wersję produktu: syft … --source-name 'Bramka GW-10' --source-version 4.2.1

cdxgen (kod źródłowy)

Projekty npm, Python, Java, .NET, Go, Rust, C/C++ z CMake lub Conan.
npx @cyclonedx/cdxgen -o sbom.cdx.json --project-name 'Kasomat Panel' --project-version 2.7.5

Yocto / OpenEmbedded

Firmware budowane w Yocto.
# conf/local.conf
INHERIT += "create-spdx"
SPDX_INCLUDE_SOURCES = "0"
# wynik: tmp/deploy/spdx/… (SPDX JSON) albo użyj Syft na obrazie
Meldora przyjmuje SPDX; jeśli chcesz CycloneDX, uruchom Syft na obrazie rootfs.

Zephyr RTOS

Firmware na Zephyr.
west spdx --init
west build -b <board>
west spdx

.NET

Aplikacje i usługi .NET.
dotnet tool install --global CycloneDX
dotnet CycloneDX MyApp.sln -o ./sbom -j

npm / Python

Aplikacje webowe i narzędzia.
npx @cyclonedx/cyclonedx-npm --output-file sbom.cdx.json
pip install cyclonedx-bom && cyclonedx-py environment -o sbom.cdx.json

Wysyłka z CI

Token API tworzysz w ustawieniach (widoczny tylko raz) i zapisujesz jako sekret. Identyfikator produktu znajdziesz w przykładzie wywołania w ustawieniach.

GitLab CI

sbom:
  stage: release
  image: alpine:3.20
  script:
    - apk add --no-cache curl
    - curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
    - syft dir:./rootfs -o cyclonedx-json --source-version "$CI_COMMIT_TAG" > sbom.cdx.json
    - curl -fsS -X POST "https://meldora.pl/api/products/$MELDORA_PRODUCT/sbom?version=$CI_COMMIT_TAG" -H "Authorization: Bearer $MELDORA_TOKEN" -F "file=@sbom.cdx.json"
  rules:
    - if: $CI_COMMIT_TAG

GitHub Actions

- name: SBOM
  uses: anchore/sbom-action@v0
  with:
    path: ./rootfs
    format: cyclonedx-json
    output-file: sbom.cdx.json
- name: Wyślij do Meldory
  run: curl -fsS -X POST "https://meldora.pl/api/products/${{ vars.MELDORA_PRODUCT }}/sbom?version=${{ github.ref_name }}" -H "Authorization: Bearer ${{ secrets.MELDORA_TOKEN }}" -F "file=@sbom.cdx.json"

Jakość SBOM

  • Każdy komponent powinien mieć wersję; komponent bez wersji nie jest monitorowany.
  • Zadbaj o PURL: narzędzia dodają je same, SBOM-y pisane ręcznie zwykle ich nie mają.
  • Podaj wersję produktu w metadanych SBOM; wtedy plik sam trafia do właściwej wersji.
  • Generuj SBOM z finalnego artefaktu, nie z repozytorium przed buildem: różnice w wersjach bibliotek są częste.
  • Dołącz zależności statycznie linkowane (np. w C/C++): skanery ich nie widzą, a CRA ich dotyczy.