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/.
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.
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.
Installieren Sie sysutils/ezjail:
#
cd /usr/ports/sysutils/ezjail
#
make install clean
Aktivieren Sie ezjail,
indem Sie folgende Zeile in
/etc/rc.conf
hinzufügen:
ezjail_enable="YES"
Der Dienst wird automatisch gestartet, wenn das System bootet. Er kann auch direkt für die aktuelle Sitzung gestartet werden:
#
service ezjail start
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.
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.
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.
Neue Jails werden mit ezjail-admin
create
erstellt. In diesen Beispielen wird die
lo1
Loopback-Schnittstelle, wie oben
beschrieben, verwendet.
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
'
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/
,
für einzelne Jails aktiviert werden. Bearbeiten Sie den
Eintrag jailname
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.
Starten Sie die Jail:
#
ezjail-admin start
dnsjail
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:
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:
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.
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.
/etc/hosts
anpassen
Ändern Sie die Adresse und fügen Sie den Namen der
Jail zu den localhost
-Einträgen in
/etc/hosts
hinzu.
/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.
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.
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:
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
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
Nach einem größeren Versionsupdate empfiehlt
sysutils/ezjail, sicherzustellen,
dass pkg
die richtige Version hat.
Geben Sie dazu den folgenden Befehl ein, um auf die
entsprechende Version zu aktualisieren:
#
pkg-static upgrade -f pkg
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
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
Stopping jails: sambajailsambajail
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
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
Stopping jails: wwwserver.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'
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.
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>.