Obwohl Linux als freie Software kostenlos verfügbar ist, setzen viele beim Unternehmenseinsatz auf Enterprise-Distributionen mit Support. Wo die Stärken der ... (mehr)

Implementierung der Jails

Bei den Jails lohnt ein Blick hinter die Kulissen. Das Konzept besteht aus zwei Komponenten: Zum einen das Tool »jail« , das die Benutzerschnittstelle zwischen dem Kernel und dem Userland darstellt, zum anderen Code im Kernel, der per Systemcall angesprungen wird.

Das Tool »jail« benötigt folgende Parameter: den Pfad zur Jail, den Hostnamen der Jail, die korrespondierende IP-Adresse und das auszuführende Kommando.

Wie in einem Auszug aus dem Quellcode zu ersehen ist (Listing 1), enthält der Funktionsaufruf »jail« eine Struktur »jail« (struct jail: »/usr/include/sys/jail.h« ), in der die eben genannten Parameter gespeichert sind.

Listing 1

struct jail

 

Nachdem die Struktur mit Informationen versorgt ist, sperrt sich das Tool »jail« selbst ein »(i = jail(&j))« und erzeugt in dieser Umgebung einen Tochterprozess, der das gewünschte Kommando mittels »execv()« ausführt. Wie eingangs erwähnt, wird die Kernelfunktion »jail« aufgerufen:

int jail(struct proc *p, struct *jail_args uap);

Diese Funktion kopiert die in »uap« (struct jail) gespeicherten Informationen in den Kernel-Memory-Space und speichert einen Teil der Informationen in einer C-Struktur »prison« . Danach wird »chroot()« mit zwei Parametern aufgrufen, die zum einen den Pfad der Jail enthalten und zum anderen den aufrufenden Prozess.

Einschluss

Wie wird ein Prozess in eine Jail "eingesperrt"? In FreeBSD wird jeder Prozess durch eine C-Struktur »proc« dargestellt, die in »/usr/include/sys/proc.h« beschrieben ist. Sie enthält einen Pointer, der auf die Struktur »prison« zeigt. Das Feld »p_flag« mit dem Wert »P_JAILED« zeigt der Prozessverwaltung an, dass der Prozess in einer Jail auszuführen ist.

Die hohe Schutzwirkung begründet sich in der Art und Weise, wie die Prozess-Verwaltung des FreeBSD-Kernels die C-Struktur struct »proc« verarbeitet. Sobald ein Prozess durch das Zeitscheibenverfahren wieder Rechenzeit zugewiesen bekommt, wird anhand von »proc->prison->p_flag« geprüft, ob der Prozess einer Jail angehört oder nicht. Bei Prozessen, die innerhalb einer Jail gestartet wurden, ist dieses Flag bedingungslos gesetzt. Viele andere Kernel-Dienste entscheiden bei jedem Zugriff anhand des genannten Flags, ob und wie auf Ressourcen zugegriffen werden darf. Ein Auszug aus dem Quellcode verdeutlicht den Ablauf (Listing 2). Abbildung 1 stellt die Kommunikationswege dar.

Listing 2

Ressourcenzugriff

 

Abbildung 1: Kommunikation zwischen Userland und Kernel beim Erstellen einer Jail.
comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2021