14.6. Verwaltung von Jails mit ezjail

Beigetragen von Warren Block.
Übersetzt von Björn Heidotting.

Das Erstellen und Verwalten von mehreren Jails kann schnell zeitaufwändig und fehleranfällig werden. Dirk Engling's ezjail automatisiert und vereinfacht viele dieser Aufgaben. Als Vorlage wird ein Basejail erzeugt. Zusätzliche Jails nutzen mount_nullfs(8) um viele Verzeichnisse aus der Basejail zu teilen, ohne dabei zusätzlichen Speicherplatz zu belegen. Jedes weitere Jail benötigt daher nur wenige Megabyte an Speicherplatz, bevor die Anwendungen installiert werden.

Weitere Vorteile und Merkmale werden im Detail auf der Webseite von ezjail beschrieben: https://erdgeist.org/arts/software/ezjail/.

14.6.1. ezjail installieren

Für die Installation von ezjail wird zunächst eine Loopback-Schnittstelle für die Jails benötigt. Anschließend kann ezjail installiert und der dazugehörige Dienst aktiviert werden.

  1. Damit der Verkehr auf der Loopback-Schnittstelle des Jails vom Host-System separiert ist, wird eine zweite Loopback-Schnittstelle in /etc/rc.conf erstellt:

    cloned_interfaces="lo1"

    Die zusätzliche Schnittstelle lo1 wird erstellt, wenn das System neu gestartet wird. Die Schnittstelle kann auch ohne Neustart manuell erstellt werden:

    # service netif cloneup
    Created clone interfaces: lo1.

    Jails können die Aliase dieser sekundären Schnittstelle verwenden, ohne dabei das Host-System zu stören.

    Der Zugang zur Loopback-Adresse 127.0.0.1 wird an die erste IP-Adresse umgeleitet, die dem Jail zugewiesen ist. Damit die Loopback-Schnittstelle des Jails der neuen lo1-Schnittstelle zugeordnet werden kann, muss beim Erstellen der Jail diese Schnittstelle als erstes in der Liste der IP-Adressen angegeben werden.

    Teilen Sie jedem Jail eine Loopback-Adresse aus dem Netzblock 127.0.0.0/8 zu.

  2. Installieren Sie sysutils/ezjail:

    # cd /usr/ports/sysutils/ezjail
    # make install clean
  3. Aktivieren Sie ezjail, indem Sie folgende Zeile in /etc/rc.conf hinzufügen:

    ezjail_enable="YES"
  4. Der Dienst wird automatisch gestartet, wenn das System bootet. Er kann auch direkt für die aktuelle Sitzung gestartet werden:

    # service ezjail start

14.6.2. Einrichtung

Nach erfolgreicher Installation von ezjail kann die Verzeichnisstruktur für die Basejail erstellt und befüllt werden. Dieser Schritt wird einmalig auf dem Host-System ausgeführt.

In diesen beiden Beispielen wird -p verwendet, um die Ports-Sammlung mit portsnap(8) in die Basejail herunterzuladen. Diese Kopie kann dann von allen Jails gemeinsam genutzt werden. Eine separate Kopie der Ports-Sammlung für die Jails ermöglicht die Isolierung der Ports vom Host-System. Die FAQ von ezjail erklärt dies im Detail: https://erdgeist.org/arts/software/ezjail/#FAQ.

    • Die Jail mit FreeBSD-RELEASE installieren

      Benutzen Sie install, wenn das FreeBSD-RELEASE für die Jail der Version auf dem Host-System entspricht. Wenn beispielsweise auf dem Host-System FreeBSD 10-STABLE installiert ist, wird in der Jail das neueste RELEASE von FreeBSD-10 installiert:

      # ezjail-admin install -p
    • Die Jail mit installworld installieren

      Mit ezjail-admin update kann die Basejail mit den Binärdateien aus dem Host-System befüllt werden. Diese Dateien wurden auf dem Host-System mittels buildworld erzeugt.

      In diesem Beispiel wird FreeBSD 10-STABLE aus den Quellen gebaut. Die Verzeichnisse für die Jail wurden bereits erstellt. Anschließend wird installworld ausgeführt, das /usr/obj aus dem Host-System in die Basejail installiert.

      # ezjail-admin update -i -p

      In der Voreinstellung wird /usr/src des Host-Systems verwendet. Ein anderes Quellverzeichnis kann durch die Angabe von -s, oder durch Setzen der Variable ezjail_sourcetree in /usr/local/etc/ezjail.conf definiert werden.

Tipp:

Die Ports-Sammlung der Basejail wird mit den anderen Jails geteilt, jedoch werden die heruntergeladenen Distfiles im jeweiligen Jail gespeichert. In der Voreinstellung werden diese Dateien in /var/ports/distfiles der Jail gespeichert. Wenn die Ports gebaut werden, wird /var/ports im Jail als Arbeitsverzeichnis genutzt.

Tipp:

Zum herunterladen der Pakete, für die Installation in der Basejail, wird in der Voreinstellung das FTP-Protokoll verwendet. Firewalls und Proxies können jedoch bei der FTP-Übertragung Probleme verursachen. Das HTTP-Protokoll arbeitet anderes und vermeidet diese Probleme. Sie können eine URL für einen bestimmten Spiegel in /usr/local/etc/ezjail.conf eintragen:

ezjail_ftphost=http://ftp.FreeBSD.org

Im Abschnitt A.2, „FTP-Server“ finden Sie eine Liste mit Spiegeln.

14.6.3. Eine neue Jail erstellen und starten

Neue Jails werden mit ezjail-admin create erstellt. In diesen Beispielen wird die lo1 Loopback-Schnittstelle, wie oben beschrieben, verwendet.

Prozedur 14.1. Eine neue Jail erstellen und starten
  1. Geben Sie bei der Erstellung der Jail einen Namen und die verwendeten Loopback- und Netzwerk-Schnittstellen mit den IP-Adressen an. In diesem Beispiel trägt die Jail den Namen dnsjail.

    # ezjail-admin create dnsjail 'lo1|127.0.1.1,em0|192.168.1.50'

    Tipp:

    Die meisten Netzwerkdienste laufen problemlos in einer Jail. Ein paar wenige Netzwerkdienste, vor allem ping(8) verwenden Netzwerk-Sockets. Aus Sicherheitsgründen werden Netzwerk-Sockets innerhalb der Jails deaktiviert, so dass Dienste, die diese Sockets benötigten, nicht funktionieren werden. Gelegentlich benötigt ein Jail jedoch den Zugriff auf Raw-Sockets. Beispielsweise verwenden Netzwerk-Monitoring-Anwendungen ping(8), um die Verfügbarkeit von anderen Rechnern zu überprüfen. Sollten diese Sockets tatsächlich benötigt werden, können sie durch einen Eintrag in der Konfigurationsdatei von ezjail, /usr/local/etc/jailname, für einzelne Jails aktiviert werden. Bearbeiten Sie den Eintrag parameters:

    export jail_jailname_parameters="allow.raw_sockets=1"

    Aktivieren Sie keine Netzwerk-Sockets, solange die Dienste im Jail sie nicht tatsächlich benötigen.

  2. Starten Sie die Jail:

    # ezjail-admin start dnsjail
  3. Starten Sie eine Konsole in der Jail:

    # ezjail-admin console dnsjail

Die Jail ist jetzt in Betrieb und die zusätzliche Konfiguration kann nun abgeschlossen werden. Typische Einstellungen an dieser Stelle sind:

  1. Das root-Passwort setzen

    Verbinden Sie sich mit der Jail und setzen Sie das Passwort für den Benutzer root:

    # ezjail-admin console dnsjail
    # passwd
    Changing local password for root
    New Password:
    Retype New Password:
  2. Konfiguration der Zeitzone

    Die Zeitzone kann innerhalb der Jail mit tzsetup(8) gesetzt werden. Um störende Fehlermeldungen zu vermeiden, kann der Eintrag adjkerntz(8) in /etc/crontab auskommentiert werden. Dieser Job versucht die Uhr des Rechners zu aktualisieren, was jedoch in einem Jail fehlschlägt, da die Jail nicht auf diese Hardware zugreifen darf.

  3. DNS-Server

    Tragen Sie die Zeilen für die Nameserver der Domäne in /etc/resolv.conf ein, damit die Namensauflösung in der Jail funktioniert.

  4. /etc/hosts anpassen

    Ändern Sie die Adresse und fügen Sie den Namen der Jail zu den localhost-Einträgen in /etc/hosts hinzu.

  5. /etc/rc.conf konfigurieren

    Tragen Sie Konfigurationseinstellungen in /etc/rc.conf ein. Der Rechnername und die IP-Adresse werden nicht eingestellt, da diese Werte bereits durch die Jail-Konfiguration zur Verfügung gestellt werden.

Nach der Konfiguration der Jail können die Anwendungen, für die die Jail erstellt wurde, installiert werden.

Tipp:

Einige Ports müssen mit speziellen Optionen gebaut werden, damit sie in der Jail verwendet werden können. Zum Beispiel haben die Netzwerk-Monitoring-Pakete net-mgmt/nagios-plugins und net-mgmt/monitoring-plugins eine Option JAIL, die aktiviert werden muss, damit diese Werkzeuge innerhalb einer Jail funktionieren.

14.6.4. Jails aktualisieren

14.6.4.1. Das Betriebssystem aktualisieren

Da das Basissystem der Basejail von den anderen Jails gemeinsam genutzt wird, werden bei einem Update der Basejail automatisch alle anderen Jails aktualisiert. Die Aktualisierung kann entweder über den Quellcode oder über binäre Updates erfolgen.

Um das Basissystem auf dem Host-System zu bauen und in der Basejail zu installieren, geben Sie folgendes ein:

# ezjail-admin update -b

Wenn das Basissystem bereits auf dem Host-System gebaut wurde, kann es in der Basejail installiert werden:

# ezjail-admin update -i

Binär-Updates verwenden freebsd-update(8). Das Update unterliegt dabei den gleichen Einschränkungen, als wenn freebsd-update(8) direkt ausgeführt würde. Vor allem stehen mit dieser Methode nur -RELEASE Versionen von FreeBSD zur Verfügung.

Aktualisieren Sie die Basejail auf die neueste FreeBSD-Version des Host-Systems. Zum Beispiel von RELEASE-p1 auf RELEASE-p2.

# ezjail-admin update -u

Damit das Basejail aktualisiert werden kann, muss zunächst das Host-System, wie in Abschnitt 23.2.3, „Aktualisierungen an Haupt- und Unterversionen“ beschrieben, aktualisiert werden. Sobald das Host-System aktualisiert und neu gestartet wurde, kann die Basejail aktualisiert werden. Da freebsd-update(8) keine Möglichkeit besitzt, die derzeit installierte Version der Basejail zu bestimmen, muss die ursprüngliche Version beim Aufruf mit angegeben werden. Benutzen Sie file(1) um die ursprüngliche Version der Basejail zu bestimmen:

# file /usr/jails/basejail/bin/sh
/usr/jails/basejail/bin/sh: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.3, stripped

Nutzen Sie diese Information, um die Aktualisierung von 9.3-RELEASE auf die aktuelle Version des Host-Systems durchzuführen:

# ezjail-admin update -U -s 9.3-RELEASE

Nachdem die Basejail aktualisiert ist, muss in jeder Jail mergemaster(8) ausgeführt werden, um die Konfigurationsdateien zu aktualisieren.

Wie mergemaster(8) verwendet wird, hängt stark vom Zweck und Vertrauenswürdigkeit der Jail ab. Wenn die Dienste oder Benutzer nicht vertrauenswürdig sind, dann sollte mergemaster(8) nur innerhalb der Jail ausgeführt werden:

Beispiel 14.1. mergemaster(8) in einer nicht vertrauenswürdigen Jail ausführen

Entfernen Sie die Verknüpfung von /usr/src des Jails zur Basejail und erstellen Sie ein neues /usr/src als Mountpunkt für die Jail. Hängen Sie /usr/src vom Host-System schreibgeschützt in den Mountpunkt für die Jail ein:

# rm /usr/jails/jailname/usr/src
# mkdir /usr/jails/jailname/usr/src
# mount -t nullfs -o ro /usr/src /usr/jails/jailname/usr/src

Öffnen Sie eine Konsole in der Jail:

# ezjail-admin console jailname

Innerhalb der Jail führen Sie dann mergemaster(8) aus. Danach verlassen Sie die Konsole:

# cd /usr/src
# mergemaster -U
# exit

Abschließend können Sie /usr/src aus der Jail aushängen:

# umount /usr/jails/jailname/usr/src

Beispiel 14.2. mergemaster(8) in einer vertrauenswürdigen Jail ausführen

Wenn den Benutzern und den Diensten in der Jail vertraut wird, kann mergemaster(8) auf dem Host-System ausgeführt werden:

# mergemaster -U -D /usr/jails/jailname

14.6.4.2. Ports aktualisieren

Die Ports-Sammlung der Basejail wird von den anderen Jails gemeinsam genutzt. Somit genügt es, die Ports-Sammlung in der Basejail zu aktualisieren.

Die Ports-Sammlung der Basejail wird mit portsnap(8) aktualisiert:

# ezjail-admin update -P

14.6.5. Jails verwalten

14.6.5.1. Jails starten und stoppen

ezjail startet automatisch alle Jails, wenn das System hochfährt. Jails können auch manuell mit stop und start gestoppt und neu gestartet werden:

# ezjail-admin stop sambajail
Stopping jails: sambajail

In der Voreinstellung werden die Jails automatisch gestartet, wenn das Host-System hochfährt. Der automatische Start kann mit config deaktiviert werden:

# ezjail-admin config -r norun seldomjail

Diese Einstellung wird nach einem Neustart des Host-Systems aktiviert. Eine Jail, die bereits läuft, wird hiermit nicht gestoppt.

Der automatische Start kann auch aktiviert werden:

# ezjail-admin config -r run oftenjail

14.6.5.2. Jails archivieren und wiederherstellen

Benutzen Sie archive um ein .tar.gz-Archiv einer Jail zu erstellen. Der Dateiname wird aus dem Namen der Jail und dem aktuellen Datum zusammengesetzt. Archivdateien werden in /usr/jails/ezjail_archives abgelegt. Ein alternatives Verzeichnis für die Ablage kann in der Variable ezjail_archivedir der Konfigurationsdatei definiert werden.

Die Archivdatei kann an anderer Stelle als Sicherung gespeichert werden, oder eine andere Jail kann daraus mit restore wiederhergestellt werden. Eine neue Jail kann auch aus dem Archiv erstellt werden, was eine bequeme Möglichkeit bietet, bestehende Jails zu klonen.

Die Jail wwwserver stoppen und archivieren:

# ezjail-admin stop wwwserver
Stopping jails: wwwserver.
# ezjail-admin archive wwwserver
# ls /usr/jails/ezjail-archives/
wwwserver-201407271153.13.tar.gz

Erstellen Sie aus dem eben erzeugten Archiv eine neue Jail namens wwwserver-clone. Verwenden Sie die Schnittstelle em1 und weisen Sie eine neue IP-Adresse zu, um einen Konflikt mit dem Original zu vermeiden:

# ezjail-admin create -a /usr/jails/ezjail_archives/wwwserver-201407271153.13.tar.gz wwwserver-clone 'lo1|127.0.3.1,em1|192.168.1.51'

14.6.6. Vollständiges Beispiel: BIND in einer Jail

Einen BIND DNS-Server innerhalb einer Jail zu betreiben erhöht die Sicherheit, da der Dienst isoliert wird. Dieses Beispiel erstellt einen einfachen caching-only Nameserver.

  • Die Jail bekommt den Namen dns1.

  • Die Jail erhält die IP-Adresse 192.168.1.240 auf der Schnittstelle re0 des Host-Systems.

  • Die Upstream-DNS-Server des ISPs lauten 10.0.0.62 und 10.0.0.61.

  • Die Basejail wurde bereits erstellt und die Ports-Sammlung installiert, wie in Abschnitt 14.6.2, „Einrichtung“ beschrieben.

Beispiel 14.3. BIND in einer Jail laufen lassen

Erstellen Sie eine geklonte Loopback-Schnittstelle durch einen Eintrag in /etc/rc.conf:

cloned_interfaces="lo1"

Erzeugen Sie jetzt die Loopback-Schnittstelle:

# service netif cloneup
Created clone interface: lo1

Erstellen Sie die Jail:

# ezjail-admin create dns1 'lo1|127.0.2.1,re0|192.168.1.240'

Starten Sie die Jail, verbinden Sie sich mit der Konsole und führen Sie die grundlegende Konfiguration durch:

# ezjail-admin start dns1
# ezjail-admin console dns1
# passwd
Changing local password for root
New Password:
Retype New Password:
# tzsetup
# sed -i .bak -e '/adjkerntz/ s/^/#/' /etc/crontab
# sed -i .bak -e 's/127.0.0.1/127.0.2.1/g; s/localhost.my.domain/dns1.my.domain dns1/' /etc/hosts

Setzen Sie vorübergehend die Upstream-DNS-Server in /etc/resolv.conf, damit die Ports-Sammlung heruntergeladen werden kann:

nameserver 10.0.0.62
nameserver 10.0.0.62

Immer noch in der Konsole der Jail, installieren Sie dns/bind99.

# make -C /usr/ports/dns/bind99 install clean

Konfigurieren Sie den Nameserver in /usr/local/etc/namedb/named.conf.

Erstellen Sie eine Zugriffskontrollliste (ACL) der Adressen und Netzwerke, die DNS-Anfragen an diesen Nameserver senden dürfen. Diese Sektion wird vor der Sektion options hinzugefügt, die sich bereits in der Datei befindet:

...
// or cause huge amounts of useless Internet traffic.

acl "trusted" {
	192.168.1.0/24;
	localhost;
	localnets;
};

options {
...

Verwenden Sie die IP-Adresse der Jail in der Direktive listen-on, um DNS-Anfragen von anderen Rechnern aus dem Netzwerk zu akzeptieren:

	listen-on	{ 192.168.1.240; };

Entfernen Sie die Kommentarzeichen /* und */. Tragen Sie die IP-Adressen der Upstream-DNS-Server ein. Unmittelbar nach der Sektion forwarders fügen Sie Verweise auf die bereits definierten ACLs ein:

	forwarders {
		10.0.0.62;
		10.0.0.61;
	};

	allow-query       { any; };
	allow-recursion   { trusted; };
	allow-query-cache { trusted; };

Aktivieren Sie den Dienst in /etc/rc.conf:

named_enable="YES"

Starten und testen Sie den Nameserver:

# service named start
wrote key file "/usr/local/etc/namedb/rndc.key"
Starting named.
# /usr/local/bin/dig @192.168.1.240 freebsd.org

Beinhaltet die Antwort

;; Got answer;

dann funktioniert der Nameserver. Eine längere Verzögerung, gefolgt von der Antwort

;; connection timed out; no servers could be reached

weist auf ein Problem hin. Überprüfen Sie die Konfigurationseinstellungen und stellen Sie sicher, dass alle lokalen Firewalls den DNS-Zugriff auf die Upstream-DNS-Server erlauben.

Wie auch jeder andere lokale Rechner, kann der DNS-Server Anfragen für Namensauflösung an sich selbst stellen. Tragen Sie die Adresse des DNS-Servers in die /etc/resolv.conf der Client-Rechner:

nameserver 192.168.1.240

Ein lokaler DHCP-Server kann die Adresse eines lokalen DNS-Servers automatisch für alle DHCP-Clients zur Verfügung stellen.


Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.

Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.