14 Kasım 2026 CumartesiRSS

CI/CDYazılım

SBOM Nedir? Syft ve CycloneDX ile SBOM Üretme Rehberi

Aziz Özdemiroğlu

Yeni bir açık duyurulduğunda ilk soru hep aynıdır: "Biz bunu kullanıyor muyuz?" Yazılım malzeme listesi (SBOM, Software Bill of Materials), bu soruya dakikalar içinde cevap vermenizi sağlayan, yazılımınızdaki tüm bileşenlerin makinece okunabilir envanteridir. Bu rehberde SBOM'un ne olduğunu, SPDX ile CycloneDX formatları arasındaki farkı, Syft ile nasıl üretileceğini ve CI/CD hattına nasıl entegre edileceğini uygulamalı olarak anlatıyoruz.

Kısaca

  • SBOM, bir yazılımın içerdiği tüm paketlerin (doğrudan ve dolaylı) adını, sürümünü, lisansını ve kaynağını listeleyen standart bir belgedir.
  • İki baskın format var: SPDX (Linux Foundation, ISO/IEC 5962) ve CycloneDX (OWASP, Ecma-424).
  • Syft ile kaynak dizinden veya container imajından tek komutla SBOM üretilir. Grype veya Trivy ile aynı SBOM açık taramasında kullanılır.
  • SBOM'u her sürümde üretip artefakt olarak saklarsanız, yeni bir CVE çıktığında etkilenen sürümleri geriye dönük bulabilirsiniz.
  • AB Siber Dayanıklılık Yasası (Cyber Resilience Act) gibi düzenlemeler, dijital ürün üreticilerinden SBOM tutmalarını bekliyor.

SBOM neden gerekli?

Modern bir uygulamanın kodunun büyük çoğunluğu açık kaynak bağımlılıklardan oluşur. Doğrudan eklediğiniz 30 paket, dolaylı bağımlılıklarla yüzlerce pakete dönüşebilir. SBOM olmadan:

  • Log4Shell gibi bir açıkta "hangi servislerimiz etkileniyor?" sorusu günlerce sürebilir.
  • Lisans uyumluluğu (GPL bileşeni ticari üründe mi?) belirsiz kalır.
  • Müşterilerinize veya denetçilere tedarik zinciri şeffaflığı sunamazsınız.

Formatlar: SPDX ve CycloneDX

SPDX CycloneDX
Sahibi Linux Foundation OWASP
Standart ISO/IEC 5962:2021 Ecma-424
Güçlü yanı Lisans ve hukuki uyumluluk ayrıntısı Güvenlik kullanım senaryoları, VEX, hizmetler, ML-BOM
Dosya biçimleri JSON, YAML, RDF, tag-value JSON, XML, Protobuf
Yaygın kullanım Lisans denetimi, Linux dağıtımları Güvenlik açığı yönetimi, uygulama güvenliği araçları

Pratik öneri: Güvenlik odaklıysanız CycloneDX JSON ile başlayın. Müşteriniz SPDX istiyorsa Syft ikisini de aynı anda üretebilir.

SBOM'da neler bulunur?

Minimum bir SBOM kaydı en az şunları içermelidir:

  • Bileşen adı ve sürümü
  • Benzersiz tanımlayıcı: PURL (Package URL, ör. pkg:npm/[email protected]) ve/veya CPE
  • Tedarikçi / yayıncı
  • Bileşenler arası bağımlılık ilişkisi
  • SBOM'u üreten araç ve oluşturulma zamanı
  • Mümkünse lisans ve kriptografik özet (hash)
{
  "type": "library",
  "name": "lodash",
  "version": "4.17.21",
  "purl": "pkg:npm/[email protected]",
  "licenses": [{ "license": { "id": "MIT" } }]
}

Syft ile SBOM üretmek

Kurulum

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

Betiği borulamadan önce içeriğini okumak iyi bir alışkanlıktır. Alternatif olarak GitHub sürümlerinden imzalı ikili dosyayı indirip doğrulayabilirsiniz.

Kaynak dizinden

syft dir:. -o cyclonedx-json=sbom.cdx.json

Container imajından (önerilen)

İmaj SBOM'u, gerçekten dağıtılan içeriği yansıtır. İşletim sistemi paketleri (apk, deb, rpm) de dahildir:

syft ghcr.io/ornek/uygulama:1.4.2 \
  -o cyclonedx-json=sbom.cdx.json \
  -o spdx-json=sbom.spdx.json

Hızlı inceleme

syft ghcr.io/ornek/uygulama:1.4.2 -o table | head -20
jq '.components | length' sbom.cdx.json                         # bileşen sayısı
jq -r '.components[] | select(.name=="openssl") | .version' sbom.cdx.json

SBOM ile açık taraması

# Grype, imajı yeniden taramadan doğrudan SBOM üzerinden çalışır
grype sbom:./sbom.cdx.json --fail-on high

# Trivy de SBOM okuyabilir
trivy sbom sbom.cdx.json --severity HIGH,CRITICAL

Bu ayrımın önemi şu: SBOM'u bir kez üretip saklarsınız, açık veritabanı her gün güncellenir. Aynı SBOM'u yarın yeniden tararsanız bugün bilinmeyen açıkları da yakalarsınız.

CI/CD entegrasyonu (GitHub Actions)

name: sbom
on:
  push:
    tags: ["v*"]
permissions:
  contents: write        # sürüme dosya eklemek için
jobs:
  sbom:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@<SHA> # v5
        with: { persist-credentials: false }
      - name: İmajı derle
        run: docker build -t uygulama:${{ github.ref_name }} .
      - name: SBOM üret
        uses: anchore/sbom-action@<SHA> # v0
        with:
          image: uygulama:${{ github.ref_name }}
          format: cyclonedx-json
          output-file: sbom.cdx.json
      - name: Açık taraması
        uses: anchore/scan-action@<SHA> # v6
        with:
          sbom: sbom.cdx.json
          fail-build: true
          severity-cutoff: high
      - name: SBOM'u sürüme ekle
        env:
          GH_TOKEN: ${{ github.token }}
        run: gh release upload "${{ github.ref_name }}" sbom.cdx.json --clobber

SBOM'u imaja iliştirmek ve imzalamak

SBOM'un imajla birlikte taşınması, alıcının doğruluğundan emin olması için önemlidir. Sigstore cosign ile SBOM'u imaja bir tasdik (attestation) olarak ekleyebilirsiniz:

cosign attest --predicate sbom.cdx.json --type cyclonedx ghcr.io/ornek/uygulama:1.4.2
cosign verify-attestation --type cyclonedx \
  --certificate-identity-regexp 'https://github.com/ornek/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  ghcr.io/ornek/uygulama:1.4.2

VEX: "Açık var ama bizi etkilemiyor"

Tarayıcılar çoğu zaman, açıklı fonksiyonun hiç çağrılmadığı bileşenler için de alarm üretir. VEX (Vulnerability Exploitability eXchange) belgeleri, bir CVE'nin ürününüzü etkileyip etkilemediğini gerekçesiyle belirtmenizi sağlar (not_affected, affected, fixed, under_investigation). CycloneDX VEX'i doğrudan destekler. OpenVEX de yaygın bir alternatiftir. Bu belgeler gürültüyü azaltır ve müşterilerinize net bilgi verir.

Uygulamalı senaryo: yeni bir CVE çıktı, etkileniyor muyuz?

Diyelim ki sabah, yaygın kullanılan bir sıkıştırma kütüphanesinde kritik bir açık duyuruldu ve 1.4.0 ile 1.4.6 arası sürümler etkileniyor. Elinizde son 20 sürümün SBOM'ları bir klasörde (veya artefakt deposunda) duruyorsa:

# Tüm SBOM'larda paketi ve sürümünü listele
for f in sboms/*.cdx.json; do
  jq -r --arg f "$f" '.components[]? | select(.name=="ornek-sikistirma") | "\($f)\t\(.version)"' "$f"
done | sort -V -k2

Çıktı size hangi sürümünüzün hangi kütüphane sürümünü içerdiğini saniyeler içinde gösterir. Ardından:

  1. Etkilenen sürümlerden hangilerinin hâlâ üretimde çalıştığını dağıtım kayıtlarınızla eşleştirin.
  2. Kütüphaneyi güncelleyip yeni bir sürüm çıkarın ve yeni SBOM'un düzeltilmiş sürümü içerdiğini doğrulayın.
  3. Açığın ürününüzü gerçekten etkilemediğini analizle gösterebiliyorsanız (ör. açıklı fonksiyon hiç çağrılmıyor), bunu bir VEX kaydıyla belgeleyin ve müşterilerinizle paylaşın.

SBOM'u olmayan bir ekip aynı soruyu cevaplamak için her depoyu tek tek klonlayıp kilit dosyalarını incelemek, container imajlarını tek tek taramak zorunda kalır.

SBOM'ları nerede saklamalı?

Seçenek Artı Eksi
Git sürümüne (release) ek dosya Basit, sürümle birlikte Merkezi sorgulama zor
OCI kayıt defterinde imaj tasdiki İmajla birlikte taşınır, imzalanabilir Sorgulamak için araç gerekir
Dependency-Track gibi SBOM platformu Merkezi pano, sürekli açık takibi, politika kontrolleri Ek bir servis işletmek gerekir

Birden fazla ürün veya ekip varsa OWASP Dependency-Track gibi bir platforma SBOM'ları otomatik yüklemek, "etkileniyor muyuz?" sorusunu bir arama kutusuna indirger.

SBOM programı kontrol listesi

  • Her sürüm etiketi için otomatik SBOM üretiliyor (imaj tabanlı)
  • SBOM'lar sürümle birlikte saklanıyor (release, artefakt deposu veya OCI tasdiki)
  • SBOM'lar günlük olarak güncel açık veritabanına karşı yeniden taranıyor
  • Kritik bulgular build'i durduruyor, bilinçli istisnalar VEX ile belgeleniyor
  • Lisans politikası (ör. "AGPL yok") otomatik kontrol ediliyor
  • Yeni bir CVE çıktığında "hangi sürümlerimiz etkileniyor?" sorusu tek sorguyla cevaplanabiliyor

Sonuç

SBOM, tedarik zinciri güvenliğinin "envanter" adımıdır. Envanteriniz yoksa koruyamazsınız. Syft ile ilk SBOM'unuzu üretmek beş dakika sürer. Asıl değer ise onu her sürümde otomatik üretip saklamaktan ve düzenli taramaktan gelir. Bir sonraki büyük açık duyurusunda "etkileniyor muyuz?" sorusuna günler yerine dakikalar içinde cevap verebilirsiniz.

Kaynaklar

#Tedarik Zinciri#SBOM#CycloneDX#SPDX#Syft#Grype#VEX

Benzer Yazılar