Nicht immer ist man davon überzeugt das es klug ist ein Programm auf seinem Server zu installieren. Oft genug weis man um die Schwachstellen der Programme, kann sie aber nicht umgehen. Unter BSD gib es für solche fälle ein System womit man User hinter virtuellen Gittern wegsperren kann. Das jail genannte System ist der Mittelweg zwischen einem Virtuellen PC und einer chroot Umgebung. Eine jail kann ein einzelnes Programm oder ein ganzes System beinhalten. Ich werde hier nur auf den Fall des ganzen Systems eingehen, abspecken kann man das ganze dann ja relativ einfach über Try und Error
Ich gehe hier von folgendem Grundsystem aus:
- lauffähiges FreeBSD 5.2.1
- Ports und Systemsourcen sind installiert
- Mehrere IP Adressen sind auf dem System Konfiguriert
- mindestens eine IP Adresse wird nicht von anderen Diensten verwendet
Was soll erreicht werden ? (Szenario)
Ein virtuelles System mit einem eigenem root Zugang, so das ein Kunde "sein" System selbst konfigurieren kann, aber nicht das Hauptsystem kompromittiert. Der Kunde installiert dann z.b. einen IRC Bouncer in die jail. Außer dem IRC Bouncer und einem SSH Zugang soll das System zunächst keine weiteren Netzwerk Dienste anbieten.
Die man Page von jail beschreibt das installieren und Starten einer jail sehr gut, so das sich das lesen der man Page auf jeden Fall lohnt. Das Script aus der man Page zum anlegen einer jail habe ich ein wenig abgeändert (make_jail.sh):
#!/bin/shD=/usr/home/jail/$1
cd /usr/src
mkdir -p $D
make world DESTDIR=$D
cd etc
make distribution DESTDIR=$D
cd $D
ln -sf dev/null kernel
Das Script wird mit dem Parameter für den Namen der Jail gestartet und legt die jail komplett an.
Z.B. "./make_jail.sh IRC"
Ich lasse die jails alle in dem Verzeichnis /usr/home/jail erstellen. Das kann aber beliebig geändert werden, je nach gefallen. Es sollte nur genügend Platz auf dem Laufwerk für die jail sein. Ein leeres jail belegt ca. 135 MB Speicher. Ja nach dem was man alles in die jail reinpackt, kann das aber sehr schnell auch ein paar GB erreichen.
Da ein komplettes System installiert wird muss natürlich auch eine komplette Konfiguration für die jail gemacht werden. Eine jail wie diese durchläuft den ganz normalen Boot Prozess und braucht daher auch die entsprechenden Scripte. Die Konfiguration der jail wird in 3 Schritten erfolgen. Den ersten Teil davon machen wir während die jail noch nicht gestartet ist, die zwei anderen wenn die jail läuft. Zuerst aber die "Grundlegenden" dinge. Innerhalb des jail Verzeichnisses legen wir in dem Verzeichnis /etc eine rc.conf an, mit folgendem Inhalt:
rpcbind_enable="NO"
network_interfaces=""
sshd_enable="YES"
syslogd_flags="-ss"
Damit schalten wir Sendmail aus und SSH ein. Sollte im Hauptsystem SSH (noch) so konfiguriert sein, das der Daemon auf alle IP Adressen hört, so kann man in der jail in der Datei /etc/ssh/sshd_config mit dem Parameter "Port" den SSH Daemon in der jail auf einen anderen Port legen.
Um Fehlermeldungen zu vermeiden sollte man eine leere /etc/fstab Datei anlegen. Die Datei /etc/resolv.conf sollte auch so angepasst werden das eine Namensauflösung möglich ist. Die Zeitzone setzen wir indem wir in dem etc Verzeichnis der jail einen Link auf das entsprechende Zonefile anlegen.
Damit ist die Konfiguration außerhalb der jail erledigt. Den Rest machen wir innerhalb der jail. Zuerst starten wir die jail nur mit einer Shell, Booten sie aber noch nicht. Das Passiert mit der Befehlszeile :
- "/usr/home/jail/IRC" ist dabei das Verzeichnis in dem wir die jail angelegt haben.
- "IRCClient" ist der Hostname der jail
- "62.112.147.182" ist die IP die der jail zugeordnet ist.
In diesem Schritt legen wir zuerst einen User an, damit man sich per SSH anmelden kann. Ich nenne den User hier mal "kunde". Dem root User sollte man per passwd natürlich auch noch ein Passwort setzten
Widmen wir uns jetzt dem Starten der jail. Wie unter FreeBSD üblich wird das über die Datei /etc/rc.conf gesteuert. Für uner Beispiel fügen wir folgenden Code ein:
jail_enable="YES"jail_set_hostname_allow="NO"
jail_socket_unixiproute_only="YES"
jail_sysvipc_allow="NO"
jail_stop_jailer="NO"
jail_list="IRC"
jail_IRC_rootdir="/usr/home/jail/IRC"
jail_IRC_hostname="chat.waringer-atg.de"
jail_IRC_ip="62.112.147.182"
jail_IRC_exec="/bin/sh /etc/rc"
jail_IRC_devfs_enable="YES"
jail_IRC_devfs_ruleset="devfsrules_jail"
jail_IRC_fdescfs_enable="NO"
jail_IRC_procfs_enable="YES"
Im ersten Teil wird das jail System generell Eingeschalten und so Konfiguriert das eine Hohe Sicherheit gegeben ist. Die 4 Optionen nach jail_enable dienen dem absichern des jail Systems. Diese sollten nur dann umgestellt werden wenn es sein muss und man sich darüber Informiert hat was das für Auswirkungen hat. Der Eintrag jail_list ist die Liste der jail Systeme die beim Booten gestartet werden sollen. Ich habe die jail mit IRC benannt.
Der zweite Teil konfiguriert die jail IRC. Die meisten Einträge sind selbsterklärend. Etwas Erklärung bedarf es der devfs Einträge. Über das devfs können Programme auf die Hardware Geräte zugreifen, das dev steht für das Englische Wort Device und heißt Gerät, Baustein, etc. Das fs steht für Filesystem also Dateisystem. Nun wird über das devfs nicht nur "reale" Hardware angesprochen wie Festplatte und Monitor sondern auch Virtuelle wie das Berühmte /dev/null (der nie Vollwerdende Mülleimer) und auch die Virtuellen Monitore die für SSH verwendet werden (pty*) sind hier zu finden. Das devfs ist in einer jail also oft notwendig. Einen kompletten Zugriff auf die Festplatte möchte man aber ganz sicher nicht geben, sonst könnte man sich die Arbeit ja auch sparen. Daher schränkt man über den Eintrag jail_IRC_devfs_ruleset ein, was innerhalb der jail an Devices zu sehen ist. Die Rule "devfsrules_jail" ist vordefiniert und erlaubt nur unkritische Einträge. Sollte bedarf an mehr Devices bestehen sollte man sich per "man devfs" näher mit der Materie befassen.
Die jail ist nun soweit aufgesetzt das sie gestartet werden kann. Über das rc Script /etc/rc.d/jail kann man die jails starten und wieder stoppen. Damit fängt eigentlich der Kundenteil an. Das installieren der Programme die der Kunde braucht oder haben will. Am einfachsten setzt man innerhalb der Jail einen eigenen Porttree auf. Dann kann der Kunde die benötigten Programme selbst installieren.
Damit lasse ich es für dieses mal wieder enden. Ich hoffe das auch diesmal wieder das eine oder andere für euch dabei war.

