Nur das geprüfte Paket zum Führer gelangen lassen

ShellBeginner
Jetzt üben

Einführung

Eine geprüfte Lieferung ist nur dann nützlich, wenn genau diese geprüften Bytes zur laufenden Veröffentlichung werden. Waymark braucht ein wiederverwendbares Empfangsskript, das ein nicht freigegebenes Paket ablehnt, bevor es den Wanderfestivalführer verändert.

Du ersetzt ein kurzes Shellskript, erprobst seine Ablehnungsentscheidungen und veröffentlichst die vom Veranstalter angeforderte Aktualisierung. Diese unabhängige Umgebung beginnt mit dem ursprünglichen Führer und eigenen Paketen. Im vorherigen geführten Lab hast du Signaturen, unabhängig vertrauenswürdige Schlüssel, angeforderte Metadaten und Archivhashwerte kennengelernt. Nun kombinierst du sie, ohne Python programmieren zu müssen.

Den funktionierenden Führer und den Vertrag des Empfangsskripts verstehen

In diesem Schritt ermittelst du, was die Aktualisierung ändern und was sie bewahren muss. Öffne Event Guide und dann Old Mill Walk. Die ursprüngliche Ausgabe von event-guide ist 2.0, und die Wanderung beginnt um 11:00. Kehre über All walks zurück und lade das Routenblatt herunter. Sowohl Detailseite als auch Download müssen nach der Aktualisierung funktionieren.

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 zu Workspace. cd wechselt das Verzeichnis; dieser absolute Pfad funktioniert von jedem Ort aus:

cd /home/labex/project/waymark

cat gibt Dateien aus. Lies die unabhängig bereitgestellte Aktualisierungsanforderung:

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

Sie verlangt Produkt event-guide, Version 2.1. Die freigegebene Aktualisierung verlegt Old Mill Walk auf 14:00. Die andere Wanderung bleibt bei 09:30. Lies das Ausgangsskript:

cat receive.sh

Das Ausgangsskript nimmt einen Hashwert aus dem Paket selbst und übergibt ihn an das Veröffentlichungsprogramm. Ein anderer Herausgeber könnte ein zusammenpassendes Manifest und Archiv liefern. Dieses Skript prüft bislang weder eine Signatur noch das angeforderte Produkt/die Version des Veranstalters. Du ersetzt es vor der Veröffentlichung.

Die erforderliche Schnittstelle lautet:

bash receive.sh CANDIDATE_DIRECTORY DESTINATION_DIRECTORY

Das erste Argument ist ein Lieferpaket. Das zweite ist ein Veröffentlichungsverzeichnis für den Führer; im laufenden Projekt heißt es published. Beide Pfade dürfen absolut oder relativ sein, umbenannt werden und Leerzeichen enthalten. Codiere weder eine Paketbezeichnung noch das Ziel fest ein. Eine erfolgreiche Aktualisierung gibt null zurück. Eine Ablehnung gibt einen Wert ungleich null zurück und lässt sämtliche vorhandenen Veröffentlichungsdateien unverändert. Eine zulässige Aktualisierung bewahrt frühere Veröffentlichungen und unabhängige Uploads.

Du darfst receive.sh bearbeiten und temporäre Dateien erstellen. Lass die Originalpakete, den unabhängigen Schlüssel/die Anforderung, das vorbereitete Veröffentlichungsprogramm und andere Laufzeitdateien unverändert. Das Empfangsskript muss auch funktionieren, wenn es allein in ein anderes Verzeichnis kopiert wird und dieselben vorbereiteten Werkzeuge und unabhängigen Vertrauensdateien verfügbar sind. Die Bewertung erprobt diesen Vertrag in Wegwerfverzeichnissen und prüft zusätzlich den echten Führer.

Bei einem vertippten Pfad führe den obigen absoluten cd-Befehl aus, prüfe mit ls candidates die Bezeichnungen und versuche den Befehl erneut. Eine fehlgeschlagene Prüfung ist Anlass, den jeweiligen Nachweis zu untersuchen, nicht die Umgebung zurückzusetzen.

Ein Empfangsskript entwerfen, das vor der Veröffentlichung stoppt

In diesem Schritt verstehst du das kurze Skript, bevor du es schreibst. Bleibe in Workspace.

Das Empfangsskript kopiert alle drei zusammengehörigen Dateien in ein privates temporäres Verzeichnis, prüft dieses kopierte Manifest, vergleicht Produkt/Version mit der unabhängigen Anforderung und übergibt das kopierte Archiv samt signiertem Hashwert an ein vorbereitetes Veröffentlichungsprogramm. Es prüft niemals einen Kandidaten, um anschließend für die Lieferung einen anderen Kandidatenpfad erneut zu öffnen.

Das Veröffentlichungsprogramm /opt/labex-waymark/publish.py ist vorbereiteter Code zur Archivverarbeitung. Es liest das übergebene Archiv in einen einzelnen Bytepuffer, prüft diesen Puffer gegen den übergebenen Hashwert, entpackt sicher nur site.json und routes.csv und veröffentlicht genau diese Bytes. Es bewahrt frühere Veröffentlichungen und uploads/. Es entscheidet nicht, wessen Signatur vertrauenswürdig ist oder welches Produkt/welche Version der Veranstalter angefordert hat; diese Entscheidungen gehören in dein Empfangsskript.

Du verwendest folgende Shellfunktionen:

  • #!/bin/bash benennt die Shell des Skripts. Auch bash receive.sh wählt Bash ausdrücklich aus.
  • set -euo pipefail stoppt das Skript bei einem unbehandelten fehlgeschlagenen Befehl, einer nicht gesetzten Variablen oder einer fehlgeschlagenen Pipeline. Nach einer fehlgeschlagenen Signaturprüfung darf niemals veröffentlicht werden.
  • $1 und $2 sind die zwei Argumente. candidate=$1 speichert einen Wert; "$candidate" setzt ihn als ein Argument ein, einschließlich Leerzeichen. $# zählt Argumente, und [ "$#" -ne 2 ] prüft, ob diese Zahl nicht zwei ist. if, then und fi begrenzen den Bedingungsblock.
  • $(command) speichert die Ausgabe eines Befehls. mktemp -d erstellt ein eindeutiges temporäres Verzeichnis. trap '...' EXIT führt beim Skriptende die Bereinigung aus. Hier entfernt rm -rf -- "$stage" nur dieses erzeugte temporäre Verzeichnis; setze niemals dein Projektverzeichnis ein. -- beendet die Optionsauswertung, damit ein Pfad als Daten behandelt wird.
  • cp -- SOURCE SOURCE SOURCE DIRECTORY/ kopiert die drei Dateien. Der abschließende Schrägstrich kennzeichnet das Zielverzeichnis.
  • jq -r .product FILE liest eine JSON-Zeichenfolge ohne JSON-Anführungszeichen. jq -e gibt bei einem falschen Ergebnis einen Fehlerstatus zurück. --arg product "$product" stellt dem Filter eine Zeichenfolgenvariable namens $product bereit. and verlangt, dass jede Bedingung gilt. Einfache Anführungszeichen bewahren den Filtertext für jq. > /dev/null verwirft den ausgegebenen Wahrheitswert und erhält den Rückgabestatus.
  • echo ... >&2 schreibt einen Fehler in den Fehlerausgabestrom; exit 2 beendet das Skript mit einem Status ungleich null.

Der Signaturbefehl verwendet denselben unabhängig festgelegten öffentlichen Schlüssel wie das vorherige Lab. Sein --bundle verweist auf das kopierte Signaturbundle, sein letztes Argument auf das kopierte Manifest. --insecure-ignore-tlog ist die ausdrückliche Einschränkung dieser synthetischen Offline-Testdaten: Es überspringt die öffentliche Protokollprüfung, prüft aber weiterhin die Signatur mit dem festgelegten Schlüssel. Dieses Empfangsskript prüft keine öffentliche Identität und kein Transparenzprotokoll.

Der abschließende Python-Befehl ruft das vorbereitete Veröffentlichungsprogramm auf; du schreibst kein Python. Es erhält das kopierte Archiv, den Hashwert aus dem geprüften Manifest und das gewünschte Ziel. Passt der Hashwert nicht zu den Archivbytes, lehnt es die Aktualisierung ab, bevor es den bestehenden Führer anfasst.

Das wiederverwendbare Empfangsskript speichern

In diesem Schritt schreibst du das Empfangsskript mit den gerade besprochenen Mechanismen. Beginne in Workspace unter /home/labex/project/waymark.

Der folgende Befehl ersetzt receive.sh. cat > receive.sh leitet den angegebenen Text in die Datei um. <<'RECEIVER' beginnt ein Here-Dokument: Alles bis zur Zeile, die nur RECEIVER enthält, wird zum Dateiinhalt. Die Anführungszeichen um diese Markierung bewahren $1, $stage und die jq-Variablen für die spätere Skriptausführung. Füge den gesamten Block einschließlich seiner abschließenden Markierung ein:

cat > receive.sh <<'RECEIVER'
#!/bin/bash
set -euo pipefail
if [ "$#" -ne 2 ]; then
  echo "Usage: bash receive.sh CANDIDATE_DIRECTORY DESTINATION_DIRECTORY" >&2
  exit 2
fi
candidate=$1
destination=$2
stage=$(mktemp -d)
trap 'rm -rf -- "$stage"' EXIT
cp -- "$candidate/manifest.json" "$candidate/manifest.sigstore.json" "$candidate/guide.tar.gz" "$stage/"
/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle "$stage/manifest.sigstore.json" --insecure-ignore-tlog "$stage/manifest.json"
product=$(jq -r .product /opt/labex-waymark/trust/request.json)
version=$(jq -r .version /opt/labex-waymark/trust/request.json)
jq -e --arg product "$product" --arg version "$version" '.product == $product and .version == $version and .archive == "guide.tar.gz"' "$stage/manifest.json" > /dev/null
digest=$(jq -r .sha256 "$stage/manifest.json")
python3 /opt/labex-waymark/publish.py "$stage/guide.tar.gz" "$digest" "$destination"
RECEIVER

Lies die Datei zurück:

cat receive.sh

Bestätige, dass der öffentliche Schlüssel und die Anforderung aus /opt/labex-waymark/trust/ stammen, Manifest, Bundle und Archiv dagegen sämtlich aus "$stage". Beachte, dass das ursprüngliche Kandidatenverzeichnis nach dem Kopieren nicht erneut gelesen wird. Wenn die Lieferablage danach verändert oder umbenannt wird, kann das nicht mehr die an das Veröffentlichungsprogramm übergebenen Bytes austauschen.

Zeigt das Terminal wegen der fehlenden Endmarkierung eine Fortsetzungseingabe an, tippe RECEIVER in eine eigene Zeile und drücke die Eingabetaste. Wurde die Datei falsch eingefügt, wiederhole das gesamte Here-Dokument; das ersetzt nur receive.sh. Führe kein unvollständiges Empfangsskript aus.

Die vorbereitete Richtlinienprüfung führt dein Skript unverändert unter einem gewöhnlichen Konto gegen Wegwerfveröffentlichungsverzeichnisse aus. Sie prüft die tatsächlich veröffentlichten Dateien, abgelehnte Fälle und das Erhaltungsverhalten; sie sucht nicht nach einer bestimmten Befehlsschreibweise:

sudo python3 /opt/labex-waymark/verify.py policy

sudo wird von dieser vorbereiteten Prüfung benötigt, um das isolierte gewöhnliche Konto auszuführen, nicht von deinem Empfangsskript. Die Prüfung lässt den laufenden Führer unberührt. Ihre letzte Zeile sollte sagen, dass der angeforderte signierte Führer angenommen und die vier nicht freigegebenen Fälle abgelehnt werden. Schlägt sie fehl, untersuche die gemeldete Entscheidung und korrigiere receive.sh, bevor du fortfährst.

Ablehnungen vor der Aktualisierung des laufenden Führers beobachten

In diesem Schritt bestätigst du, dass das Empfangsskript bei drei verschiedenen Fehlern stoppt, während der ursprüngliche Führer verfügbar bleibt. Beginne in Workspace unter /home/labex/project/waymark.

Probiere zuerst das von einem anderen Herausgeber signierte Paket. Erwarte einen Signaturprüfungsfehler und einen Status ungleich null:

bash receive.sh candidates/parcel-102 published

$? enthält den Rückgabestatus des unmittelbar vorherigen Befehls. Lies ihn, bevor du etwas anderes ausführst:

echo $?

Probiere nun die echte, aber frühere Ausgabe. Die Signaturprüfung soll bestehen; anschließend soll der Status ungleich null sein, weil der Vergleich mit dem angeforderten Produkt/der Version falsch ist:

bash receive.sh candidates/parcel-101 published
echo $?

Der jq-Vergleich bleibt bewusst ohne Ausgabe; der Status ungleich null hält seine Ablehnung fest. Eine gültige Signatur setzt die unabhängige Anforderung nicht außer Kraft.

Probiere zuletzt das veränderte Archiv. Die Signatur soll bestehen, aber das Veröffentlichungsprogramm soll einen abweichenden Hashwert melden und den bestehenden Führer erhalten:

bash receive.sh candidates/parcel-103 published
echo $?

Wechsle zu Event Guide und aktualisiere die Seite. Der Führer muss weiterhin Ausgabe 2.0 haben; Old Mill Walk muss weiterhin um 11:00 beginnen. Kehre über All walks zurück, lade das Routenblatt herunter und öffne Visitor notice. Auch ein Empfangsskript, das alles ablehnt, würde diesen alten Führer erhalten. Deshalb ist zusätzlich eine erfolgreiche zulässige Aktualisierung erforderlich.

Eine fehlende Datei oder ein Verbindungsfehler ist nicht dasselbe wie diese erwarteten Richtlinienablehnungen. Bei einem falsch geschriebenen Paketpfad kehre zum absoluten Workspace-Pfad zurück, liste candidates auf und versuche es erneut. Ist die Website nicht erreichbar, untersuche den gemeldeten Fehler; bezeichne das nicht als erfolgreiche Ablehnung.

Den freigegebenen neuen Führer veröffentlichen und verwenden

In diesem Schritt lieferst du die geprüfte Aktualisierung aus und verwendest ihre tatsächlichen Seiten und ihren Download. Beginne in Workspace unter /home/labex/project/waymark.

Empfange das freigegebene Paket:

bash receive.sh candidates/parcel-104 published

Erwarte Verified OK und:

Published event-guide 2.1. Previous releases and uploads kept.

Prüfe sofort den Status:

echo $?

Erwarte 0. Wechsle zu Event Guide und aktualisiere die Seite. Die Startseite zeigt jetzt event-guide, Ausgabe 2.1. Öffne Old Mill Walk und bestätige 14:00. Kehre dann über All walks zurück und öffne Riverside Welcome, um die beibehaltene Treffzeit 09:30 zu bestätigen. Kehre über All walks zurück und lade das neue Routenblatt herunter. Die zwei Zeilen müssen mit den Detailseiten übereinstimmen. Öffne Visitor notice, um zu bestätigen, dass die ursprünglichen Hinweise erhalten sind.

Die freigegebene Startseite zeigt Ausgabe 2.1; achte auf die Treffzeit 14:00 bei Old Mill Walk:

Der veröffentlichte freigegebene Waymark-Führer

Wechsle zu Workspace. Der Selbsttest des laufenden Dienstes liest die laufende Detailseite, die heruntergeladenen Routenblattbytes, die aktuellen Führerdateien, die erhaltene frühere Veröffentlichung und den Hinweis:

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

Erwarte:

The running guide and download match the approved release. Previous releases and visitor notice are preserved.

ls listet die erhaltenen Veröffentlichungsverzeichnisse auf:

ls published/releases

Es sollte eine frühere Veröffentlichung event-guide-2.0-... und die neue Veröffentlichung event-guide-2.1-... geben. Die abschließenden Zeichen stammen aus dem tatsächlichen Archivhashwert und müssen nicht auswendig gelernt werden.

Schlägt die Prüfung des laufenden Dienstes fehl, unterscheide anhand ihrer Meldung zwischen einer Empfangsentscheidung, einer nicht erreichbaren Website und einer veränderten Originaldatei. Korrigiere bei Bedarf das Empfangsskript und empfange dann erneut das ursprüngliche freigegebene Paket. Dieselbe gültige Aktualisierung lässt sich gefahrlos wiederholen: Das Veröffentlichungsprogramm verwendet die identische Veröffentlichung erneut und erhält die bisherigen Dateien. Wiederhole den Selbsttest des laufenden Dienstes, um das Ergebnis zu bestätigen.

Zusammenfassung

Du hast ein Empfangsskript, das seiner Lieferung vertraute, durch eines ersetzt, das einen unabhängigen Herausgeberschlüssel und die Anforderung des Veranstalters prüft und dann den signierten Archivhashwert an die tatsächlich veröffentlichten Bytes bindet. Falsche Signierer, echte alte Veröffentlichungen und veränderte Archive wurden abgelehnt, während der ursprüngliche Dienst nutzbar blieb.

Die freigegebene Aktualisierung ist jetzt ein echter Führer mit funktionierenden Detailseiten und passendem Routendownload. Die Challenge überträgt dieselben Werkzeuge auf einen barrierefreien Führer und enthält ein echt signiertes Paket für das falsche Produkt.