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. unblobDodaj 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.5Yocto / 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 obrazieMeldora 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 -jnpm / 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.jsonWysył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_TAGGitHub 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.