Image Signing und SBOM mit Cosign und Syft
AI generated
FROM
RUN
Docker · Cosign · SBOM · Supply Chain Security
Image Signing und SBOM Grundlagen
Herkunft und Inhalt von Docker Images kryptografisch beweisen

Image Signing beweist, dass ein Container Image tatsächlich aus der eigenen Pipeline stammt und seit dem Build nicht verändert wurde. Eine Software Bill of Materials listet jede einzelne Komponente im Image auf und macht Supply-Chain-Risiken sichtbar, bevor sie zum Sicherheitsvorfall werden. Cosign und Syft aus dem Sigstore-Ökosystem setzen beides ohne eigene PKI-Infrastruktur um.

19 Min. Lesezeit Cosign · Syft · Sigstore · SBOM Supply Chain Security · CI/CD

1. Warum Image Signing und SBOM zusammengehören

Image Signing beantwortet die Frage, ob ein Container Image tatsächlich von einer vertrauenswürdigen Quelle stammt und seit dem Build unverändert geblieben ist. Eine SBOM, die Software Bill of Materials, beantwortet die andere Frage: aus welchen Paketen, Bibliotheken und Versionen besteht das Image überhaupt. Beide Konzepte adressieren unterschiedliche Risiken in der Supply Chain und ergänzen sich, statt sich zu ersetzen.

Ohne Image Signing kann ein Angreifer, der Zugriff auf eine Registry erlangt, ein manipuliertes Image unter demselben Tag unterschieben, ohne dass Deployment-Prozesse dies bemerken. Ohne SBOM weiß niemand im Team, welche Version von OpenSSL oder welche transitiven Composer-Abhängigkeiten tatsächlich im laufenden Produktions-Container stecken, wenn eine neue kritische CVE öffentlich wird. Vorfälle wie der SolarWinds-Angriff und die Log4Shell-Lücke haben beide Themen von einer Nische zur regulatorischen Anforderung gemacht, etwa im Rahmen der EU Cyber Resilience Act und von Executive Order 14028 in den USA.

Das Sigstore-Projekt, ursprünglich von Google, Red Hat und der Linux Foundation initiiert, liefert mit Cosign das Standardwerkzeug für Image Signing ohne eigene Public-Key-Infrastruktur, während Syft von Anchore als das verbreitetste Werkzeug zur SBOM-Generierung aus Container Images gilt. Zusammen bilden sie das Fundament moderner Supply-Chain-Sicherheit für Docker-Workflows.

2. Cosign: Grundlagen des Image Signing

Cosign signiert ein Container Image, indem es über den Image-Digest, nicht über den Tag, eine kryptografische Signatur erzeugt und diese als separates OCI-Artefakt neben dem Image in derselben Registry ablegt. Der Digest ist entscheidend, weil Tags veränderlich sind, ein Angreifer könnte denselben Tag auf einen anderen Digest umbiegen. Die Signatur bindet sich an den unveränderlichen SHA256-Digest des Manifests und macht jede nachträgliche Manipulation erkennbar.

Der klassische Ansatz mit einem privaten Schlüsselpaar erfordert, dass Teams den privaten Schlüssel sicher verwahren, etwa in einem Hardware Security Module oder einem Secrets-Manager wie HashiCorp Vault. Cosign unterstützt sowohl lokale Schlüsseldateien als auch Cloud-KMS-Integrationen bei AWS, GCP und Azure, was den Schlüssel selbst nie auf der Festplatte des CI-Runners im Klartext ablegt.


# Generate a local key pair for image signing (protected by a passphrase)
cosign generate-key-pair
# Produces cosign.key (private, encrypted) and cosign.pub (public)

# Sign an image by its digest, not by its mutable tag
cosign sign --key cosign.key \
  registry.mironsoft.de/shop-app@sha256:3f29a1c8b7...

# Verify the signature against the public key before deployment
cosign verify --key cosign.pub \
  registry.mironsoft.de/shop-app@sha256:3f29a1c8b7...

3. Keyless Signing mit Sigstore und OIDC

Das eigentliche Alleinstellungsmerkmal von Cosign ist Keyless Signing, das die klassische Schlüsselverwaltung durch kurzlebige Zertifikate ersetzt. Statt eines langlebigen privaten Schlüssels authentifiziert sich der CI-Runner per OIDC-Token, etwa über die native GitHub-Actions- oder GitLab-CI-Identität, bei Fulcio, der Sigstore-Zertifizierungsstelle. Fulcio stellt ein wenige Minuten gültiges Zertifikat aus, mit dem die Signatur erzeugt wird, und protokolliert den gesamten Vorgang unveränderlich im transparenten Rekor-Log.

Der Vorteil gegenüber klassischem Image Signing: Es gibt keinen langlebigen privaten Schlüssel mehr, den ein Angreifer stehlen könnte. Die Vertrauenskette basiert stattdessen auf der Identität des CI-Systems selbst, verifizierbar über den öffentlichen Rekor-Transparenz-Log, den jeder einsehen kann, ohne dass Mironsoft oder ein Kunde eigene Zertifikatsinfrastruktur betreiben muss.


# Keyless signing: authenticates via OIDC (e.g. GitHub Actions identity)
# No private key file needed, Fulcio issues a short-lived certificate
cosign sign registry.mironsoft.de/shop-app@sha256:3f29a1c8b7...

# Verify keyless signature, checking issuer and expected identity
cosign verify \
  --certificate-identity="https://github.com/mironsoft/shop-app/.github/workflows/build.yml@refs/heads/main" \
  --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
  registry.mironsoft.de/shop-app@sha256:3f29a1c8b7...

4. Syft: eine SBOM aus einem Image erzeugen

Syft analysiert die Layer eines Container Images und erkennt darin installierte Betriebssystempakete, Composer-Abhängigkeiten, npm-Pakete, Python-Wheels und Dutzende weitere Paket-Ökosysteme, ganz ohne Zugriff auf den ursprünglichen Quellcode oder Build-Prozess. Das Ergebnis ist eine vollständige SBOM, die jede gefundene Komponente mit exakter Versionsnummer und Ursprungsschicht auflistet.

Für PHP-Projekte erkennt Syft sowohl composer.lock-Einträge als auch tatsächlich installierte Paketdateien im vendor-Verzeichnis, was Diskrepanzen zwischen deklarierten und tatsächlich ausgelieferten Abhängigkeiten aufdeckt. Diese Fähigkeit, direkt aus dem fertigen Image statt aus Quelldateien zu analysieren, macht Syft zum bevorzugten Werkzeug für nachträgliche SBOM-Generierung bei bereits gebauten Images.


# Generate an SBOM directly from a built image, in SPDX JSON format
syft registry.mironsoft.de/shop-app@sha256:3f29a1c8b7... \
  -o spdx-json > shop-app-sbom.spdx.json

# List detected package ecosystems in a human readable table
syft registry.mironsoft.de/shop-app:1.4.0 -o table

# Example output includes rows like:
#   NAME              VERSION   TYPE
#   symfony/console   7.1.0     php-composer
#   openssl           3.0.13    deb

5. SBOM-Formate: SPDX und CycloneDX im Vergleich

Für SBOM-Dokumente haben sich zwei konkurrierende, beide von großen Standardisierungsgremien getragene Formate durchgesetzt. SPDX, gepflegt von der Linux Foundation, stammt ursprünglich aus dem Lizenz-Compliance-Umfeld und ist inzwischen ISO-standardisiert unter ISO/IEC 5962. CycloneDX, entwickelt von OWASP, ist von Anfang an auf Sicherheitsanwendungsfälle wie Schwachstellenkorrelation zugeschnitten und enthält zusätzliche Felder für Vulnerability-Referenzen direkt im Dokument.

Syft unterstützt beide Formate nativ über einfache Ausgabe-Flags, sodass die Wahl meist von den Anforderungen nachgelagerter Werkzeuge abhängt, etwa ob ein Scanner oder eine Compliance-Plattform ein bestimmtes Format erwartet. Für regulatorische Anforderungen in der EU wird zunehmend SPDX referenziert, während viele Sicherheits-Tools wie Grype nativ CycloneDX bevorzugen.

6. Attestations: SBOM als signiertes Anhängsel am Image

Eine unsignierte SBOM-Datei allein ist wenig wert, weil sie nachträglich verändert werden könnte, ohne dass jemand es bemerkt. Cosign löst dieses Problem, indem es die SBOM als In-Toto-Attestation direkt mit dem Image-Digest verknüpft und signiert. Diese Attestation wird, wie die Signatur selbst, als OCI-Artefakt in der Registry neben dem Image gespeichert und lässt sich zusammen mit dem Image ziehen und verifizieren.

Der Vorteil dieser Verknüpfung: Wer das Image zieht, kann in einem einzigen Schritt sowohl die Herkunft über Image Signing als auch den exakten Inhalt über die signierte SBOM-Attestation überprüfen, ohne separate Dateien verwalten oder manuell zuordnen zu müssen.


# Attach a signed SBOM attestation to the image digest
cosign attest --predicate shop-app-sbom.spdx.json \
  --type spdxjson \
  --key cosign.key \
  registry.mironsoft.de/shop-app@sha256:3f29a1c8b7...

# Download and verify the attached SBOM attestation
cosign verify-attestation --key cosign.pub \
  --type spdxjson \
  registry.mironsoft.de/shop-app@sha256:3f29a1c8b7...

7. Verifikation erzwingen: Policy-Controller in Kubernetes

Signieren allein bringt keinen Sicherheitsgewinn, wenn niemand die Signatur beim Deployment tatsächlich prüft. In Kubernetes-Umgebungen übernimmt der Sigstore Policy Controller diese Aufgabe als Admission-Webhook, der jeden neuen Pod-Start abfängt und das referenzierte Image gegen eine hinterlegte Policy verifiziert, bevor der Scheduler den Pod überhaupt startet. Fehlt eine gültige Signatur oder stimmt die Identität nicht mit der erwarteten Pipeline überein, wird der Pod-Start abgelehnt.

Diese erzwungene Verifikation schließt die Lücke zwischen dem reinen Vorhandensein einer Signatur und ihrer tatsächlichen Durchsetzung. Ohne einen Policy-Controller bleibt Image Signing eine reine Dokumentationsmaßnahme, mit Policy-Controller wird es zu einer aktiven Kontrolle, die kompromittierte oder unautorisierte Images in der Produktion technisch verhindert.

8. CI-Pipeline: Bauen, Signieren, SBOM anhängen

In einer vollständigen CI-Pipeline laufen Build, Signierung und SBOM-Erzeugung als aufeinanderfolgende Schritte direkt nach dem Push in die Registry. Reihenfolge und Automatisierung sind hier entscheidend: Ein manueller Zwischenschritt, bei dem ein Entwickler das Image lokal signiert, widerspricht dem Grundgedanken von Keyless Signing, das gerade auf die verifizierbare Identität des automatisierten CI-Systems setzt.

Wichtig ist zudem, dass das Fail-Verhalten der Pipeline definiert wird: Ein Build ohne gültige Signatur oder ohne erzeugte SBOM sollte den Deployment-Schritt blockieren, statt nur eine Warnung zu protokollieren, sonst bleibt die Kontrolle rein kosmetisch.


# GitHub Actions: build, sign keyless, attach SBOM as attestation
build-sign-sbom:
  runs-on: ubuntu-latest
  permissions:
    id-token: write   # required for keyless OIDC signing
    contents: read
  steps:
    - uses: actions/checkout@v4
    - name: Build and push image
      run: |
        docker build -t registry.mironsoft.de/shop-app:${{ github.sha }} .
        docker push registry.mironsoft.de/shop-app:${{ github.sha }}
    - name: Sign image keyless
      run: cosign sign --yes registry.mironsoft.de/shop-app:${{ github.sha }}
    - name: Generate SBOM with Syft
      run: syft registry.mironsoft.de/shop-app:${{ github.sha }} -o spdx-json > sbom.json
    - name: Attach signed SBOM attestation
      run: cosign attest --yes --predicate sbom.json --type spdxjson \
        registry.mironsoft.de/shop-app:${{ github.sha }}

9. Signaturmethoden und SBOM-Formate im Vergleich

Die Wahl zwischen klassischem Schlüssel-basiertem Signing und Keyless Signing, sowie zwischen SPDX und CycloneDX für die SBOM, hängt von organisatorischen und regulatorischen Rahmenbedingungen ab. Die folgende Tabelle stellt die wichtigsten Optionen gegenüber.

Kriterium Schlüssel-basiert Keyless (Sigstore)
Schlüsselverwaltung Nötig, HSM oder Vault empfohlen Entfällt komplett
Vertrauensbasis Privater Schlüssel OIDC-Identität plus Rekor-Log
Offline-Fähigkeit Ja Nein, OIDC-Provider nötig
Transparenz-Log Optional Verpflichtend, öffentlich einsehbar
SBOM-Format-Empfehlung SPDX für Compliance CycloneDX für Vulnerability-Korrelation

Für die meisten neuen CI-Pipelines ist Keyless Signing der pragmatischere Standard, weil kein privater Schlüssel mehr rotiert, gesichert oder versehentlich geleakt werden kann. Air-gapped Umgebungen ohne Internetzugang zum öffentlichen Fulcio- und Rekor-Dienst benötigen jedoch weiterhin klassisches Schlüssel-basiertes Signing oder eine private Sigstore-Instanz.

Mironsoft

Supply-Chain-Sicherheit und Docker-Signierung für produktive Pipelines

Image Signing und SBOM in eurer Pipeline verankern?

Wir richten Cosign-Signierung, ob schlüsselbasiert oder keyless, und automatisierte SBOM-Generierung mit Syft in eurer CI-Pipeline ein und sorgen mit einem Policy-Controller dafür, dass unsignierte Images in Produktion technisch blockiert werden.

Cosign-Einrichtung

Keyless Signing mit OIDC oder klassische Schlüsselverwaltung mit KMS-Integration

SBOM-Automatisierung

Syft-Integration in die Pipeline, SPDX oder CycloneDX je nach Anforderung

Policy-Enforcement

Admission-Controller in Kubernetes, der unsignierte Images ablehnt

10. Zusammenfassung

Image Signing und SBOM Grundlagen ergänzen sich als zwei Seiten derselben Supply-Chain-Sicherheit: Signing beweist Herkunft und Unversehrtheit eines Images über den unveränderlichen Digest, eine SBOM listet transparent jede enthaltene Komponente auf. Cosign aus dem Sigstore-Ökosystem ermöglicht sowohl klassisches Schlüssel-basiertes Signing als auch Keyless Signing über OIDC-Identität und das öffentliche Rekor-Transparenz-Log, ganz ohne eigene Public-Key-Infrastruktur.

Syft erzeugt aus einem fertigen Image eine vollständige SBOM in SPDX oder CycloneDX, die als signierte Attestation direkt am Image-Digest verankert werden kann. Erst ein Policy-Controller in Kubernetes macht aus der reinen Möglichkeit der Verifikation eine tatsächlich erzwungene Kontrolle, die unsignierte oder unbekannte Images vom produktiven Deployment ausschließt.

Image Signing und SBOM mit Cosign und Syft — Das Wichtigste auf einen Blick

Digest statt Tag

Signaturen binden sich immer an den unveränderlichen SHA256-Digest, niemals an einen veränderlichen Tag.

Keyless Signing

Kurzlebige Fulcio-Zertifikate über OIDC ersetzen langlebige private Schlüssel und werden im Rekor-Log protokolliert.

Syft-SBOM

Analysiert Image-Layer direkt und erzeugt eine vollständige Paketliste in SPDX oder CycloneDX.

Policy-Controller

Erzwingt Verifikation als Admission-Webhook in Kubernetes, blockiert unsignierte Images beim Pod-Start.

11. FAQ: Image Signing und SBOM mit Cosign und Syft

1Was ist Image Signing?
Eine Signatur, die Herkunft und Unversehrtheit eines Images seit dem Build beweist.
2Was ist eine SBOM?
Eine vollständige Liste aller im Image enthaltenen Pakete, Bibliotheken und Versionen.
3Was ist Keyless Signing?
Signieren ohne privaten Schlüssel, über kurzlebige Fulcio-Zertifikate basierend auf OIDC-Identität.
4Warum Digest statt Tag?
Tags sind veränderlich. Der Digest ist unveränderlich und bindet die Signatur eindeutig an den Inhalt.
5Was macht Syft?
Analysiert Image-Layer und erzeugt eine vollständige SBOM mit erkannten Paketen aus vielen Ökosystemen.
6SPDX oder CycloneDX?
SPDX für Compliance, CycloneDX für Sicherheits-Korrelation. Syft unterstützt beide Formate.
7Was ist eine Attestation?
Eine signierte Zusatzinformation wie eine SBOM, direkt mit dem Image-Digest verknüpft.
8Wie wird Signing erzwungen?
Über einen Policy-Controller als Admission-Webhook, der Pod-Starts ohne gültige Signatur blockiert.
9Brauche ich eine eigene CA?
Nein, Fulcio übernimmt das öffentlich. Nur Air-gapped Umgebungen brauchen eine private Sigstore-Instanz.
10Getrennt nutzbar?
Ja, aber der volle Nutzen entsteht erst mit der SBOM als signierter Attestation am Image-Digest.