Zum Inhalt springen

HERMES · Technik im Detail

Jede Version ein Paket.

Wie HERMES jede Version als OCI-Image mit SHA-256-Digest, Stückliste nach SPDX oder CycloneDX und Signatur baut, reproduzierbar und prüfbar.

HERMES liefert Software nicht als Sammlung von Dateien aus, sondern als Paket, dessen Inhalt sich prüfen lässt: wer es gebaut hat, woraus es besteht und ob es unterwegs verändert wurde. Auf dieses Format und diese Prüfungen ist HERMES ausgelegt.

Diese Seite beschreibt die Bauweise des Systems. Gebaut sind der Prototyp von Freigabe und Protokoll und der Demonstrator von KALKÜL; den ganzen Stand finden Sie unter Was heute steht.

Auf dieser Seite
  1. 01Container-Images nach OCI
  2. 02Inhaltsadressiert mit SHA-256
  3. 03Stückliste
  4. 04Signatur und Herkunft
  5. 05Reproduzierbar bauen
  6. 06Prüfen vor dem Start
  7. 07Eckdaten
  8. 08Weiter

Container-Images nach OCI

Jede Komponente wird als Container-Image nach der Image Specification der Open Container Initiative (OCI) gebaut: ein Manifest, das auf eine Konfiguration und eine geordnete Liste von Schichten verweist. Jede Schicht ist ein komprimiertes Dateiarchiv, die Konfiguration nennt Einstiegspunkt, Umgebung und Plattform. Für mehrere Prozessorarchitekturen fasst ein Image Index die Manifeste je Plattform zusammen.

Images liegen in einer Registry und werden über deren Schnittstelle nach der OCI Distribution Specification übertragen. Dieselbe Schnittstelle trägt auch Anlagen zu einem Image, etwa Signaturen und Stücklisten, die über einen Verweis auf das Image an ihm hängen.

Inhaltsadressiert mit SHA-256

Jedes Teil eines Images wird über seinen Digest angesprochen: sha256: gefolgt vom Prüfwert seines Inhalts. Das Manifest nennt die Digests von Konfiguration und Schichten, und der Digest des Manifests umfasst damit das ganze Image. Wer ein Image über seinen Digest bezieht, bekommt genau diese Bytes oder einen Fehler.

Bezeichnungen wie latest oder eine Versionsnummer sind veränderliche Namen, die auf einen Digest zeigen; morgen kann derselbe Name auf etwas anderes zeigen. HERMES verteilt darum Digests. In Freigaben, Rollouts und im Verlauf steht immer der Digest, die Bezeichnung nur zum Lesen daneben.

Image Index ─► Manifest (je Plattform)     sha256:…
                ├─ Konfiguration           sha256:…
                ├─ Schicht                 sha256:…
                └─ Schicht                 sha256:…

Anlagen am Manifest:  Signatur · Stückliste · Herkunftsangabe
Aufbau eines Images: Jedes Teil ist über den Prüfwert seines Inhalts adressiert.

Ein Paket in Schichten

Unten die Schichten des Images, darüber das Manifest, das sie über ihre Digests zusammenhält. Oben die Anlagen, die am Digest hängen: Stückliste, Herkunft, Signatur. Darunter die Registry, über die alles übertragen wird.

Paket in HERMES in Schichten: Schichten, Manifest mit Digest, Anlagen, RegistryUnten die Schichten des Images, darüber das Manifest, das sie über ihre Digests zusammenhält. Oben die Anlagen, die am Digest hängen: Stückliste, Herkunft, Signatur. Darunter die Registry, über die alles übertragen wird.REGISTRYSCHICHTENDATEIARCHIVEBASISLAUFZEITANWENDUNGMANIFESTDIGEST DES GANZENKONFIGURATIONSCHICHTENANLAGENAM DIGESTSTÜCKLISTEHERKUNFTSIGNATUR
  • Anlagen (am Digest): Stückliste, Herkunft, Signatur.
  • Manifest (Digest des Ganzen): Konfiguration, Schichten.
  • Schichten (Dateiarchive): Basis, Laufzeit, Anwendung.
AUFBAU IN SCHICHTEN

Stückliste

Zu jedem Image gehört eine Software-Stückliste (SBOM): jede enthaltene Komponente mit Name, Version, Lizenz und Paketkennung nach dem Schema Package URL. HERMES erzeugt sie beim Bau, im Format SPDX oder CycloneDX.

Mit der Stückliste lässt sich für eine neu bekannt gewordene Schwachstelle sofort beantworten, in welchen Versionen die betroffene Komponente steckt und an welchen Orten diese Versionen laufen. Die Verordnung (EU) 2024/2847 über Cyberresilienz verlangt von Herstellern für Produkte mit digitalen Elementen ab dem 11. Dezember 2027 eine solche Stückliste, mindestens für die Abhängigkeiten der obersten Ebene.

Die Stückliste liegt nicht lose neben dem Image. Sie wird als signierte Anlage, eine Attestation nach in-toto, über den Digest an das Image gebunden.

Signatur und Herkunft

HERMES signiert jedes Image und jede Anlage. Mit Sigstore cosign entsteht eine Signatur über den Digest des Manifests, die in der Registry neben dem Image liegt. Signiert werden kann mit einem festen Schlüsselpaar oder schlüssellos: Dann bescheinigt die Zertifizierungsstelle Fulcio für kurze Zeit die Identität des Bauprozesses, und die Signatur wird in das öffentliche Transparenzprotokoll Rekor eingetragen.

Für Umgebungen ohne Verbindung nach außen ist das feste Schlüsselpaar vorgesehen, weil die Prüfung dort ohne Zugang zu Fulcio und Rekor einfacher auskommt. Der Bauprozess erzeugt zusätzlich eine Herkunftsangabe nach SLSA: welche Quelle, welcher Commit, welche Bauumgebung, welche Schritte.

Reproduzierbar bauen

Ein Bau ist reproduzierbar, wenn derselbe Quellstand in derselben Umgebung bitgleich dasselbe Ergebnis liefert. Dafür werden Zeitstempel in den Archiven fest gesetzt (SOURCE_DATE_EPOCH), Abhängigkeiten über Prüfwerte gepinnt, die Reihenfolge von Dateien sortiert und die Bauumgebung selbst als Image mit Digest festgelegt.

Dann kann eine zweite, unabhängige Stelle denselben Stand bauen und den Digest vergleichen. Stimmt er, ist belegt, dass das Paket aus diesem Quellstand und dieser Bauumgebung entsteht; der Bauumgebung muss man trauen oder sie ebenso prüfen.

Prüfen vor dem Start

Bevor ein Ort ein Paket startet, prüft er Signatur, Digest und Herkunftsangabe gegen eine Regel: welche Schlüssel oder Identitäten signieren dürfen, welche Quellen und Bauumgebungen erlaubt sind. In Kubernetes übernimmt das ein Admission Controller, etwa der Policy Controller von Sigstore oder Kyverno, der ein Image ohne gültige Signatur gar nicht erst starten lässt.

Die Regel selbst ist versioniert und kommt auf demselben Weg an den Ort wie das Soll. Eine Ausnahme für ein einzelnes Image steht darum als Änderung im Repository, mit Begründung, und nicht als Schalter, den jemand am Ort umlegt.

Eckdaten

Format
OCI Image Specification, Image Index für mehrere Plattformen
Übertragung
OCI Distribution Specification über eine Registry
Adresse
Digest sha256:…; Bezeichnungen nur zum Lesen
Stückliste
SPDX oder CycloneDX, Komponenten mit Package URL, als Attestation am Digest
Signatur
Sigstore cosign, festes Schlüsselpaar oder schlüssellos mit Fulcio und Rekor
Herkunft
Angabe nach SLSA, Attestation nach in-toto
Bau
reproduzierbar: SOURCE_DATE_EPOCH, gepinnte Abhängigkeiten, Bauumgebung mit Digest
Zulassung
Admission Controller, etwa Sigstore Policy Controller oder Kyverno

Weiter

Wie liefern Sie heute eine neue Version aus? Wir zeigen Ihnen, wie daraus ein prüfbares Paket wird.