Container-Images signieren: Sigstore, Notary und Docker Content Trust im Vergleich
Hrittik Roy
26. September 2023
0 Min. LesezeitIm modernen Software-Ökosystem ist die Containerisierung zu einer beliebten Methode geworden, Anwendungen zu paketieren und bereitzustellen. Mit diesem wachsenden Trend ist die Sicherheit von Software-Supply-Chains zu einem kritischen Anliegen für Unternehmen jeder Größe geworden. Die Umsetzung bewährter Verfahren wie das Signieren und Überprüfen von Images, um Man-in-the-Middle-Angriffe (MITM) einzudämmen und ihre Authentizität und Aktualität zu validieren, spielt eine entscheidende Rolle für den Schutz der Integrität der Software-Supply-Chain.
Beim Signieren von Container-Images kommen kryptografische Verfahren zum Einsatz, die das Image an eine bestimmte Entität oder Organisation binden und so eine Vertrauenskette schaffen. Dadurch lassen sich Authentizität und Integrität des in den Images enthaltenen Codes sicherstellen.
Darüber hinaus hilft das Signieren von Container-Images dabei, Eigentümerschaft und Verantwortlichkeit festzustellen. Signaturen können für Audits nützlich sein, da sie Organisationen dabei helfen, die Herkunft von Images und im Laufe der Zeit daran vorgenommene Änderungen nachzuverfolgen und zu überprüfen sowie bestimmte Compliance-Standards und Vorschriften durchzusetzen.
In diesem Artikel vergleichen wir drei beliebte Lösungen zum Signieren von Containern: Sigstore Cosign, Notary v2 und Docker Content Trust (DCT), auch bekannt als Notary v1. Sie erfahren mehr über ihre Funktionen, Möglichkeiten und Eignung zum Schutz von Container-Image-Supply-Chains. Außerdem schließen wir den Artikel mit einem Tutorial ab, das Ihnen zeigt, wie Sie eines der Tools in Ihren Workflow integrieren.
Tools zum Signieren von Containern
Wenn es darum geht, Ihre Images sicher zu signieren, stehen zahlreiche Tools zur Auswahl. Zu den bekanntesten zählen Cosign, Notary und DCT – jedes dieser Tools hat eigene Spezifikationen und Anforderungen.
Sigstore Cosign
Cosign ist ein Tool, mit dem Sie Software nahtlos und sicher signieren, überprüfen und schützen können. Es unterliegt der Apache License 2.0 und basiert auf dem Sigstore-Standard, der die Integrität und Authentizität von Container-Images gewährleistet. Cosign wird immer beliebter und hat auf GitHub bereits über 3.400 Sterne.
Cosign ist für die Unterstützung des schlüssellosen Signierens über die Sigstore-Zertifizierungsstelle Fulcio und das unveränderliche Transparenzprotokoll Rekor mit authentifizierter OpenID-Connect-Identität (OIDC) bekannt. Dabei kommt eine unsichtbare Infrastruktur zum Einsatz. Das bedeutet, dass Sie sich nicht selbst um die Verwaltung und Wartung von Schlüsseln kümmern müssen. Cosign vereinfacht den Prozess durch die Erstellung kurzlebiger Schlüssel, sodass Sie die Authentizität signierter Images und Blobs einfach überprüfen und diese signieren können.
Docker Content Trust
Docker Content Trust (DCT) wurde 2015 von Docker entwickelt und anschließend als Notary-Projekt an die Cloud Native Computing Foundation (CNCF) gespendet. Es befindet sich derzeit in der Inkubationsphase.
Mit DCT können Sie Container-Images signieren und überprüfen. Dabei wird die Integrität und Authentizität bestimmter Image-Tags durch clientseitige oder Laufzeitüberprüfung sichergestellt.
Notary v1 funktioniert, indem Ihr öffentlicher Schlüssel zur Registry hinzugefügt und Ihr Image vor dem Hochladen mit dem zugehörigen privaten Schlüssel signiert wird. Anschließend können Sie das Image überprüfen, indem Sie den öffentlichen Schlüssel mit den über die Registry-CLI abgerufenen Daten vergleichen. Darüber hinaus können Sie Software-Supply-Chains automatisieren, indem Sie Inhalte als Teil des Release-Prozesses signieren.
Notary v2
Das Signiersystem Notary v2 ist eine neue und verbesserte Version, die die Einschränkungen des Vorgängers überwinden soll. Mit Notation und Notary v2 können Sie eigene Implementierungen der Spezifikationen erstellen und in Ihre Signier- und Verifizierungs-Workflows integrieren, um mehrere Artefakte zu signieren (z. B. Container-Images, Software-Stücklisten und Scan-Ergebnisse). Möglich wird dies durch eine im Dezember 2019 gegründete Gruppe, deren Ziel es ist, das Signieren von Images zu verbessern und Probleme wie die Unterstützung mehrerer Registries sowie das Verschieben von Images innerhalb von Registries mit der ursprünglichen v1-Implementierung zu lösen.
Notary v2 ist noch relativ neu und wurde im Dezember 2022 eingeführt. Das Projekt soll als branchen- und registryübergreifende Spezifikation für das Signieren und Überprüfen beliebiger Images oder Registry-Artefakte der Open Container Initiative (OCI) dienen. Es befindet sich noch in der Entwicklung; neue Funktionen werden in Zukunft hinzukommen.
Cosign, Notary v2 und Docker Content Trust im Vergleich
In diesem Artikel betrachten wir vier wichtige Merkmale, anhand derer Sie ermitteln können, welches Tool am besten zu Ihnen passt:
Modell zur Vertrauensdelegation bezeichnet den Mechanismus, mit dem Vertrauen in Artefakten und Registries aufgebaut und verteilt wird, um ihre Integrität und Authentizität sicherzustellen.
Transparenz und Auditierbarkeit bezeichnen die Möglichkeit, Aktionen und Änderungen im System zu beobachten und zu überprüfen, um Verantwortlichkeit und Integrität sicherzustellen.
Benutzerfreundlichkeit umfasst die Einfachheit und intuitive Bedienung der Signier-Tools und ermöglicht so eine unkomplizierte Einführung und Integration.
Community-Support umfasst das Engagement, die Zusammenarbeit und die Ressourcen der Community rund um das System und gewährleistet so kontinuierliche Weiterentwicklung und Unterstützung.
Jeder dieser Faktoren kann die Wirksamkeit der einzelnen Tools erheblich beeinflussen. In den folgenden Abschnitten sehen wir uns jede Kategorie genauer an und bewerten die Tools anhand dieser Faktoren.
Modell zur Vertrauensdelegation
Cosign verwendet ein dezentrales und föderiertes Modell zur Vertrauensdelegation mit einem Vertrauensanker, der aus vom Sigstore-Projekt bereitgestellten Zertifikaten und öffentlichen Schlüsseln besteht. Für die Verteilung und den Abruf von Schlüsselmaterial kommt The Update Framework (TUF) zum Einsatz. Der Sigstore-Vertrauensanker wird außerdem verwendet, um den Nachweis der Aufnahme in Rekor zu überprüfen.
Notary v2 und v1 verwenden hingegen ein hierarchisches Modell zur Vertrauensdelegation, bei dem Images mithilfe von TUF verteilt werden. In diesem Modell dient ein Trust Store zum Speichern vertrauenswürdiger Identitäten.
Für die Erstellung von Artefakten in v2 konfigurieren Sie oder Ihre Administratoren die Vertrauensrichtlinie, um festzulegen, welche Identitäten als vertrauenswürdig gelten. Die Authentizität signierter Artefakte wird anhand des Vertrauens bestimmt, das sich aus den Identitäten im Trust Store und der Vertrauensrichtlinie ergibt.
Bei v1 verwendet DCT einen Offline-Schlüssel als Vertrauensquelle für Image-Tags. Das Vertrauen wird an Repository- oder Tagging-Schlüssel delegiert; serververwaltete Schlüssel sorgen für zusätzliche Sicherheit. Mit diesem Modell lassen sich im System unterschiedliche Vertrauensstufen festlegen, um verschiedene Sicherheitsrichtlinien und Zugriffskontrollen durchzusetzen.
Zusammenfassend lässt sich sagen: Da Cosign auf dezentrales und föderiertes Vertrauen mit einem von Sigstore bereitgestellten Vertrauensanker setzt, ist es eine gute Wahl für die Vertrauensdelegation. Es implementiert ein tagbasiertes Ermittlungsschema und unterstützt die meisten produktiven Registries. Notary v1 sollten Sie dagegen wählen, wenn Sie keine Unterstützung für mehrere Registries benötigen, da diese nicht miteinander interoperabel sind. Wenn Sie Interoperabilität benötigen, bietet v2 diese Möglichkeit und erlaubt Ihnen, Vertrauen zwischen verschiedenen Registries zu verteilen.
Transparenz und Auditierbarkeit
Sigstore bietet ein sicheres und transparentes System für Software-Updates, indem es alle Signaturen in einer öffentlichen Registry speichert. So können Organisationen die Authentizität von Software-Updates ganz einfach überprüfen. Außerdem lassen sich mit Rekor alle Signiervorgänge öffentlich auditieren. Das trägt dazu bei, Verantwortlichkeit und Vertrauen in der Software-Supply-Chain sicherzustellen.
DCT hat dagegen einige Nachteile. Es unterstützt nur eine Signatur pro Image. Das bedeutet: Wenn der Anbieter das Image bereits auf Docker Hub signiert hat, können Sie keine eigene Signatur hinzufügen, um dessen Eignung für Ihre Organisation kenntlich zu machen. Dadurch werden Ihre Flexibilität und Kontrolle über die Software-Supply-Chain eingeschränkt.
Notary v2 verfolgt einen umfassenderen Ansatz, um das Vertrauen im gesamten Ökosystem aufrechtzuerhalten. Es stellt die Annahme infrage, dass direkt von Docker Hub heruntergeladene Images grundsätzlich sicher sind. Durch die Unterstützung mehrerer Signaturen ermöglicht Notary v2 die Validierung der Sicherheit von Images und erlaubt Organisationen, ihr eigenes Gütesiegel anzubringen. So wird ein höheres Maß an Vertrauen in der Software-Supply-Chain gewährleistet.
Zum Zeitpunkt der Veröffentlichung dieses Artikels befindet sich Notary v2 1.0.0 im Release-Candidate-Status, eine allgemeine Verfügbarkeit gibt es jedoch noch nicht. Daher ist Sigstore in neuen und komplexen Umgebungen dank seiner Reife und Integrationen möglicherweise die bessere Wahl.
Benutzerfreundlichkeit
Cosign ist auf eine benutzerfreundliche Bedienung ausgelegt und vereinfacht die Schlüsselverwaltung und den Signiervorgang. Außerdem können Entwickler das Tool beim Erstellen von Images problemlos in ihre bestehenden Workflows integrieren. Schlüsselloses Signieren macht die komplexe Schlüsselverwaltung überflüssig. Dank eines von Cosign generierten privaten/öffentlichen Schlüsselpaares sind die erforderlichen Einrichtungsschritte einfach.
Notary lässt sich nahtlos in das Docker-Container-Ökosystem integrieren und stellt CLI-Tools und APIs zum Signieren und Überprüfen von Containern bereit. Da es jedoch relativ neu ist, werden – abgesehen von Notation – nur wenige Clients unterstützt. Zudem müssen Sie bei beiden Notary-Versionen zahlreiche Schlüssel verwalten und benötigen daher fundierte Kenntnisse von TUF.
DCT ist eng in Docker integriert, sodass sich das Signieren und Überprüfen von Images mit intuitiven Befehlen ganz einfach aktivieren lässt. Allerdings funktioniert es nicht über Registry-Grenzen hinweg. Außerdem gehen die Signierdaten verloren, wenn Sie ein öffentliches Image herunterladen und ohne zugehörigen Notary-Server in eine private Registry hochladen. Für die Einrichtung eines Notary-Dienstes sind zudem ein Notary-Server, ein Notary-Signer, ein Notary-Client und eine MySQL-Datenbank sowie mTLS (mutual TLS) zwischen Notary-Server und Signer erforderlich. Das bedeutet oft zusätzlichen Aufwand. Es wird erwartet, dass DCT verschwindet, während v2 zunehmend zum Standard wird.
In puncto Benutzerfreundlichkeit scheint Cosign mit seinem benutzerfreundlichen Ansatz, der vereinfachten Schlüsselverwaltung und der Integration in bestehende Workflows im Vorteil zu sein. Notary v2 bietet ebenfalls Integrationen und CLI-Tools, erfordert für Einrichtung und Verwaltung jedoch mehr Aufwand und Fachwissen als DCT. Allerdings ist auch docker trust enthalten, das sehr einfach zu verwenden ist.
Community-Support
Alle Projekte gehören zur CNCF, was ihnen eine starke Community-Unterstützung sichert. Cosign erhält darüber hinaus Unterstützung von Branchenpartnern und verfügt über eine aktive Community von Mitwirkenden, die für kontinuierliche Weiterentwicklung, Support und Zusammenarbeit sorgt. Auch Notary ist ein Open-Source-Projekt mit starker Unterstützung aus der Community und wird im Docker-Ökosystem breit eingesetzt. Es profitiert von Beiträgen und Feedback einer großen Nutzerbasis. Da das v2-Projekt relativ neu ist, gibt es weniger Dokumentationen und Tutorials als für die anderen Lösungen. Das kann neuen Nutzern den Einstieg und die Verwendung von v2 mit CLIs wie Notation erschweren.
DCT ist Teil der Docker-Plattform und profitiert von der großen Docker-Community. Das Tool hat sich stark etabliert und verfügt über ein umfangreiches Ökosystem aus Tools und Integrationen, sodass es einfach aktiviert werden kann. Außerdem stehen zahlreiche Tutorials für den Einstieg zur Verfügung.
Und der Gewinner ist …
Welche Lösung am besten ist, hängt von den konkreten Anforderungen, Prioritäten und Einschränkungen Ihrer Organisation oder Ihres Systems ab. Sigstore eignet sich gut für Organisationen, die sichere und transparente Software-Updates für verschiedene Artefakte priorisieren – darunter Helm-Charts ebenso wie Images. Die starke Unterstützung aus der Community und Funktionen wie die Interoperabilität zwischen Registries machen Sigstore zu einer guten Wahl für die meisten Organisationen. Zudem unterstützen die meisten Container-Registries das Signierformat.
Im Vergleich dazu punktet DCT in Szenarien, in denen Einfachheit und eine nahtlose Integration mit Docker entscheidend sind. Dank der engen Docker-Integration und intuitiven Befehle lassen sich Images einfach signieren und verifizieren – ganz ohne komplexe Vertrauensmodelle oder Interoperabilität zwischen verschiedenen Registries.
Notary v2 bietet eine umfassendere Lösung, um das Vertrauen in die Software-Supply-Chain zu wahren, und behebt die Einschränkungen von DCT. Da sich das Projekt jedoch noch in der Entwicklung befindet, sollten Sie die unternehmensweite Implementierung sorgfältig abwägen und planen. Die Einrichtung sowie die Verwaltung von TLS-Zertifikaten und TUF-Schlüsseln können komplex sein, eine steilere Lernkurve erfordern und bei falscher Konfiguration zu einer betrieblichen Belastung werden. Außerdem wird Notary v2 nicht von allen Registries unterstützt. Bei der Nutzung müssen Sie daher möglicherweise Kompromisse eingehen.
Mit Cosign signieren
Nachdem Sie nun etwas mehr über Cosign, Notary und DCT wissen, gehen wir noch einen Schritt weiter und verwenden eines dieser Tools: Cosign. Für dieses Beispiel nutzen wir das einfache Docker-Referenz-Image registry:2, um eine Registry zu starten. In der Praxis könnten Sie eine verwaltete Registry wie Harbor, Amazon ECR, Docker Hub usw. verwenden.
Voraussetzungen
Bevor Sie beginnen, müssen die folgenden Tools installiert sein:
Cosign: Das Tool, mit dem Sie Container-Images signieren und verifizieren.
Docker: Ein Tool zum Erstellen, Ausführen und Verwalten von Docker-Containern.
Sobald beide Tools installiert sind, können Sie loslegen!
Eine Registry einrichten
Um Ihre Images zu speichern, müssen Sie eine Instanz der Docker-Referenz-Image-Registry registry:2 erstellen.
Hinweis: Wir binden hier den lokalen Port 15000, um Konflikte zu vermeiden – insbesondere auf Mac-OS-Systemen, auf denen neuere Versionen Port 5000 für AirDrop-Dienste nutzen. Sie können stattdessen jeden verfügbaren Port auf Ihrem Rechner verwenden. Achten Sie dann aber darauf, in den folgenden Befehlen denselben Port anzugeben.
Ein Image in die Registry übertragen
Um ein Docker-Image zu signieren und in die Registry zu übertragen, gehen Sie wie folgt vor:
Rufen Sie ein beliebiges Image aus einer öffentlichen Registry ab (in diesem Beispiel verwenden wir BusyBox):
Mit diesem Befehl wird das BusyBox-Image aus der öffentlichen Docker-Registry abgerufen.
Als Nächstes müssen Sie das Image mit der IP-Adresse Ihrer lokalen Registry taggen:
Übertragen Sie anschließend das Image in Ihre Harbor-Registry:
Mit diesem Befehl wird das getaggte Image mithilfe des Befehls docker push in Ihre Harbor-Registry übertragen. In der Antwort sollte ein sha256-Digest ähnlich dem folgenden angezeigt werden:
Kopieren Sie den Digest-Wert ab sha256: bis zum Ende der Zeichenfolge. Lassen Sie das Leerzeichen und den darauf folgenden Wert „size“ weg. Dabei handelt es sich um den kryptografischen Hash des Images. Im nächsten Schritt verwenden wir ihn, um sicherzustellen, dass wir genau das Image signieren, das wir gerade übertragen haben.
Nach diesen Schritten haben Sie erfolgreich ein Docker-Image in Ihre Registry übertragen. Es steht nun für die Bereitstellung und Verteilung in Ihrer Umgebung zur Verfügung. Signieren müssen Sie es allerdings noch.
Das übertragene Image signieren
Bevor Sie ein übertragenes Container-Image mit Cosign signieren, müssen Sie private und öffentliche Schlüssel generieren. Führen Sie den folgenden Befehl aus, um das Schlüsselpaar zum Signieren zu erstellen:
Nach Ausführung des vorherigen Befehls werden Sie aufgefordert, ein Passwort für den privaten Schlüssel einzugeben und zu bestätigen. Der private Schlüssel wird in einer Datei namens cosign.key gespeichert, der öffentliche Schlüssel in cosign.pub. Bewahren Sie den privaten Schlüssel und das festgelegte Passwort sicher auf.
Verwenden Sie als Nächstes den Befehl cosign sign, um das Image wie folgt zu signieren:
Wenn Sie das Verzeichnis gewechselt haben, ersetzen Sie cosign.key durch den Pfad zu Ihrer Datei mit dem privaten Schlüssel und [sha256 digest] durch den vollständigen Hash-Wert aus dem vorherigen Schritt. Sie werden aufgefordert, das Passwort für den privaten Schlüssel einzugeben. Geben Sie es ein, um fortzufahren.
Wenn Sie das Image mit Cosign signieren, stellen Sie seine Aktualität, Authentizität und Integrität sicher. Dadurch erhalten Ihre Container-Images eine zusätzliche Sicherheitsebene und das Vertrauen in Ihre Software-Supply-Chain bleibt gewahrt.
Das signierte Image demonstrieren
Um das signierte Image zu überprüfen, verwenden Sie den integrierten Befehl cosign verify:
Wahrscheinlich werden Ihnen einige Fragen mit Ja oder Nein zur Nutzung einer privaten Registry und zur Annahme der Nutzungsbedingungen des Sigstore-Projekts gestellt. Lesen Sie die Fragen durch und antworten Sie entsprechend.
Nach erfolgreicher Signaturprüfung wird eine Bestätigung angezeigt, dass das Image sicher signiert und verifiziert wurde. Die Bestätigung sieht wie folgt aus:
Diese Bestätigung ist entscheidend, um eine starke Sicherheitslage in Ihrem Unternehmen aufrechtzuerhalten.
Andere Artefakte signieren
Container-Images sind zwar ein wichtiger Bestandteil von Software-Supply-Chains, doch auch das Signieren anderer Software-Artefakte ist für die durchgängige Sicherheit von Bedeutung. Neben Container-Images profitieren verschiedene Arten von Software-Artefakten – etwa ausführbare Dateien, Java-Archive (JAR-Dateien), Pakete und Software-Stücklisten (SBOMs) – vom Signieren. Hier finden Sie beispielsweise eine Anleitung dazu, wie Cosign das Signieren von SBOMs unterstützt.
Das Signieren anderer Artefakte bietet dieselben Vorteile wie bereits beschrieben: Integrität, Aktualität und Herkunftsnachweis. So können Sie Anforderungen an Compliance und Audits erfüllen und Artefakte leichter referenzieren. Beachten Sie jedoch, dass der Ablauf möglicherweise nicht so einfach ist wie beim Signieren von Containern. Eine SBOM wird beispielsweise mit Cosign signiert, nachdem sie an das in einer Registry gehostete Container-Image angehängt wurde.
Für andere Artefakte wie JAR-Dateien können Sie Tools wie Jarsigner verwenden. Das ist etwas komplizierter als das herkömmliche Signieren von Images, da Sie die zusätzliche Komplexität bewältigen und weitere Schritte ausführen müssen, etwa Schlüssel und Signaturen zu generieren, zu speichern, zu übertragen und sicher zu verwenden.
Fazit
Auch wenn das Signieren verschiedener Artefakte zusätzliche Komplexität mit sich bringen kann, ist es wichtig zu verstehen, dass diese Maßnahmen die Sicherheit, Integrität und Compliance von Software-Artefakten verbessern. Mit digitalen Signaturen und bewährten Verfahren für die Schlüsselverwaltung können Unternehmen Vertrauen schaffen, Compliance-Anforderungen erfüllen und Audits sowie die Referenzierung von Artefakten erleichtern – und sich so vor erheblichen Sicherheitsrisiken schützen.
Wenn Sie die Sicherheit Ihrer Images verbessern und sie vor Manipulation schützen möchten, ist das Signieren von Containern ein guter erster Schritt. Die in diesem Artikel vorgestellten Tools richten sich an unterschiedliche Nutzergruppen. Welches Tool Sie wählen, hängt davon ab, welche Wirksamkeit und Flexibilität Ihre Sicherheits- und Compliance-Standards erfordern. Sobald Sie das Signieren von Images eingerichtet haben, können Sie Lösungen einsetzen, die Sie beim Scannen und Überprüfen der Sicherheit von Image-Layern unterstützen.
Snyk ist beispielsweise eine Developer-Security-Plattform, bei der eine nahtlose Developer Experience im Mittelpunkt steht. Sie bietet Funktionen zum Scannen von Container-Images, mit denen Sie bekannte Schwachstellen in den Paketen Ihres Docker-Images erkennen können. So können Sie Schwachstellen proaktiv aufdecken und beheben, bevor Sie das Image zu Docker Hub oder einer anderen Registry übertragen, und Ihre Sicherheitslage insgesamt stärken.
Container-Sicherheit mit Fokus auf Entwickler
Snyk findet und behebt automatisch Schwachstellen in Container-Images und Kubernetes-Workloads.
