Docker hat sich als leistungsstarkes Werkzeug etabliert, das Entwicklern hilft, Anwendungen effizient zu containerisieren und zu skalieren. Doch wie bei jeder Technologie gibt es Aspekte, die es ermöglichen, versehentlich Sicherheitslücken zu erzeugen. Einer dieser Aspekte beim Umgang mit Docker-Images ist die Art und Weise, wie Dateien gelöscht werden. In diesem Blogpost wird erklärt, warum das Löschen von Dateien in Docker-Images problematisch sein kann und wie diese Lücke vermieden werden kann.
Docker Schichtensystem: Ein kurzer Überblick
Docker-Images bestehen aus mehreren Schichten, die nacheinander aufgebaut werden. Jede Schicht repräsentiert einen schreibgeschützten Schnappschuss des Dateisystems. Änderungen oder Ergänzungen des Dateisystems erzeugen einen neuen Schnappschuss, aufbauend auf den vorherigen Schichten.
Für dieses beispielhafte Dockerfile werden drei Schichten erzeugt.
1FROM alpine 2RUN apk update && apk add python3 3COPY src/ /app/
Schichten des Dockerfiles
Das Problem beim Löschen von Dateien
Angenommen in dem Dockerfile wird eine Datei hinzugefügt, die ein Secret enthält. Später wird diese Datei wieder durch den rm
Befehl gelöscht, da sie nicht im finalen Image enthalten sein soll. Insgesamt werden für das folgende Dockerfile fünf Schichten erzeugt. Obwohl die Datei in der neuesten Schicht als gelöscht markiert wird, bleibt sie in den vorherigen Schichten vorhanden.
1FROM alpine 2RUN apk update && apk add python3 3COPY buildconfig.json /buildconfig.json 4COPY src/ /app/ 5# Do something with the build config 6RUN rm /buildconfig.json
Schichten nach dem Löschen einer Datei
Ein Beispiel zur Veranschaulichung
Nachdem das Image aus dem obigen Dockerfile gebaut wurde, kann es als tar Archiv gespeichert werden.
1docker save -o exampleimage.tar exampleimage
In diesem Archiv befindet sich das Image Manifest manifest.json
, in dem die Binär Blobs der Schichten aufgelistet werden. Die Binär Blobs sind ebenfalls tar Archive, welche die Änderung der jeweiligen Schicht beinhaltet.
1"Layers": [ 2 "blobs/sha256/63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85", 3 "blobs/sha256/01ab1ebbd41659e8b36216acb45a5108a1bb4d42eaae40c6cfb82e4d532e8558", 4 "blobs/sha256/35496380094a9854f97ff02beddde9ca0ec9ea1cac47b4a659d5595102dfeb48", 5 "blobs/sha256/8d8d469b0e64e18c2ec91f4e0d62684a950fe21ce39e179950392ca29e5544ad", 6 "blobs/sha256/f6b4e08453d8488c6fbb8062fb291c9dfeef9b979101e9edcbb5c1cd3fb6df30" 7],
Wenn die Dateien, der letzten Schicht gelistet werden, sieht man die als gelöscht markierte buildconfig.json Datei. Der Prefix .wh.
dient dabei als Marker dafür, dass diese Datei gelöscht wurde.
1tar --list -f blobs/sha256/f6b4e08453d8488c6fbb8062fb291c9dfeef9b979101e9edcbb5c1cd3fb6df30 2.wh.buildconfig.json
Wird die dritte Schicht gelistet, findet man die buildconfig.json Datei. Somit hat jeder, der Zugriff zu diesem Docker Image hat, auch Zugriff auf die Konfigurationsdatei und kann somit das Secret auslesen und missbrauchen.
1tar --list -f blobs/sha256/35496380094a9854f97ff02beddde9ca0ec9ea1cac47b4a659d5595102dfeb48 2buildconfig.json
Best Practices zur Vermeidung dieser Lücke
Eine gängige Methode, um diese Lücke zu vermeiden, sind Multi-Stage Builds. Dadurch existieren die sensiblen Dateien nur in dem temporären Image, werden aber nicht in dem endgültigen Image inkludiert.
1FROM alpine AS intermediate 2RUN apk update && apk add python3 3COPY buildconfig.json /buildconfig.json 4COPY src/ /app/ 5# Do something with the build config 6RUN rm /buildconfig.json 7 8FROM alpine 9COPY --from=intermediate /app/ /
Außerdem sollte sorgfältig geplant werden, welche Dateien im endgültigen Image enthalten sein sollen und sichergestellt werden, dass sensible Dateien nicht aus Versehen mit eingebaut werden.
Fazit
Durch das Verständnis der Arbeitsweise von Docker-Image Schichten und die Anwendung der richtigen Strategie kann sichergestellt werden, dass sensible Daten wirklich aus Docker-Images entfernt werden. Docker ist ein mächtiges Werkzeug, aber wie jede Technologie erfordert es sorgfältige Handhabung, um sicherzustellen, dass die Anwendungen sicher und effizient laufen.
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Blog-Autor*in
David
IT-Security Consultant
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.