Das eingebundene Konfigurationsverzeichnis schützen

DockerBeginner
Jetzt üben

Einführung

Ein Berichtsdienst muss Konfiguration lesen und Dokumente schreiben, doch sein Konfigurations-Mount erlaubt auch Schreibzugriffe. Als zuständige Wartungsperson reduzierst du diesen unnötigen Zugriff, ohne die Berichtserstellung zu unterbrechen.

Zuerst erzeugst du einen normalen Bericht, schützt dann den Eingabe-Mount und erstellst nur den Berichtscontainer neu. Grundlegende Terminalkenntnisse genügen; Docker, Mount-Syntax und Bearbeitung werden vor der Verwendung erklärt.

Einen normalen Bericht erzeugen

In diesem Schritt führst du zuerst die normale Geschäftsaufgabe aus, bevor du Berechtigungen änderst. Harbor Books verwendet einen kleinen Dienst, der Bestellungen zusammenzählt und ein Dokument erzeugt. Alle Kunden und Zahlen sind synthetische Übungsdaten.

Verwende das Terminal Maintenance. Es stellt eine Linux-Host-Wartungsrolle mit Docker-Verwaltungszugriff bereit. Docker startet Anwendungsprozesse in Containern: Jeder sieht sein eigenes Dateisystem und seine Prozessliste, teilt aber den Host-Kernel. Ein Container ist keine weitere VM. Du verwaltest nur report-renderer und die Dateien in /home/labex/project/report-desk.

Das Terminal startet in diesem Verzeichnis. pwd zeigt das aktuelle Verzeichnis:

pwd

Es sollte /home/labex/project/report-desk anzeigen. Falls du das Verzeichnis gewechselt hast, kehre mit cd /home/labex/project/report-desk zurück.

Die Anwendung lauscht auf Port 8090. Ein Port kennzeichnet einen Dienst; localhost meint hier den Wartungshost, dessen Port Docker an den Container weiterleitet. curl sendet eine HTTP-Anfrage, -X POST wählt eine Aktionsanfrage und -fsS zeigt Fehler bei knapper Erfolgsausgabe. Fordere das Ausgangsdokument an:

curl -fsS -X POST http://localhost:8090/render/baseline
{"saved": "/output/baseline.json", "total": 37, "uid": 0}

Der Dienst hat die Eingabe gelesen und eine echte Datei gespeichert. cat zeigt eine Datei; der Host sieht /output des Containers als lokales Verzeichnis output:

cat output/baseline.json

Suche Report for Harbor Books: 37 orders. Weitere Felder erfassen Eingabeidentität und laufende Dienstinstanz. Öffne Document Desk und aktualisiere: Unter Stored documents erscheint baseline.json. Die Seite zeigt echte Dateien, bestätigt aber keine sicheren Berechtigungen.

Die Eingabedeklaration schützen

In diesem Schritt ordnest du Eingabe- und Ausgabepfade zu, demonstrierst einen unnötigen Schreibzugriff und bearbeitest die Startdeklaration. Ein Bind-Mount verbindet ein Host-Verzeichnis mit einem Pfad im Container. Ohne ausdrückliche Einschränkung ist er beschreibbar.

cat launch.sh zeigt das vorbereitete Bash-Startskript:

cat launch.sh

Ein umgekehrter Schrägstrich setzt einen Befehl in der nächsten Zeile fort. sudo verwaltet Docker mit Host-Administratorrechten; es bestimmt nicht den Anwendungsbenutzer. docker run -d startet einen Container im Hintergrund, --name benennt ihn, --user 0:0 wählt Benutzer-/Gruppenkennungen und -p 8090:8090 leitet den Host-Port zum Container-Port. Das letzte Argument ist das vorbereitete Anwendungsimage c12-renderer:1.

Jedes --mount enthält kommagetrennte Felder: type=bind verbindet einen Host-Pfad, src ist dieser Host-Pfad und dst der Containerpfad.

Host-Verzeichnis Containerverzeichnis Benötigter Zugriff
report-desk/config /config Stapel und Vorlage lesen
report-desk/output /output Erzeugte Dokumente schreiben

Die Konfiguration enthält probe.txt, eine entbehrliche Probe ohne Geschäftsdaten. docker exec führt einen Befehl im angegebenen laufenden Container aus. touch aktualisiert den Zeitstempel dieser Probe; das demonstriert absichtlich unnötigen Anwendungszugriff:

sudo docker exec report-renderer touch /config/probe.txt

Keine Ausgabe bedeutet Erfolg. Damit ist ein beschreibbarer Konfigurations-Mount nachgewiesen, ohne Stapel oder Vorlage zu beschädigen. Eine Änderung der Host-Startdeklaration beeinflusst den nächsten von Docker erstellten Container; eine Dateiänderung im aktuellen Container ändert dessen Mount-Modus nicht.

Bearbeite die Deklaration mit dem Terminaleditor nano:

nano launch.sh

Bewege dich mit den Pfeiltasten. Ergänze in der Zeile mit dst=/config direkt hinter /config den Zusatz ,readonly, vor Leerzeichen und umgekehrtem Schrägstrich. Lasse /output beschreibbar. Speichere mit Ctrl+O, Enter und beende mit Ctrl+X. Die Konfigurationszeile sollte so aussehen:

  --mount type=bind,src=/home/labex/project/report-desk/config,dst=/config,readonly \

Zeige erneut cat launch.sh an und suche fehlende Kommas oder umgekehrte Schrägstriche. Öffne nano launch.sh erneut für Korrekturen. Der laufende Container hat weiterhin seinen alten Mount; im nächsten Schritt ersetzt du ihn.

Die Mount-Grenze anwenden und testen

In diesem Schritt ersetzt du nur den Berichtscontainer und weist nach, dass gesperrte Eingabeschreibzugriffe mit funktionierender Ausgabe vereinbar sind. Docker aktualisiert einen bestehenden Container nicht allein durch Änderungen am Startskript.

docker rm -f stoppt und entfernt den benannten Container. Seine per Bind-Mount eingebundenen Host-Verzeichnisse bleiben erhalten. bash launch.sh führt die bearbeitete Deklaration aus:

sudo docker rm -f report-renderer
bash launch.sh

Der zweite Befehl zeigt eine neue Container-ID. Warte kurz auf den Start. Bei einem Syntax- oder Mount-Fehler korrigierst du die betreffende Zeile mit nano launch.sh, entfernst einen neu erstellten report-renderer mit demselben Löschbefehl und führst das Skript erneut aus. Lösche keine Host-Datenverzeichnisse.

docker inspect liest die tatsächlichen Einstellungen. --format wählt ein Feld; behalte die einfachen Anführungszeichen, damit die Shell die geschweiften Klammern unverändert weitergibt:

sudo docker inspect report-renderer --format '{{json .Mounts}}'

Suche "Destination":"/config" mit "RW":false und /output mit "RW":true. RW bedeutet Lesen/Schreiben. Bestätige die tatsächliche Grenze mit derselben Probe:

sudo docker exec report-renderer touch /config/probe.txt
touch: /config/probe.txt: Read-only file system

Dieser von null verschiedene Rückgabestatus ist erwartet. Das Terminal bleibt nutzbar; fahre mit dem nächsten Befehl fort. Verbindungsfehler oder ein fehlender Container bedeuten dagegen, dass du das Startskript korrigieren oder erneut ausführen musst.

Fordere vom neu erstellten Dienst ein neues Dokument an:

curl -fsS -X POST http://localhost:8090/render/final
{"saved": "/output/final.json", "total": 37, "uid": 0}
cat output/final.json

Das Dokument enthält weiter Report for Harbor Books: 37 orders. Aktualisiere Document Desk, um final.json zu sehen. Der Dienst liest Eingaben und schreibt Ausgaben, während der Konfigurations-Mount Schreibzugriffe verweigert. Er läuft noch als root; das nächste unabhängige Lab behandelt diese andere Berechtigung.

Zusammenfassung

Du hast einen echten Bericht erzeugt, Host- und Containerpfade zugeordnet, den Eingabe-Mount schreibgeschützt und den Dienst neu erstellt. Die tatsächliche Mount-Inspektion und ein abgewiesener Schreibzugriff bestätigen den Schutz; ein neuer Bericht bestätigt die weiterhin funktionierende Ausgabe.