Jak Wygenerować SBOM Zgodny z CRA: Narzędzia, Formaty i Integracja CI/CD
Praktyczny przewodnik po generowaniu Software Bill of Materials dla zgodności z CRA. Obejmuje narzędzia open-source, wybór formatu i automatyczną integrację z pipeline'ami.
In this article
CRA wymaga Software Bill of Materials. Każdy artykuł konkurencji ci to powie. Żaden nie pokaże, jak go wygenerować.
Ten przewodnik obejmuje narzędzia open-source, wybór formatu i integrację CI/CD , bez uzależnienia od dostawcy.
Wskazówka: Zacznij od Syft lub Trivy do generowania SBOM — oba wspierają wyjście CycloneDX i SPDX i łatwo integrują się z pipeline'ami CI/CD.
Podsumowanie
- CRA wymaga czytelnych maszynowo SBOM obejmujących "co najmniej zależności najwyższego poziomu"
- Zalecane formaty: CycloneDX 1.4+ lub SPDX 2.3+ (według BSI TR-03183)
- Narzędzia open-source: Syft (obrazy/systemy plików), Trivy (kontenery), cdxgen (kod źródłowy)
- Zintegruj generowanie SBOM z CI/CD dla automatycznych aktualizacji
- Jakość ma znaczenie: minimalne pola obejmują nazwę pakietu, wersję, dostawcę, hash, licencję
Ważne: CRA wymaga czytelnych maszynowo SBOM obejmujących wszystkie zależności przechodnie. Prosty package.json lub requirements.txt NIE jest wystarczający.
Co Faktycznie Wymaga CRA
Zacznijmy od tego, co mówi rozporządzenie. Załącznik I, Część II CRA wymaga od producentów:
"identyfikacji i dokumentowania podatności oraz komponentów zawartych w produkcie, w tym poprzez sporządzenie zestawienia materiałów oprogramowania w powszechnie używanym i czytelnym maszynowo formacie"
Kluczowe punkty:
- Format czytelny maszynowo: Nie PDF, nie arkusz kalkulacyjny , dane strukturalne
- Co najmniej zależności najwyższego poziomu: Minimalny zakres, choć więcej jest lepsze
- Nie musi być publiczny: Dostarczany organom na żądanie
- Musi być aktualizowany: Z każdym wydaniem, poprawką lub zmianą komponentu
CRA nie wymaga konkretnego formatu, ale wysiłki standaryzacyjne wyraźnie wskazują na CycloneDX i SPDX.
Wybór Formatu: CycloneDX vs SPDX
Dwa formaty dominują krajobraz SBOM. Oba są akceptowalne dla zgodności z CRA.
CycloneDX
Pochodzenie: Projekt OWASP, zorientowany na bezpieczeństwo Aktualna wersja: 1.6 (1.4+ zalecane dla CRA) Najlepszy dla: Zarządzania bezpieczeństwem i podatnościami
Mocne strony:
- Natywne wsparcie VEX (Vulnerability Exploitability eXchange)
- Zaprojektowany dla przypadków użycia związanych z bezpieczeństwem
- Lżejsza specyfikacja, łatwiejsza implementacja
- Silny ekosystem narzędzi
- Bezpośrednie linkowanie CVE/podatności
Przykład JSON:
{
"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
Pochodzenie: Linux Foundation, zorientowany na zgodność licencyjną Aktualna wersja: 2.3 (standard ISO/IEC 5962:2021) Najlepszy dla: Zgodności licencyjnej i przeglądu prawnego
Mocne strony:
- Międzynarodowy standard ISO
- Kompleksowa składnia wyrażeń licencyjnych
- Silny w kontekstach zgodności open source
- Dłuższa historia
- Lepszy dla złożonych scenariuszy licencyjnych
Przykład JSON:
{
"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..."
}
]
}
]
}
Który Wybrać?
| Przypadek Użycia | Rekomendacja |
|---|---|
| Główny fokus na bezpieczeństwo/podatności | CycloneDX |
| Główny fokus na zgodność licencyjną | SPDX |
| Potrzebujesz integracji VEX | CycloneDX |
| Przedsiębiorstwo z istniejącymi narzędziami SPDX | SPDX |
| Rynek niemiecki (BSI TR-03183) | Oba (oba zalecane) |
| Zaczynasz od zera, bez preferencji | CycloneDX (prostszy, zorientowany na bezpieczeństwo) |
Dla zgodności z CRA oba formaty działają. Wybierz jeden i bądź konsekwentny.
Narzędzia Open-Source do Generowania SBOM
Bez uzależnienia od dostawcy. Te narzędzia są darmowe, open-source i gotowe do produkcji.
Syft (Anchore)
Najlepszy dla: Obrazów kontenerów, systemów plików, archiwów Licencja: Apache 2.0 Formaty wyjściowe: CycloneDX, SPDX, Syft JSON
Instalacja:
# 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
Przykłady użycia:
# Skanuj obraz kontenera
syft alpine:latest -o cyclonedx-json > sbom.cdx.json
# Skanuj katalog
syft dir:/path/to/project -o cyclonedx-json > sbom.cdx.json
# Skanuj archiwum
syft /path/to/archive.tar.gz -o spdx-json > sbom.spdx.json
# Skanuj z konkretnymi katalogerami (np. tylko Python)
syft dir:. -o cyclonedx-json --select-catalogers python
Wspierane ekosystemy: Python, Node.js, Ruby, Java, Go, Rust, PHP, .NET i więcej.
Trivy (Aqua Security)
Najlepszy dla: Obrazów kontenerów z wbudowanym kontekstem podatności Licencja: Apache 2.0 Formaty wyjściowe: CycloneDX, SPDX, plus raporty o podatnościach
Instalacja:
# Linux (Debian/Ubuntu)
sudo apt-get install trivy
# macOS
brew install trivy
# Docker
docker pull aquasec/trivy
Przykłady użycia:
# Generuj SBOM z obrazu kontenera
trivy image --format cyclonedx --output sbom.cdx.json alpine:latest
# Generuj SBOM z systemu plików
trivy fs --format cyclonedx --output sbom.cdx.json /path/to/project
# Generuj SBOM z informacjami o podatnościach
trivy image --format cyclonedx --output sbom.cdx.json \
--scanners vuln nginx:latest
Zaleta: Trivy może generować SBOM i skanować pod kątem podatności w jednym przebiegu.
cdxgen (CycloneDX)
Najlepszy dla: Analizy kodu źródłowego w wielu językach Licencja: Apache 2.0 Format wyjściowy: CycloneDX
Instalacja:
# npm (wymaga Node.js)
npm install -g @cyclonedx/cdxgen
# Docker
docker pull ghcr.io/cyclonedx/cdxgen
Przykłady użycia:
# Skanuj bieżący katalog
cdxgen -o sbom.json
# Skanuj konkretny typ projektu
cdxgen -t python -o sbom.json
# Skanuj z głębokim rozwiązywaniem zależności
cdxgen --deep -o sbom.json
# Skanuj konkretny katalog
cdxgen -o sbom.json /path/to/project
Wspierane języki: JavaScript, Python, Java, Go, Rust, PHP, Ruby, .NET, C/C++ i więcej.
Porównanie Narzędzi
| Funkcja | Syft | Trivy | cdxgen |
|---|---|---|---|
| Obrazy kontenerów | Doskonałe | Doskonałe | Dobre |
| Kod źródłowy | Dobre | Dobre | Doskonałe |
| Skanowanie systemu plików | Doskonałe | Dobre | Dobre |
| Skanowanie podatności | Nie (użyj Grype) | Tak | Nie |
| Wyjście CycloneDX | Tak | Tak | Tak |
| Wyjście SPDX | Tak | Tak | Nie |
| Szybkość | Szybkie | Średnie | Średnie |
| Pokrycie języków | Bardzo szerokie | Szerokie | Bardzo szerokie |
Rekomendacja: Zacznij od Syft dla większości przypadków użycia. Dodaj Trivy, jeśli potrzebujesz zintegrowanego skanowania podatności. Użyj cdxgen dla złożonych projektów kodu źródłowego.
Integracja CI/CD
Ręczne generowanie SBOM nie skaluje się. Zintegruj je z pipeline'em budowania.
GitHub Actions
name: SBOM Generation
on:
push:
branches: [main]
release:
types: [published]
jobs:
sbom:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install Syft
run: |
curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin
- name: Generate SBOM
run: |
syft dir:. -o cyclonedx-json > sbom.cdx.json
- name: Upload SBOM as artifact
uses: actions/upload-artifact@v4
with:
name: sbom
path: sbom.cdx.json
retention-days: 90
# Opcjonalnie: Prześlij do CRA Evidence
- name: Upload to 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('Generate SBOM') {
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('Archive SBOM') {
steps {
archiveArtifacts artifacts: 'sbom.cdx.json', fingerprint: true
}
}
}
}
Integracja z Budowaniem Docker
Generuj SBOM podczas budowania Docker:
# Multi-stage build z generowaniem SBOM
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Generuj SBOM w etapie budowania
FROM anchore/syft:latest AS sbom
COPY --from=builder /app /app
RUN syft dir:/app -o cyclonedx-json > /sbom.cdx.json
# Finalny obraz
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"]
Jakość SBOM: Spełnianie TR-03183
Niemiecka wytyczna techniczna BSI TR-03183 rozszerza minimalne elementy NTIA. Chociaż nie jest prawnie wymagana w całej UE, przestrzeganie TR-03183 zapewnia wysoką jakość SBOM.
Wymagane Pola
| Pole | Wymagane Przez | Uwagi |
|---|---|---|
| Nazwa komponentu | NTIA + TR-03183 | Identyfikator pakietu |
| Wersja | NTIA + TR-03183 | Dokładny ciąg wersji |
| Dostawca | NTIA + TR-03183 | Vendor lub opiekun |
| Unikalny identyfikator | NTIA + TR-03183 | Zalecany PURL |
| Relacja zależności | NTIA + TR-03183 | Bezpośrednia vs przechodnia |
| Autor SBOM | NTIA + TR-03183 | Kto utworzył SBOM |
| Znacznik czasowy | NTIA + TR-03183 | Kiedy utworzono SBOM |
| Wartości hash | TR-03183 | Minimum SHA-256 |
| Licencja | TR-03183 | ID licencji SPDX |
| Repozytorium źródłowe | TR-03183 | URL VCS jeśli dostępny |
Walidacja Jakości SBOM
Użyj tych narzędzi do sprawdzenia swojego SBOM:
# Waliduj format CycloneDX
npm install -g @cyclonedx/cyclonedx-cli
cyclonedx validate --input-file sbom.cdx.json
# Sprawdź minimalne pola za pomocą jq
jq '.components[] | select(.version == null or .purl == null)' sbom.cdx.json
# Zlicz komponenty z hashami
jq '[.components[] | select(.hashes != null)] | length' sbom.cdx.json
Poprawa Jakości SBOM
Jeśli twój SBOM ma braki w danych:
- Używaj plików blokady:
package-lock.json,Pipfile.lock,go.sumzawierają więcej metadanych - Skanuj zbudowane artefakty: Bardziej kompletne niż skanowanie samego źródła
- Łącz narzędzia: Różne narzędzia znajdują różne komponenty
- Dodawaj ręczne wpisy: Dla komponentów komercyjnych lub wewnętrznych
Utrzymywanie Aktualności SBOM
SBOM to migawka. Musi być aktualizowany, aby pozostać użyteczny.
Kiedy Regenerować
- Każde wydanie (major, minor, patch)
- Po aktualizacjach zależności
- Po poprawkach bezpieczeństwa
- Gdy zmienia się konfiguracja budowania
Strategia Wersjonowania
product-v1.0.0-sbom.cdx.json
product-v1.0.1-sbom.cdx.json
product-v1.1.0-sbom.cdx.json
Lub używaj znaczników czasowych:
product-sbom-2026-01-15T10-30-00Z.cdx.json
Przechowywanie
CRA wymaga 10-letniego przechowywania. Przechowuj historyczne SBOM:
- W repozytorium artefaktów
- W S3/chmurze z politykami cyklu życia
- W CRA Evidence dla zintegrowanego śledzenia zgodności
Częste Pułapki
Jednorazowe generowanie SBOM
Problem: Utworzenie SBOM raz i nigdy go nie aktualizowanie.
Rozwiązanie: Zautomatyzuj generowanie SBOM w CI/CD. Każde budowanie powinno produkować świeży SBOM.
Brakujące zależności przechodnie
Problem: SBOM wymienia tylko bezpośrednie zależności, pomijając zagnieżdżone pakiety.
Rozwiązanie: Używaj plików blokady, skanuj zbudowane artefakty, włączaj opcje głębokiego skanowania.
Zła wersja formatu
Problem: Używanie CycloneDX 1.3, gdy TR-03183 zaleca 1.4+.
Rozwiązanie: Sprawdź wersję wyjściową swojego narzędzia. Regularnie aktualizuj narzędzia.
Brak wartości hash
Problem: Komponenty bez hashów kryptograficznych nie mogą być zweryfikowane.
Rozwiązanie: Upewnij się, że twoje narzędzie zawiera hashe. Skanuj zbudowane artefakty, a nie tylko źródło.
Ręczne tworzenie
Problem: Ręczne tworzenie SBOM jest podatne na błędy i niemożliwe do utrzymania.
Rozwiązanie: Zawsze automatyzuj. Ręczne wpisy tylko dla komponentów, których narzędzia nie mogą wykryć.
Ignorowanie komponentów wewnętrznych
Problem: Dokumentowanie tylko zależności open-source, nie kodu własnościowego.
Rozwiązanie: Komponenty wewnętrzne też wymagają dokumentacji. Dodaj je ręcznie lub skonfiguruj odpowiednio narzędzia.
Lista Kontrolna Implementacji SBOM
LISTA KONTROLNA IMPLEMENTACJI SBOM
WYBÓR FORMATU:
[ ] Wybrany CycloneDX 1.4+ lub SPDX 2.3+
[ ] Format JSON (czytelny maszynowo)
[ ] Decyzja udokumentowana
NARZĘDZIA:
[ ] Wybrane główne narzędzie (Syft/Trivy/cdxgen)
[ ] Narzędzie zainstalowane i przetestowane lokalnie
[ ] Wyjście zwalidowane względem schematu
INTEGRACJA CI/CD:
[ ] Generowanie SBOM dodane do pipeline'u budowania
[ ] Artefakty przechowywane z odpowiednim czasem retencji
[ ] Generowanie wyzwalane przy wydaniach
ZAPEWNIENIE JAKOŚCI:
[ ] Wszystkie komponenty mają: nazwę, wersję, dostawcę
[ ] Wartości hash obecne (SHA-256+)
[ ] Informacje o licencji zawarte
[ ] Zależności przechodnie przechwycone
[ ] Identyfikatory PURL użyte
OPERACJE:
[ ] SBOM wersjonowany wraz z wydaniami produktu
[ ] Historyczne SBOM zarchiwizowane (10-letnia retencja)
[ ] Proces udokumentowany dla zespołu
OPCJONALNIE - INTEGRACJA CRA EVIDENCE:
[ ] Token API skonfigurowany
[ ] Przesyłanie zautomatyzowane przy wydaniu
[ ] Scoring jakości włączony
Następne Kroki
Z zautomatyzowanym generowaniem SBOM jesteś gotowy na:
- Skanowanie podatności: Połącz SBOM z bazami danych podatności
- Zgodność licencyjna: Analizuj zobowiązania licencyjne
- Integrację z dokumentacją techniczną: Włącz SBOM do dokumentacji CRA
- Przygotowanie do raportowania ENISA: SBOM umożliwiają szybką identyfikację podatności
CRA Evidence automatyzuje cały ten workflow:
- Przesyłaj SBOM przez CLI lub CI/CD
- Automatyczne skanowanie podatności z Trivy
- Scoring jakości TR-03183
- Eksport dokumentacji technicznej ze zintegrowanymi SBOM
Zacznij generować zgodne SBOM na app.craevidence.com.
Wymagania: Dowiedz się, czego CRA wymaga od SBOM w naszym przewodniku po wymaganiach SBOM.
Jakość: Zwaliduj swój SBOM zgodnie ze standardem BSI TR-03183.
VEX: Dodaj kontekst podatności do swojego SBOM za pomocą dokumentów VEX.
Ten artykuł służy wyłącznie celom informacyjnym i nie stanowi porady prawnej. W celu uzyskania konkretnych wskazówek dotyczących zgodności, skonsultuj się z wykwalifikowanym prawnikiem zaznajomionym z przepisami UE dotyczącymi produktów.
Powiązane artykuły
Czy inteligentne kamery są produktami ważnymi w świetle...
Inteligentne kamery monitorujące są klasyfikowane jako produkty ważne (Klasa...
9 minEU Cybersecurity Act 2: Zakazy w Łańcuchu Dostaw,...
20 stycznia 2026 roku UE zaproponowała pełne zastąpienie Cybersecurity Act....
9 minKlasyfikacja produktów CRA: Czy Twój produkt jest...
Praktyczny przewodnik do określenia kategorii CRA Twojego produktu. Zawiera...
5 minDoes the CRA apply to your product?
Odpowiedz na 6 prostych pytań, aby sprawdzić, czy Twój produkt podlega unijnemu Cyber Resilience Act. Otrzymaj wynik w mniej niż 2 minuty.
Gotowy na osiągnięcie zgodności z CRA?
Zacznij zarządzać swoimi SBOM-ami i dokumentacją zgodności z CRA Evidence.