© Liashko/Shutterstock.com
Entwickler Magazin
Ein Blick auf die Linux-Basics unter der Docker-Haube

Besuch im Docker-Maschinenraum

Der Hauptverdienst von Docker liegt in seiner standardisierten Hülle: Einheitliche Beschreibungen und Abmessungen vereinfachen das Verladen, Teilen und Ausführen von Anwendungen. Unter der Motorhaube greift Docker auf Bestehendes zurück: Die Basisfunktionen einer Sandbox sowie Namespaces, Cgroups und chroot sind schon länger Bestandteil des Linux-Kerns. Wer also die richtigen Kommandos bemüht, kann nachvollziehen, wie es im Maschinenraum von Docker aussieht. Das Wissen darüber nützt nicht zuletzt, um sich einen Eindruck von der Wirkungsweise und Sicherheit des Containers zu verschaffen.

Matthias Albert, Jürgen Brunk, Nils Magnus


Viele Vorzüge von Docker schätzen Anwender erst dann richtig, wenn sie selbst Hand angelegt und versucht haben, seine Funktionen nachzubilden. Dieser Artikel zeichnet mit Linux-Bordmitteln nach, was Docker leistet und wie ein Container funktioniert. Dabei geht es nicht darum, ein besseres Framework, sondern vielmehr Verständnis zu schaffen.

Die einfachste Form der Containervirtualisierung gibt es schon bemerkenswert lange: Das erstmals 1982 eingesetzte Unix-Kommando chroot verändert das Root-Verzeichnis eines Prozesses und seiner Kinder (Kasten: „chroot-Umgebungen“). Es spricht sich „change root“ aus und verweist auf den gleichnamigen Systemaufruf im Kernel von Unix- und Linux-Systemen. Damit realisiert es eine sehr einfache Sandbox und verhindert, dass Programme auf Dateien außerhalb der neuen Wurzel zugreifen. Seit diesen ersten Schritten gab es bis heute eine ganze Reihe von Meilensteinen, die zur heutigen Containertechnik geführt haben (Abb. 1).

Abb. 1: Die Geschichte der Entwicklungen, die zur heutigen Containertechnik mit Docker geführt hat, ist lang; erste Ansätze zur Dateisystemisolation datieren zurück bis 1979

chroot-UmgebungenDen Systemaufruf chroot() gibt es schon seit 1979. Unix-Pionier Bill Joy brachte ihn 1982 in BSD-Unix ein – aus ganz ähnlichen Gründen, wie er heute noch eingesetzt wird: Er wollte nämlich die Installation und das Build-System testen, ohne sein eigentliches Betriebssystem zu gefährden. Heute kennt fast jedes unixoide Betriebssystem das oft auch als „Jail“ bezeichnete Prinzip. Der Systemaufruf benötigt besondere Privilegien, die mit Root-Rechten einhergehen. Die Kernelfunktion selbst wechselt nicht in das neue Wurzelverzeichnis hinein. Das ist auch mit Grund dafür, dass die Funktion nicht als Sicherheitsfunktion herhalten kann. Der folgende Code demonstriert, von einem User mit Root-Rechten ausgeführt, wie sich aus einer solchen Sandbox entkommen lässt: Er startet nämlich eine neue Shell, die Zugriff auf die äußere Verzeichnisstruktur hat:#include #define DIR "xxx"int main() { int i; mkdir(DIR, 0755); chroot(DIR); for (i = 0; i

Entwickler Magazin
Ein Blick auf die Linux-Basics unter der Docker-Haube

Besuch im Docker-Maschinenraum

Der Hauptverdienst von Docker liegt in seiner standardisierten Hülle: Einheitliche Beschreibungen und Abmessungen vereinfachen das Verladen, Teilen und Ausführen von Anwendungen. Unter der Motorhaube greift Docker auf Bestehendes zurück: Die Basisfunktionen einer Sandbox sowie Namespaces, Cgroups und chroot sind schon länger Bestandteil des Linux-Kerns. Wer also die richtigen Kommandos bemüht, kann nachvollziehen, wie es im Maschinenraum von Docker aussieht. Das Wissen darüber nützt nicht zuletzt, um sich einen Eindruck von der Wirkungsweise und Sicherheit des Containers zu verschaffen.

Matthias Albert, Jürgen Brunk, Nils Magnus


Viele Vorzüge von Docker schätzen Anwender erst dann richtig, wenn sie selbst Hand angelegt und versucht haben, seine Funktionen nachzubilden. Dieser Artikel zeichnet mit Linux-Bordmitteln nach, was Docker leistet und wie ein Container funktioniert. Dabei geht es nicht darum, ein besseres Framework, sondern vielmehr Verständnis zu schaffen.

Die einfachste Form der Containervirtualisierung gibt es schon bemerkenswert lange: Das erstmals 1982 eingesetzte Unix-Kommando chroot verändert das Root-Verzeichnis eines Prozesses und seiner Kinder (Kasten: „chroot-Umgebungen“). Es spricht sich „change root“ aus und verweist auf den gleichnamigen Systemaufruf im Kernel von Unix- und Linux-Systemen. Damit realisiert es eine sehr einfache Sandbox und verhindert, dass Programme auf Dateien außerhalb der neuen Wurzel zugreifen. Seit diesen ersten Schritten gab es bis heute eine ganze Reihe von Meilensteinen, die zur heutigen Containertechnik geführt haben (Abb. 1).

Abb. 1: Die Geschichte der Entwicklungen, die zur heutigen Containertechnik mit Docker geführt hat, ist lang; erste Ansätze zur Dateisystemisolation datieren zurück bis 1979

chroot-UmgebungenDen Systemaufruf chroot() gibt es schon seit 1979. Unix-Pionier Bill Joy brachte ihn 1982 in BSD-Unix ein – aus ganz ähnlichen Gründen, wie er heute noch eingesetzt wird: Er wollte nämlich die Installation und das Build-System testen, ohne sein eigentliches Betriebssystem zu gefährden. Heute kennt fast jedes unixoide Betriebssystem das oft auch als „Jail“ bezeichnete Prinzip. Der Systemaufruf benötigt besondere Privilegien, die mit Root-Rechten einhergehen. Die Kernelfunktion selbst wechselt nicht in das neue Wurzelverzeichnis hinein. Das ist auch mit Grund dafür, dass die Funktion nicht als Sicherheitsfunktion herhalten kann. Der folgende Code demonstriert, von einem User mit Root-Rechten ausgeführt, wie sich aus einer solchen Sandbox entkommen lässt: Er startet nämlich eine neue Shell, die Zugriff auf die äußere Verzeichnisstruktur hat:#include #define DIR "xxx"int main() { int i; mkdir(DIR, 0755); chroot(DIR); for (i = 0; i

Neugierig geworden?


   
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang