Per Namen in eine FreeBSD-Jail wechseln

  

Lass uns lernen, wie man Befehle in einer Jail ausführt, indem man den Jail-Namen anstelle der Jail-Nummer verwendet.

Angenommen, du hast zwei Jails eingerichtet, nämlich „mail“ und „www“. Das erste dient dazu, deinen Mailserver zu betreiben, das zweite, deinen Webserver in einer sicheren Jail-Umgebung laufen zu lassen. Jede Jail hat ihre eigenen Parameter wie Name, Hostname, IP, Rootverzeichnis und so weiter:

jailserver# grep jail /etc/rc.conf
jail_enable="YES"
jail_list="mail www"
jail_mail_name="mail"
jail_mail_hostname="mail.mydomain"
jail_mail_ip="192.168.0.11"
jail_mail_rootdir="/usr/jail/mail"
jail_mail_devfs_enable="YES"
jail_www_name="www"
jail_www_hostname="www.mydomain"
jail_www_ip="192.168.0.12"
jail_www_rootdir="/usr/jail/www"
jail_www_devfs_enable="YES"
jailserver#

Die Jails werden beim Systemstart automatisch gestartet. Wenn du die Jails gerade erst konfiguriert hast, möchtest du sie vielleicht sofort starten, ohne neu zu booten:

jailserver# service jail start
Configuring jails:.
Starting jails: mail.mydomain www.mydomain.
jailserver# jls
   JID  IP Address   Hostname         Path
     1  192.168.0.11 mail.mydomain    /usr/jail/mail
     2  192.168.0.12 www.mydomain     /usr/jail/www
jailserver#

Jetzt laufen zwei Jails, denen die Jail-IDs 1 und 2 zugewiesen wurden. Diese Nummern werden automatisch vergeben. Um in eine Jail zu wechseln, führe einfach eine Shell darin aus:

jailserver# jexec 1 /bin/csh
mail# sysctl security.jail.jailed
security.jail.jailed: 1
mail# exit
jailserver#

Was passiert, wenn du die Jails neu starten musst und wieder in eine davon wechseln willst?

jailserver# service jail restart
Stopping jails: mail.mydomain www.mydomain.
Configuring jails:.
Starting jails: mail.mydomain www.mydomain.
jailserver# jls
   JID  IP Address   Hostname         Path
     3  192.168.0.11 mail.mydomain    /usr/jail/mail
     4  192.168.0.12 www.mydomain     /usr/jail/www
jailserver# jexec 1 /bin/csh
jexec: jail_attach(1): Invalid argument
jailserver#

Ich liebe die Shell-Verlaufsfunktion und nutze sie ziemlich oft. Aber hoppla, nach dem Neustart der Jails sind die JIDs nicht mehr dieselben wie zuvor. Versuchen wir es mal über den Namen.

jailserver# jexec mail /bin/csh
jexec: jail "mail" not found
jailserver#

Warum wird die Jail nicht gefunden? jexec(8) besagt:

Das Dienstprogramm jexec führt einen Befehl innerhalb der Jail aus, die durch ihre JID oder ihren Namen identifiziert wird.

Und wir haben es in rc.conf festgelegt, aber es funktioniert immer noch nicht. Der Grund dafür ist, dass wir den Namen für die Startskripte eingerichtet haben. jexec weiß nichts davon. In jail(8) gibt es eine Option -n, mit der du den Jail-Namen festlegen kannst. Das ist es, wonach jexec sucht. Wir müssen also /etc/rc.conf wie folgt einrichten:

jailserver# grep jail /etc/rc.conf
jail_enable="YES"
jail_list="mail www"
jail_mail_name="mail"
jail_mail_flags="-n mail"
jail_mail_hostname="mail.mydomain"
jail_mail_ip="192.168.0.11"
jail_mail_rootdir="/usr/jail/mail"
jail_mail_devfs_enable="YES"
jail_www_name="www"
jail_www_flags="-n www"
jail_www_hostname="www.mydomain"
jail_www_ip="192.168.0.12"
jail_www_rootdir="/usr/jail/www"
jail_www_devfs_enable="YES"
jailserver#

Starten wir die Jails noch einmal neu und schauen wir, ob es nun wie gewünscht richtig funktioniert:

jailserver# service jail restart
Stopping jails: mail.mydomain www.mydomain.
Configuring jails:.
Starting jails: mail.mydomain www.mydomain.
jailserver# jls
   JID  IP Address   Hostname         Path
     5  192.168.0.11 mail.mydomain    /usr/jail/mail
     6  192.168.0.12 www.mydomain     /usr/jail/www
jailserver# jexec mail /bin/csh
mail# exit
jailserver#

Okay, jetzt können wir den Jail-Namen verwenden, der konstant bleibt, ohne dass wir zuerst die JID nachschlagen müssen.

Abschließender Hinweis: Dies wurde mit FreeBSD 8.2 getestet. jail(8) weist darauf hin, dass die Option -n veraltet ist und die Festlegung des Namens über einen Parameter gleichwertig sein sollte. Ich gehe also davon aus, dass die Option in den nächsten Hauptversionen entfernt wird und der Namensparameter verwendet werden muss. Leider ist es mir nicht gelungen, den Namensparameter zu konfigurieren, daher zeige ich hier nur diese Methode.