Prüfen, wer die Aktualisierung des Führers freigegeben hat

CybersicherheitBeginner
Jetzt üben

Einführung

Waymark veröffentlicht einen Führer für ein Wanderfestival. Ein Lieferant hat mehrere Aktualisierungspakete geliefert. Deine Aufgabe ist es, die vom Veranstalter angeforderte Version anzunehmen, ohne einem Paket allein wegen einer passenden Prüfsumme zu vertrauen.

Du verwendest einen unabhängig bereitgestellten öffentlichen Herausgeberschlüssel, prüfst mit Cosign eine echte Signatur, vergleichst angefordertes Produkt und Version und prüfst den Hashwert des Archivs. Du brauchst grundlegende Kenntnisse zu Terminal und Pfaden; Programmierkenntnisse oder ein Cloud-Konto sind nicht erforderlich. In diesem Lab wählst du eine Aktualisierung aus. Im nächsten geführten Lab machst du aus diesen Entscheidungen ein wiederverwendbares Empfangsskript.

Mit dem Festivalführer und der Aktualisierungsanforderung beginnen

In diesem Schritt lernst du den funktionierenden Dienst kennen und findest die Anforderung des Veranstalters, bevor du eine Aktualisierung auswählst. Öffne den Tab Event Guide. Die aktuelle Ausgabe von event-guide ist 2.0. Öffne Old Mill Walk: Treffzeit ist 11:00. Kehre über den Seitenlink All walks zurück und lade dann das Routenblatt herunter. Website und CSV beschreiben dieselben zwei Wanderungen.

Die Startseite des Führers nennt die Ausgabe über der Überschrift und zeigt die Treffzeit jeder Wanderung auf ihrer Karte:

Der funktionierende Waymark-Führer vor der Aktualisierung

Wechsle nun zu Workspace. Dieses Terminal und der Führer laufen im selben Container; die Tabs sind verschiedene Zugänge, keine verschiedenen Maschinen. cd wechselt das aktuelle Verzeichnis des Terminals. Der absolute Pfad funktioniert aus jedem Verzeichnis:

cd /home/labex/project/waymark

cat gibt eine kleine Textdatei aus. Lies die Anforderung, die der Veranstalter unabhängig von den Lieferpaketen bereitgestellt hat:

cat /opt/labex-waymark/trust/request.json

Das JSON-Objekt hat zwei benannte Felder:

{
  "product": "event-guide",
  "version": "2.1"
}

Ein Produkt bezeichnet den zu aktualisierenden Führer; eine Version bezeichnet die angeforderte Ausgabe. Eine echte frühere Ausgabe ist nicht diese Aktualisierung. Der unabhängig festgelegte öffentliche Schlüssel liegt unter /opt/labex-waymark/trust/publisher.pub. Lass diesen Schlüssel und die Anforderung unverändert.

ls listet Verzeichniseinträge auf. Sieh dir das Lieferverzeichnis an:

ls candidates

Die Pakete tragen Lieferbezeichnungen wie parcel-101; ihre Namen sind kein Freigabenachweis. Jedes enthält manifest.json, manifest.sigstore.json, guide.tar.gz und SHA256SUMS. Das Manifest beschreibt Produkt, Version und Archivhashwert. Das Bundle enthält eine Signatur. Das Archiv enthält die eigentlichen Führerdateien. Erhalte die Originalpakete, den aktuellen Führer, frühere Veröffentlichungen und den Besucherhinweis unverändert. Eine Kopie deines ausgewählten Pakets legst du in accepted/ ab.

Meldet ein Befehl No such file or directory, führe den obigen absoluten cd-Befehl aus, prüfe mit ls candidates die Schreibweise und versuche es erneut. In diesem Lab ist kein Zurücksetzen nötig.

Verstehen, was eine passende Prüfsumme aussagt

In diesem Schritt vergleichst du zwei Pakete, die beide ihre beiliegende Prüfsummenprüfung bestehen. Bleibe in Workspace.

Ein SHA-256-Hashwert ist ein aus Dateibytes berechneter Fingerabdruck. Übereinstimmende Fingerabdrücke helfen, Byteänderungen zu erkennen, sofern der erwartete Fingerabdruck selbst vertrauenswürdig ist. sha256sum -c liest eine Prüfsummenliste und vergleicht die genannten Dateien damit. -c bedeutet hier „prüfen“. Führe den Befehl im Paketverzeichnis aus, weil die Liste einen relativen Dateinamen verwendet:

cd candidates/parcel-103
sha256sum -c SHA256SUMS

Erwarte guide.tar.gz: OK. Kehre zum Projekt zurück und probiere ein anderes Paket:

cd /home/labex/project/waymark/candidates/parcel-104
sha256sum -c SHA256SUMS

Erwarte wieder guide.tar.gz: OK. Beide Listen kamen in derselben Lieferung wie ihre Archive. Wer ein Archiv ersetzt, könnte auch eine neue beiliegende Prüfsumme berechnen. OK belegt die Übereinstimmung dieser beiden Dateien; es identifiziert weder den Herausgeber noch belegt es, dass dies die angeforderte Aktualisierung ist.

Kehre zum Projekt zurück:

cd /home/labex/project/waymark

Als Nächstes prüfst du das Manifest mit dem öffentlichen Schlüssel, dem der Veranstalter bereits vertraut. Der erwartete Archivhashwert stammt dann aus diesem geprüften Manifest und nicht aus der unsignierten beiliegenden Liste.

Den Herausgeber mit einem unabhängigen öffentlichen Schlüssel prüfen

In diesem Schritt unterscheidest du eine echte Signatur von einer Signatur mit einem nicht freigegebenen Schlüssel. Beginne in Workspace unter /home/labex/project/waymark.

Ein Herausgeber signiert eine Datei mit einem privaten Schlüssel. Mit dem zugehörigen öffentlichen Schlüssel kann ein Empfänger diese Signatur prüfen und Änderungen an der signierten Datei erkennen. Der öffentliche Schlüssel muss über einen bereits vertrauenswürdigen Kanal eintreffen. Ein Paket kann seinen eigenen Schlüssel nicht freigeben. Diese Übung verwendet einen festgelegten synthetischen Herausgeberschlüssel, der separat unter /opt/labex-waymark/trust/ bereitgestellt wird; den privaten Schlüssel des Herausgebers erhältst du nicht.

Cosign ist das vorbereitete Signaturwerkzeug. verify-blob prüft eine Datei; --key wählt den vertrauenswürdigen öffentlichen Schlüssel; --bundle wählt das Signaturbundle. Das letzte Argument benennt genau das Manifest, dessen Bytes signiert wurden.

Diese synthetischen Pakete wurden ohne öffentliches Transparenzprotokoll signiert. --insecure-ignore-tlog überspringt bewusst die Prüfung des Protokolleintrags. Eine gültige Signatur mit dem gewählten Schlüssel ist weiterhin erforderlich. Diese lokale Übung prüft keine öffentliche OIDC-Identität, keinen Zertifikatsdienst und kein Transparenzprotokoll; übernimm diese Ausnahme nicht in eine Richtlinie, die diese Dienste verlangt.

Das folgende Paket wurde mit einem anderen Schlüssel signiert. Diese Prüfung soll fehlschlagen, mit einem Rückgabestatus ungleich null und einem Fehler bei der Signaturprüfung:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-102/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-102/manifest.json

echo gibt einen Wert aus; $? ist der Rückgabestatus des unmittelbar vorherigen Befehls. Null bedeutet Erfolg, eine andere Zahl bedeutet Fehlschlag. Prüfe ihn sofort:

echo $?

Prüfe nun ein Paket, das der festgelegte Herausgeber signiert hat:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-104/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-104/manifest.json

Erwarte die Warnung zum Transparenzprotokoll und Verified OK:

WARNING: Skipping tlog verification is an insecure practice that lacks transparency and auditability verification for the blob.
Verified OK

Prüfe den unmittelbar vorherigen Status:

echo $?

Erwarte 0. Das Manifest wurde mit dem vertrauenswürdigen Schlüssel signiert. Damit ist eine Entscheidung getroffen; du musst noch prüfen, was das Manifest freigibt.

Signiertes Produkt, Version und Archivhashwert prüfen

In diesem Schritt entscheidest du anhand des geprüften Manifests, ob ein echtes Paket die angeforderte Veröffentlichung ist. Bleibe in Workspace.

Prüfe zuerst eine echte frühere Veröffentlichung. Dieser Befehl soll erfolgreich sein:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-101/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-101/manifest.json

jq liest JSON. Der Filter .product, .version gibt die zwei benannten Felder aus. Einfache Anführungszeichen halten den Filter als ein Argument zusammen, statt seine Satzzeichen von der Shell interpretieren zu lassen:

jq '.product, .version' candidates/parcel-101/manifest.json

Erwarte "event-guide" und "2.0". Dies ist ein echter Führer, aber nicht die angeforderte 2.1. Eine Signatur macht eine alte Veröffentlichung nicht automatisch passend.

Sieh dir den im vorherigen Schritt geprüften Kandidaten an:

cat candidates/parcel-104/manifest.json

Sein Produkt und seine Version entsprechen der unabhängigen Anforderung. Das Feld sha256 enthält einen 64-stelligen hexadezimalen Hashwert von guide.tar.gz; du musst ihn nicht auswendig lernen. jq -r gibt ein Feld ohne JSON-Anführungszeichen aus. Gib den erwarteten Hashwert aus:

jq -r .sha256 candidates/parcel-104/manifest.json

Berechne nun den tatsächlichen Archivhashwert:

sha256sum candidates/parcel-104/guide.tar.gz

Das erste Feld muss mit dem Hashwert aus dem geprüften Manifest übereinstimmen. Der dahinter ausgegebene Dateiname gehört nicht zum Hashwert.

Auch das zuvor untersuchte veränderte Archiv hat ein echt signiertes Manifest, doch seine aktuellen Bytes passen nicht mehr zu diesem Manifest. Bestätige das, indem du das Manifest prüfst und dann die beiden Hashwerte vergleichst:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-103/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-103/manifest.json
jq -r .sha256 candidates/parcel-103/manifest.json
sha256sum candidates/parcel-103/guide.tar.gz

Die Signaturprüfung besteht, aber die Hashwerte unterscheiden sich. Lehne dieses Paket ab. Du hast nun drei getrennte Entscheidungen: vertrauenswürdiger Signierer, angefordertes Produkt/Version und passende Archivbytes. Scheitert eine davon, kann die Aktualisierung noch nicht angenommen werden.

Das angeforderte Paket annehmen, ohne den laufenden Führer zu ändern

In diesem Schritt speicherst du das geprüfte angeforderte Paket zur Übergabe. Beginne in Workspace unter /home/labex/project/waymark.

accepted/ ist bereits vorhanden. cp kopiert Dateien; das letzte Argument ist das Zielverzeichnis. Kopiere das geprüfte Manifest, Signaturbundle und Archiv:

cp candidates/parcel-104/manifest.json candidates/parcel-104/manifest.sigstore.json candidates/parcel-104/guide.tar.gz accepted/

Durch das Kopieren entsteht ein eigener Dateisatz. Prüfe diesen Satz, statt anzunehmen, eine frühere Prüfung gelte auch für eine spätere Kopie:

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle accepted/manifest.sigstore.json --insecure-ignore-tlog accepted/manifest.json
jq '.product, .version' accepted/manifest.json
jq -r .sha256 accepted/manifest.json
sha256sum accepted/guide.tar.gz

Erwarte eine gültige Signatur, event-guide, 2.1 und übereinstimmende Archivhashwerte. Der vorbereitete schreibgeschützte Selbsttest verwendet diese tatsächlichen Dateien, den unabhängigen Schlüssel/die Anforderung und die erwarteten Führerinhalte:

python3 /opt/labex-waymark/verify.py selected

Erwarte:

The accepted parcel is the independently signed, requested release with matching archive bytes.

Schlägt er fehl, prüfe, welche der drei Entscheidungen gescheitert ist. Wiederhole dann die Kopie aus dem richtigen Originalpaket und prüfe die Kopie erneut. Lass die unabhängigen Vertrauensdateien unverändert. Die Prüfung wählt weder ein Paket für dich aus noch veröffentlicht sie es.

Wechsle zu Event Guide und aktualisiere die Seite. Sie sollte weiterhin Ausgabe 2.0 zeigen, und Old Mill Walk sollte sich weiterhin um 11:00 treffen. Öffne Visitor notice und bestätige, dass die ursprünglichen praktischen Hinweise erhalten sind. Diese Einheit nimmt eine Lieferung zur Übergabe an; das Veröffentlichen der Aktualisierung ist ein eigener Vorgang, den du als Nächstes lernst.

Zusammenfassung

Du hast eine echt signierte Lieferung angenommen, indem du einen unabhängig vertrauenswürdigen öffentlichen Herausgeberschlüssel, die Produkt-/Versionsanforderung des Veranstalters und den Hashwert des tatsächlichen Archivs kombiniert hast. Du hast außerdem gesehen, warum eine beiliegende Prüfsumme, eine gültige Signatur einer alten Version oder ein signiertes Manifest neben veränderten Bytes allein nicht ausreichen.

Der aktuelle Führer bleibt verfügbar. Im nächsten geführten Lab baust du diese Entscheidungen in ein wiederverwendbares Empfangsskript ein und stellst sicher, dass nur die geprüften Archivbytes den laufenden Führer erreichen.