Dieser Abschnitt basiert auf einer von Simon L. Nielsen <simon@FreeBSD.org>
auf http://simon.nitro.dk/service-jails.html
präsentierten Idee und einem aktualisierten
Artikel von Ken Tom (<locals@gmail.com>
). Er
beschreibt, wie ein FreeBSD-System durch Benutzung der
jail(8)-Funktion mit zusätzlichen
Sicherheitsebenen ausgestattet werden kann. Es wird dabei
angenommen, dass auf Ihrem FreeBSD-System RELENG_6_0 oder neuer
installiert ist und dass Sie die Informationen aus den
vorangehenden Abschnitten gelesen und verstanden haben.
Eines der Hauptprobleme bei Jails ist das Management ihres Upgrade-Prozesses. Dieser neigt dazu, problematisch zu sein, da jede Jail bei jedem Upgrade komplett neu gebaut werden muss. Das stellt normalerweise kein Problem dar, wenn es sich um eine einzelne Jail handelt, da der Upgrade-Prozess recht einfach ist. Verwenden Sie aber eine größere Anzahl von Jails, kann dieser Prozess sehr zeitaufwendig werden.
Diese Konfiguration erfordert fortgeschrittene
Kenntnisse im Umgang mit FreeBSD sowie der Benutzung seiner
Funktionen. Sollten die unten vorgestellten Schritte zu
kompliziert wirken, wird empfohlen, sich einfachere Verfahren
wie sysutils/ezjail
anzusehen, da diese einfachere Methoden zur Administration
von Jails verwenden und daher nicht so anspruchsvoll sind
wie der hier beschriebene Aufbau.
Diese Konfiguration basiert darauf, Jails so weit als möglich gemeinsam zu verwalten. Dies passiert auf sichere Art und Weise durch den Einsatz von mount_nullfs(8)-Mounts (read-only). Dadurch werden Aktualisierungen erleichtert und das Verteilen von verschiedenen Diensten auf verschiedene Jails wird attraktiver. Außerdem bietet dieses Verfahren einen einfachen Weg, Jails hinzuzufügen, zu entfernen und zu aktualisieren.
Beispiele für Dienste sind in diesem Zusammenhang: Ein HTTP-Server, ein DNS-Server, ein SMTP-Server und so weiter.
Die Ziele des in diesem Abschnitt beschriebenen Aufbaus sind:
Das Erstellen einer einfachen und gut verständlichen Struktur von Jails. Dies beinhaltet, nicht für jede Jail ein vollständiges installworld laufen lassen zu müssen.
Es einfach zu machen, neue Jails zu erstellen oder alte zu entfernen.
Es einfach zu machen, bestehende Jails zu aktualisieren.
Es einfach zu machen, einen angepassten FreeBSD-Zweig zu nutzen.
Paranoid bezüglich Sicherheit zu sein und Angriffsmöglickeiten weitgehend zu reduzieren.
Soviel Platz und Inodes wie möglich einzusparen.
Wie bereits erwähnt, ist dieses Design stark darauf angewiesen, dass eine read-only-Hauptvorlage in jede Jail hinein gemountet wird (bekannt als nullfs), und dass jede Jail über wenigstens ein beschreibbares Gerät verfügt. Das Gerät kann hierbei eine separate physikalische Platte oder ein vnode unterstütztes md(4)-Gerät sein. Im folgenden Beispiel wird ein nullfs-Mount genutzt, auf den nur Lesezugriff erlaubt ist.
Das Layout des Dateisystems wird in der folgenden Liste beschrieben:
Jede Jail wird unterhalb des /home/j
-Verzeichnisses
gemountet.
/home/j/mroot
ist die Vorlage für jede Jail und die nur lesbare
Partition für alle Jails.
Unterhalb von /home/j
wird für jede
Jail ein leeres Verzeichnis angelegt.
Jede Jail bekommt ein /s
-Verzeichnis, das zum
read/write-Teilbereich des Systems verlinkt wird.
Jede Jail bekommt ihr eigenes read/write-System,
das auf /home/j/skel
basiert.
Jeder Jailbereich (genauer der read/write-Teilbereich
jeder Jail) wird in /home/js
erstellt.
Es wird angenommen, dass die Jails sich unterhalb des
/home
Verzeichnisses
befinden. Dieser Ort kann von Ihnen natürlich
geändert werden. Allerdings müssen die Pfade
in den folgenden Beispielen dann entsprechend angepasst
werden.
Dieser Abschnitt beschreibt die Schritte, die zum Erstellen der Hauptvorlage (die den nur lesbaren Bereich für alle weiteren Jails darstellt) notwendig sind.
Es ist immer eine gute Idee, FreeBSD auf den aktuellen
-RELEASE-Zweig zu aktualisieren. Lesen Sie das entsprechende
Kapitel des
Handbuchs für Informationen zu diesem Thema. Selbst wenn
Sie auf eine Aktualisierung des Betriebssystems verzichten,
müssen Sie dennoch ein buildworld durchführen, um
fortfahren zu können. Außerdem müssen Sie
das Paket sysutils/cpdup
installiert sein. In diesem Beispiel wird portsnap(8)
verwendet, um die aktuelle FreeBSD Ports-Sammlung herunterzuladen.
Der Abschnitt Portsnap des
Handbuchs beschreibt, wie Sie dieses Werkzeug effektiv
einsetzen.
Zuerst erstellen wir eine Verzeichnissstruktur für das read-only-Dateisystem, das die FreeBSD-Binärdateien für unsere Jails enthalten wird. Anschließend wechseln wir in den FreeBSD-Quellcodebaum und installieren das read-only-Dateisystem in die (Vorlage-)Jail.
#
mkdir /home/j /home/j/mroot
#
cd /usr/src
#
make installworld DESTDIR=/home/j/mroot
Als nächstes bereiten wir die Ports-Sammlung fü die Jails vor und kopieren den FreeBSD Quellcodebaum in die Jail, da dieser für mergemaster benötigt wird:
#
cd /home/j/mroot
#
mkdir usr/ports
#
portsnap -p /home/j/mroot/usr/ports fetch extract
#
cpdup /usr/src /home/j/mroot/usr/src
Danach wird die Struktur für den read/write-Bereich des Systems erstellt:
#
mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles
#
mv etc /home/j/skel
#
mv usr/local /home/j/skel/usr-local
#
mv tmp /home/j/skel
#
mv var /home/j/skel
#
mv root /home/j/skel
Nutzen Sie mergemaster, um fehlende Konfigurationsdateien zu installieren. Anschließend werden die von mergemaster erstellten Extra-Verzeichnisse entfernt:
#
mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i
#
cd /home/j/skel
#
rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev
Nun wird das read/write-Dateisystem mit dem
read-only-Dateisystem verlinkt. Bitte vergewissern Sie
sich, dass die symbolischen Links an den korrekten
s/
Positionen
erstellt werden. Echte Verzeichnisse oder an falschen
Positionen erstellte Verzeichnisse lassen die Installation
fehlschlagen.
#
cd /home/j/mroot
#
mkdir s
#
ln -s s/etc etc
#
ln -s s/home home
#
ln -s s/root root
#
ln -s ../s/usr-local usr/local
#
ln -s ../s/usr-X11R6 usr/X11R6
#
ln -s ../../s/distfiles usr/ports/distfiles
#
ln -s s/tmp tmp
#
ln -s s/var var
Zuletzt erstellen Sie eine allgemeine
/home/j/skel/etc/make.conf
mit
folgendem Inhalt:
Ein gesetztes WRKDIRPREFIX
erlaubt es, die FreeBSD-Ports innerhalb jeder Jail
zu kompilieren. Das Ports-Verzeichnis ist Teil des
read-only System. Der angepasste Pfad des
WRKDIRPREFIX
macht es möglich,
innerhalb des read/write-Bereichs der Jail Ports zu
bauen.
Da nun eine komplette FreeBSD-Jailvorlage vorliegt, sind wir
nun in der Lage, Jails einrichten und in
/etc/rc.conf
zu konfigurieren. Dieses
Beispiel zeigt das Erstellen von drei Jails:
„NS“, „MAIL“ und
„WWW“.
Fügen Sie die folgenden Zeilen in
/etc/fstab
ein, damit die
read-only-Vorlage und der read/write-Bereich für
alle Jails verfügbar sind:
Mit der Pass-Nummer 0 markierte Partitionen werden
beim Booten des Systems nicht von fsck(8)
geprüft, mit 0 als Dump-Nummer markierte Partitonen
werden von dump(8) nicht gesichert. Wir wollen
nicht, dass fsck unsere
nullfs-Mounts prüft oder
dass dump die nur lesbaren
nullfs-Mounts unserer Jails sichert. Deshalb werden
diese Bereiche in den letzten beiden Spalten der
obenstehenden fstab
mit
„0 0“ markiert.
Konfigurieren Sie die Jails in
/etc/rc.conf
:
Der Grund dafür, dass die Variablen
jail_
nach name
_rootdir/usr/home
statt nach /home
zeigen, liegt darin, dass der physikalische Pfad des
/home
-Verzeichnisses unter
FreeBSD /usr/home
lautet. Die Variable
jail_
darf im Pfad aber keinen symbolischen
Link enthalten, weil das Jail ansonsten
nicht gestartet werden kann. Verwenden Sie
realpath(1), um den korrekten Wert für diese
Variable zu bestimmen. Weitere Informationen finden
Sie im Security Advisory FreeBSD-SA-07:01.jail.name
_rootdir
Erstellen Sie die notwendigen Mountpunkte für die nur lesbaren Bereiche jeder Jail:
#
mkdir /home/j/ns /home/j/mail /home/j/www
Installieren Sie die read/write-Vorlage in jede
Jail. Benutzen Sie hierfür sysutils/cpdup
, welches es
erleichtert, eine korrekte Kopie jedes Verzeichnisses
zu erstellen:
#
mkdir /home/js
#
cpdup /home/j/skel /home/js/ns
#
cpdup /home/j/skel /home/js/mail
#
cpdup /home/j/skel /home/js/www
An dieser Stelle werden die Jails erstellt und
fü den Betrieb vorbereitet. Zuerst mounten Sie die
notwendigen Dateisysteme für jede Jail und starten
diese dann mit dem Skript
/etc/rc.d/jail
:
#
mount -a
#
/etc/rc.d/jail start
Die Jails sollten nun laufen. Um zu prüfen, ob sie korrekt gestartet wurden, verwenden Sie jls(8). Nach dem Aufruf dieses Befehls sollten Sie eine Ausgabe ähnlich der folgenden erhalten:
#
jls
JID IP Address Hostname Path
3 192.168.3.17 ns.example.org /home/j/ns
2 192.168.3.18 mail.example.org /home/j/mail
1 62.123.43.14 www.example.org /home/j/wwwAn diesem Punkt sollte es möglich sein, sich an
jeder Jail anzumelden, Benutzer anzulegen und Dienste zu
konfigurieren. Die Spalte JID
gibt die
Jail-Identifikationsnummer jeder laufenden Jail an. Nutzen Sie
den folgenden Befehl, um administrative Aufgaben in der Jail
mit der JID
3 durchzuführen:
#
jexec 3 tcsh
Mit der Zeit wird es notwendig sein, das System auf eine neuere Version von FreeBSD zu aktualisieren. Zum einen aus Sicherheitsgründen, zum anderen, um neu eingeführte Funktionen nutzen zu können, die für die bestehenden Jails sinnvoll sind. Das Design dieses Aufbaus bietet einen einfachen Weg, bestehende Jails zu aktualisieren. Zudem reduziert es die Downtime, da die Jails erst im allerletzten Schritt gestoppt werden müssen. Außerdem bietet es die Möglichkeit, zu älteren Versionen zurückzukehren, falls irgendwelche Probleme auftreten.
Im ersten Schritt wird das Host-System aktualisiert.
Anschließend wird eine temporäre neue
read-only Vorlage /home/j/mroot2
erstellt.
#
mkdir /home/j/mroot2
#
cd /usr/src
#
make installworld DESTDIR=/home/j/mroot2
#
cd /home/j/mroot2
#
cpdup /usr/src usr/src
#
mkdir s
Der installworld
-Durchlauf
erzeugt einige unnötige Verzeichnisse, die nun entfernt
werden sollten:
#
chflags -R 0 var
#
rm -R etc var root usr/local tmp
Erzeugen Sie neue symbolische Links für das Hauptdateisystem:
#
ln -s s/etc etc
#
ln -s s/root root
#
ln -s s/home home
#
ln -s ../s/usr-local usr/local
#
ln -s ../s/usr-X11R6 usr/X11R6
#
ln -s s/tmp tmp
#
ln -s s/var var
Nun ist es an der Zeit, die Jails zu stoppen:
#
/etc/rc.d/jail stop
Unmounten des originalen Dateisystems:
#
umount /home/j/ns/s
#
umount /home/j/ns
#
umount /home/j/mail/s
#
umount /home/j/mail
#
umount /home/j/www/s
#
umount /home/j/www
Die read/write-Systeme sind an das read-only
System angehängt (/s
), das daher zuerst
ausgehängt werden muss.
Verschieben Sie das alte read-only-Dateisystem und ersetzen Sie es durch das neue Dateisystem. Das alte Dateisystem kann so als Backup dienen, falls etwas schief geht. Die Namensgebung entspricht hier derjenigen bei der Erstellung eines neuen read-only-Dateisystems. Verschieben Sie die originale FreeBSD Ports-Sammlung in das neue Dateisystem, um Platz und Inodes zu sparen:
#
cd /home/j
#
mv mroot mroot.20060601
#
mv mroot2 mroot
#
mv mroot.20060601/usr/ports mroot/usr
Nun ist die neue read-only-Vorlage fertig. Sie müssen daher nur noch die Dateisysteme erneut mounten und die Jails starten:
#
mount -a
#
/etc/rc.d/jail start
Nutzen Sie jls(8) um zu prüfen, ob die Jails
korrekt gestartet wurden. Vergessen Sie nicht, innerhalb jeder
Jail mergemaster
laufen zu lassen. Die
Konfigurationsdateien müssen (ebenso wie die
rc.d-Skripten) aktualisiert werden.
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>.