Das Konzept der Jails unter FreeBSD ist nicht allein ein Sicherheitskonzept, sondern es stellt auch eine kleine Virtualisierungslösung dar. Dadurch bekommen nicht nur Administratoren in Rechenzentren ein mächtiges Werkzeug an die Hand. Auch Internet-Providern bietet sich hier die Chance, ihren Kunden Root-Shells zur Verfügung zu stellen und diese nutzen zu lassen. Die Sicherheit ist dabei bedingt durch das Konzept in vollem Umfang gewährleistet.
Den Administratoren eines Heimnetzwerks bieten die Jails ebenfalls einen erheblichen Sicherheitsgewinn. Besonders, wenn sie nicht nur einen kleinen DNS-Dienst einsperren, sondern beispielsweise einen Webbrowser in einer Jail installieren. Alles in allem zeigt sich: Die Jails unter FreeBSD sind ein echtes Highlight und zugleich sehr vielseitig einsetzbar. (jcb)
Tools zur Verwaltung von Jails
Um die Verwaltung von Jails vom Hostsystem aus zu ermöglichen, gibt es ein paar Tools, die kurz beschrieben werden. jail [-i] [-l -u <Username> | -U <Username>] <Pfad> <Hostname> <IP-Adresse> <Kommando>: Startet eine Jail im angegebenen Pfad, mit der IP-Adresse und dem Kommando. Falls die Option -l gesetzt ist, wird vor dem Start das Environment auf Standardwerte gesetzt. Das angegebene Kommando wird dabei mit den User-Rechten des Hostsystems (-u) oder mit den Rechten des Users innerhalb der Jail (-U) ausgeführt. jexec [-u <Username> | -U <Username>] <JID> <Kommando> <Parameter zum Kommando>: Führt ein Kommando mit den Parametern innerhalb einer Jail aus. Dabei startet es mit den User-Rechten des Hostsystems (-u) oder mit den Rechten des Users innerhalb der Jail (-U). Zur eindeutigen Identifizierung der Jail ist auch hier wieder die JID anzugeben. jls: Erzeugt eine Liste aller im Moment gestarteten Jails. Es werden dabei die Identifizierungsnummer der Jail (JID), IP-Adresse, Hostname und Pfad zur Jail ausgegeben. Die JID ist eine fortlaufende Nummer, unter der die Jail eindeutig identifiziert wird. Die JID ist für killall wichtig. killall -j <JID> -<Signal> <Prozessname>: Damit wird an einen Prozess innerhalb einer Jail ein Signal gesendet. Wenn kein Prozessname und Signal angegeben ist, dann wird die ganze Jail beendet. "Signal" bezeichnet die in UNIX üblichen Signale wie SIGTERM, SIGKILL et cetera.
1/1 A
210 x 297 mm zzgl. Beschnitt
LM
Regeln für die Paketfilter PF und IPFW
Damit Routing-fähige Jails auch von außen erreichbar sind, müssen entsprechende Regeln für PF und IPFW [9] geschrieben werden. Zunächst zu PF, dem Paketfilter, der von OpenBSD portiert wurde.
# NAT-Regeln fuer PF # ================= extif = "<I>Internet-Interface<I>" intif = "<I>Intranet-Interface<I>" nat_jail = "<I>Jail-IP-Adresse<I>" nat on $extif from $intif:network to any -> ($extif) rdr on $extif proto tcp from any to any port <I>Port<I> -> $nat_jail pass in on $extif inet proto tcp from any to $nat_jail port <I>Port<I>
Zunächst wird festgelegt, auf welchem Netzwerk-Interface (»$extif
«
) der Datenstrom belauscht werden soll. Anschließend leitet PF alle TCP-Daten, die über das externe Interface an Port »Port
«
gesandt werden, an die IP-Adresse der Jail (»$nat_jail
«
) um. Damit die Daten auch ungehindert durch den Paketfilter fließen, wird mit »pass
«
ein Kanal freigeschaltet.
Bei IPFW ist die Sache umfangreicher. Es müssen das IPFW-Skript und NAT-Regeln für den NAT-Daemon erstellt werden. Die Regeln für den NAT-Daemon (»natd
«
):
# NAT-Regeln fuer natd # /etc/natd.conf # ================= redirect_port tcp <Jail-IP>:<Port 1> <Port 1> redirect_port tcp <Jail-IP>:<Port 2> <Port 2>
Damit IPFW im System verfügbar ist, müssen diverse Optionen im Kernel aktiviert sein. Dazu ist es ratsam, sich die einschlägige Literatur wie beispielsweise das sehr gute Handbuch durchzulesen. Damit alles lesbarer ist, setzt man eine Variable: »fwcmd="/sbin/ipfw -f"
«
Dann muss auch hier wieder der Datenverkehr, der über das Interface tun0 führt, für den NAT-Daemon zugänglich gemacht werden. Die folgende Regel sollte eine der ersten Angaben im Skript sein:
${fwcmd} add divert natd all from any to any via tun0
Damit keiner über den umgeleiteten Datenstrom Schaden anrichten kann, folgt eine weitere Regel:
${fwcmd} add allow tcp from any to any <Port> setup keep-state @KL: Die letzte Regel sollte immer sein: ${fwcmd} add deny ip from any to any
Nach dem Einlesen des Konfiguration bei PF oder dem Ausführen des Skripts für IPFW werden die Regeln aktiv. Zu jeweiligen Konfiguration sei dringend auch die Dokumentation zu Tools empfohlen.
Wichtige Flags für Jails
Wichtige Flags für Jails
Für Jails gibt es sechs MIBs (Management Information Base), die nur vom Hostsystem aus geändert werden dürfen, und zwei Parameter lassen sich vom Root-User innerhalb der Jail manipulieren. Die Flags werden mittels »sysctl
«
gesetzt: »sysctl -w $MIB=0 oder sysctl -w $MIB=1. Mit sysctl $MIB
«
lässt sich der aktuelle Status erfragen. Zuerst die MIBs, die vom Hostsystem geändert werden dürfen und sich auf alle Jails gleichermaßen auswirken:
Innerhalb einer Jail dürfen zwei MIBs geändert werden, sofern dies erlaubt wurde!
Bezeichnung der MIB | Erklärung | Standard | Soll |
---|---|---|---|
security.jail.set_hostname_allowed |
Der root-User darf innerhalb einer Jail den Hostnamen mit hostname(1), sethostname(3) oder mit dem MIB kern.hostname ändern.Die Jail nutzt den Hostnamen, um mit dem Hauptsystem in Verbindung zu bleiben. Daher sollte dieser Parameter immer auf "0" gesetzt sein. |
1 |
0 |
security.jail.socket_unixiproute_only |
Diese MIB entscheidet, ob die Kommunikation der Jail über IP kommuniziert, oder über UNIX-Sockets. Letzteres ist als gefährlich einzustufen, da dies ein Loch in das Konzept reißen würde. |
1 |
1 |
security.jail.sysvipc_allowed |
Falls dieses Flag gesetzt ist, ist eine Kommunikation mit Prozesses außerhalb der Jail über mittels System V IPC (Interprocess communication) möglich. Es gibt Datenbanken, die ein gesetztes Flag unbedingt benötigen. Aber Vorsicht! |
0 |
0 |
security.jail.allow_raw_sockets |
Diese MIB erlaubt es, innerhalb einer Jail die sogenannten raw-sockets zu verwenden. Damit ist es unter anderem möglich, Tools wie ping(8) oder traceroute(8) zu verwenden. Es ist aber auch zu berücksichtigen, dass die raw-sockets auch vom Netzwerk-Subsystem verwendet werden! |
0 |
0 |
security.jail.getfsstatroot_only |
Damit lässt sich einstellen, ob User innerhalb einer Jail alle Mount-Points sehen können oder nicht. |
1 |
1 |
security.jail.chflags_allowed |
Diese MIB kontrolliert, ob ein privilegierter User, die File-Flags (chflags(8)) ändern darf, oder nicht. |
0 |
0 |
Bezeichnung des MIBs | Erklärung | Standard | Soll |
---|---|---|---|
kern.hostname |
Falls im Hostsystem security.jail.set_hostname_allowed = 1 ist, dann kann innerhalb der Jail der Jail-Hostname geändert werden. |
1 |
0 |
kern.securelevel |
Die Jail kann ebenso wie der Host mit verschiedenen Securelevels arbeiten. |
-1 |
Infos