Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Sichere Images: klein, ohne root, ohne Geheimnisse

Nach dieser Lektion: Ich kann sagen, was ein Image sicher zum Ausliefern macht, und ein unsicheres Dockerfile verbessern.

Lektion, 55 Min.6 BefehleDocker-Grundlagen-Lab: Container, Logs und Neustarts lernen, indem ein defekter Dienst repariert wird

Ein Fehler im Server eines kleinen Shops

Jemand findet einen Fehler in dem Programm, das die Seiten eines Shops ausliefert. Jetzt kann er dieses Programm Dinge tun lassen.

Was er danach erreicht, hängt davon ab, als wer das Programm läuft. Es hängt auch davon ab, was sonst im Image steckt und was darin geschrieben steht.

Am Ende dieser Lektion

Notiz

Ich kann sagen, was ein Image sicher zum Ausliefern macht, und ein unsicheres Dockerfile verbessern.

Schlüsselbegriffe

BegriffWas er bedeutetBeispiel
Rootder Benutzer, der auf dem System alles ändern darfuid=0
Normaler Benutzerein gewöhnlicher Benutzer mit begrenzten Rechten
Fester Tagein Image-Tag, der genau eine Version nenntnginx:1.27-alpine
Geheimnisein Passwort oder Schlüssel, den nur das Programm kennen soll
Angriffsflächealles in einem Image, was ein Angreifer nutzen könnte

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Als Benutzer laufen, der wenig darf

Wenn nichts anderes gesagt wird, läuft das Programm eines Containers als root. Root darf jede Datei ändern, in die der Container schreiben kann, auch ein eingebundenes Volume.

Ein normaler Benutzer darf das nicht. Wird das Programm angegriffen, bleibt der Schaden kleiner. Vergleichen Sie die beiden Hauptdienste Ihres Labs.

Als wer läuft web?

Befehl
docker exec web id

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Als wer läuft cache?

Befehl
docker exec cache id

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

cache in /etc schreiben lassen

Befehl
docker exec cache touch /etc/probe

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

web dasselbe versuchen lassen

Befehl
docker exec web touch /etc/probe

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Einen Benutzer im Dockerfile anlegen

Code: bash
FROM python:3.12-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
RUN adduser -D -u 10001 shop
USER shop
CMD ["python", "app.py"]

Ein häufiger Irrtum

Warnung

Viele glauben, root im Container sei egal, weil der Container abgeschottet ist. Wände haben Fehler, und ein eingebundenes Volume sind echte Daten. Legen Sie einen Benutzer an und wechseln Sie mit USER zu ihm, wie es der cache des Labs tut.

Weniger im Image, weniger anzugreifen

Jedes Programm in einem Image ist eine mögliche Schwachstelle mehr. Jedes Werkzeug ist ein Werkzeug mehr für einen Angreifer.

Eine schlanke Basis wie ein Alpine-Image enthält viel weniger. Der Tag entscheidet, welche Version Sie bekommen. Ein Tag wie latest wandert: Ein Neubau im nächsten Monat kann ein anderes Image sein.

Beispiel: zwei Tags eines Images

TagGröße auf unserem TestrechnerWas es bedeutet
nginx:1.27284 MBein volles System darunter
nginx:1.27-alpine76,8 MBein kleines System darunter
nginx:latestnicht gemessenwas beim Bauen gerade am neuesten ist

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Welchen Tag legt cache fest?

Befehl
docker inspect --format '{{.Config.Image}}' cache

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Geheimnis im Image bleibt dort

Ein Image wird geteilt. Es wird in eine Registry geschoben, auf Server kopiert und an Kollegen gegeben. Was in einem Layer liegt, reist mit.

Ein Passwort in einem Dockerfile bleibt für immer in den Layern, auch wenn ein späterer Schritt die Datei löscht. Halten Sie Geheimnisse aus dem Image heraus und geben Sie sie dem Container beim Start.

Ein Dockerfile mit Geheimnis, nicht nachmachen

Code: bash
FROM alpine:3.20
ENV API_KEY=abc123-not-real
RUN echo hello

Beispiel: wo ein Geheimnis auftauchte

Wie es gesetzt wurdeWo wir es zurückgelesen habenWas erschien
ENV im Dockerfiledocker history --no-truncdie Zeile ENV API_KEY=abc123-not-real
-e beim Start des Containersdocker inspect, Config.EnvDB_PASSWORD=hunter2 in der Liste
Keines von beidennichts im Image oder in den Einstellungenein Geheimnis, das erst zur Laufzeit übergeben wird

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Alles lesen, was cache gesagt wurde

Befehl
docker inspect --format '{{json .Config.Env}}' cache

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Weiterführend

Nehmen Sie das Dockerfile mit dem Geheimnis. Schreiben Sie es so um, dass es seinen Tag festlegt, als Benutzer läuft und kein Geheimnis enthält.

Führen Sie dann die drei Funktionen der Aufgabe auf der alten und Ihrer neuen Fassung aus. Die neue sollte sauber durchkommen.

Über dieses Lab und seinen Quellcode: Docker-Grundlagen-Lab: Container, Logs und Neustarts lernen, indem ein defekter Dienst repariert wird

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.