Benutzer-Werkzeuge

Webseiten-Werkzeuge


freebsd:jail

Jail

Quick&Dirty

so kann das Skript einfach genutzt werden:

> jail-classic_quick_and_dirty.sh testjail 10.10.10.10
jail-classic_quick_and_dirty.sh
#!/bin/sh
 
################################################################################
# https://docs.freebsd.org/de/books/handbook/book/index.html#jails-ezjail
#
# 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.
################################################################################
 
if [ x == "x${2}" ] ; then
	echo "${0} [Jail-Name] [Jail-IP]"
	echo "${0} testjail 192.168.10.10"
	echo "${0} testjail 10.10.10.10"
	exit 1
fi
 
JAIL_NAME="${1}"
JAIL_IP="${2}"
echo "
JAIL_NAME: ${JAIL_NAME}
JAIL_IP: ${JAIL_IP}
"
 
JAIL_DIR="/usr/jails"
 
JAIL_CMD="$(which ezjail-admin)"
if [ x == "x${JAIL_CMD}" ] ; then
	echo "... ggf. muß ezjail vorher noch installiert werden:"
	echo "> cd /usr/ports/sysutils/ezjail && make clean install clean"
	echo "> ezjail-admin update -b"
	exit 1
fi
 
JLS_NAME="$(jls name | grep -E "^${JAIL_NAME}$")"
if [ x != "x${JLS_NAME}" ] ; then
	echo "Eine Jail mit diesem Namen läuft bereits."
	echo "so kannst Du sie betreten:"
	echo "> ezjail-admin console ${JAIL_NAME}"
	exit 1
fi
 
IFCONFIG_IP="$(ifconfig -a | grep -F "inet ${JAIL_IP} netmask")"
if [ x != "x${IFCONFIG_IP}" ] ; then
	echo "Die IP existiert schon."
	exit 1
fi
 
HOST_BASIS_RELEASE="$(uname -r | sed 's/[-]p.*//')"
echo "OS-Release: ${HOST_BASIS_RELEASE}"
 
### die neue Jail bauen
# "lo1" sollte schon eingerichtet sein:
# > echo 'cloned_interfaces="lo1"' >> /etc/rc.conf
# > service netif cloneup
# Created clone interfaces: lo1.
#
#ezjail-admin create ${JAIL_NAME} "lo1|127.0.1.1,${NIC_ALIAS}|${JAIL_IP}"
#
NIC_ALIAS="$(cat /etc/rc.conf | grep -E 'ifconfig_[a-z0-9]+="inet ' | grep -Fv bridge | head -n1 | awk -F'=' '{print $1}' | awk -F'_' '{print $2}')"
ifconfig ${NIC_ALIAS} alias ${JAIL_IP}/32
ezjail-admin create ${JAIL_NAME} ${JAIL_IP}
#
cp /etc/resolv.conf /etc/localtime /etc/make.conf "${JAIL_DIR}/${JAIL_NAME}"/etc/
ls -lha "${JAIL_DIR}/${JAIL_NAME}"/etc/resolv.conf "${JAIL_DIR}/${JAIL_NAME}"/etc/localtime "${JAIL_DIR}/${JAIL_NAME}"/etc/make.conf
jls
 
### die neue Jail starten
ezjail-admin start ${JAIL_NAME}
 
echo "
Um diese Jail nach dem nächsten reboot erneut
starten zu können, ist das folgende Kommando nötig.
Allerdings ist die Nummer von 'alias0'
entsprechend richtig zu setzen:
> echo 'ifconfig_${NIC_ALIAS}_alias0="inet ${JAIL_IP}/32"' >> /etc/rc.conf
 
einloggen in die neue Jail:
> ezjail-admin console ${JAIL_NAME}
 
die neue Jail auf den neuesten Stand bringen:
> ezjail-admin update -b \"${JAIL_DIR}/${JAIL_NAME}\" fetch install
 
die neue Jail wieder löschen:
> ezjail-admin stop ${JAIL_NAME}
ggf. von Hand eingerichtete Bind-Mounts entfernen...
> ezjail-admin delete -w ${JAIL_NAME}
> service netif restart
"

Allerdings mit einer Einschränkung.

Die Jail braucht eine IP und diese wird nicht automatisch bootfest konfiguriert!!! Da es sich um eine "Quick&Dirty"-Lösung handelt, die einfach nur mal schnell benutzt werden soll, ist es wohl auch besser so.

Will man die Jail jedoch dauerhaft bzw. länger betreiben, dann kann man das mit einer Zeile in der /etc/rc.conf bootfest machen. Dabei muß allerdings das Beispiel-Kommando entsprechend anpassen:

ifconfig_em0_alias0="inet 10.10.10.10/32"

Die Nummer von alias0 (in diesem Fall die 0, für den aller ersten Alias) muß in der /etc/rc.conf absolut eindeutig sein und darf auf keinen Fall mehrfach für einen Alias vergeben werden!

Allgemeines

Beschränkungen

http://www.admin-magazin.de/Das-Heft/2013/01/Wie-man-Jails-in-FreeBSD-konfiguriert-und-benutzt

Innerhalb einer Jail gibt es aufgrund der Implementierung wichtige Einschränkungen. Remote-Procedure-Calls (RPC) funktionieren im Jail-Betrieb aus Sicherheitsgründen nicht mehr. Daher gibt es keine Möglichkeit, NFS innerhalb einer Jail zu nutzen. Daemon-Prozesse auf dem Host müssen sehr sorgfältig konfiguriert sein, damit es nicht zu Adresskonflikten zwischen Jail und Host kommt. Das Laden oder Entladen von Kernelmodulen ist innerhalb einer Jail genauso unterbunden wie das Erstellen von Device-Nodes. Das Mounten und Unmounten von Dateisystemen ist nicht möglich. Das Modifizieren der Netzwerkkonfiguration, der Netzwerkadressen oder auch der Routing-Tabellen ist verboten. Der Zugriff auf sogenannte Raw-Sockets des Hostsystems ist nicht mehr möglich, aber innerhalb der Jail besteht die Möglichkeit, auf diesen Typ von Sockets zuzugreifen. Ebenso ist es nicht gestattet, Semaphoren des Hostsystems anzusprechen.

Aus den meisten dieser Einschränkungen resultiert bei genauer Betrachtung ein Sicherheitsgewinn im Vergleich zu einer Chroot-Umgebung.

das übliche

alle laufenden Jails anzeigen:

# jls
   JID  IP Address      Hostname                      Path
     1  192.168.0.13    minecraft                     /usr/jails/minecraft
     2  192.168.0.14    jail02                        /usr/jails/jail02
     3  192.168.0.15    jail03                        /usr/jails/jail03

nur die Namen der laufenden Jails anzeigen

# jls name
minecraft
jail02
jail03

in die Jail "minecraft" einloggen

# ezjail-admin console minecraft

die Jail "minecraft" anhalten

# ezjail-admin stop minecraft
Stopping jails: minecraft.

alle laufenden Jails anhalten

# ezjail-admin stop
 ezjailStopping jails: jail03 jail02 minecraft.

liste alle existierenden Jails auf

# ls -lha /usr/jails/
total 85
drwxr-xr-x  10 root  wheel    10B 22 Aug.  2016 .
drwxr-xr-x  17 root  wheel    17B 15 Juni  2017 ..
drwxr-xr-x   9 root  wheel     9B 23 Feb.  2015 basejail
drwxr-xr-x  12 root  wheel    24B 25 Jan.  2016 minecraft
drwxr-xr-x   3 root  wheel    24B 23 Feb.  2015 jail02
drwxr-xr-x  12 root  wheel    24B  8 Feb.  2016 jail03

alle Jails wieder starten

# ezjail-admin start
 ezjailStarting jails: minecraft jail02 jail03.

Jail-Paket installieren

Paket installieren:

> pkg install sysutils/ezjail

neuerdings ist jetzt auch noch das hier nötig - hiermit wird die "Jail-Welt" kompiliert → es wird das Verzeichnis /usr/jails/ angelegt (das wurde früher bereits bei der Installation des Paketes gemacht):

> ezjail-admin update -b
...
/usr/jails/basejail/usr/lib32/libprivateldns.so
146598 blocks
Note: a non-standard /etc/make.conf was copied to the template jail in order to get the ports collection running inside jails.

> ls -lha /usr/jails/
total 27
drwxr-xr-x   5 root  wheel     5B 27 Mai  01:35 .
drwxr-xr-x  19 root  wheel    19B 26 Mai  19:50 ..
drwxr-xr-x   9 root  wheel     9B 27 Mai  01:35 basejail
drwxr-xr-x   3 root  wheel     3B 27 Mai  01:35 flavours
drwxr-xr-x  13 root  wheel    23B 27 Mai  01:35 newjail
> vi /etc/rc.conf
...
ifconfig_sk0_alias0="inet alias 192.168.2.100/32"
...
syslogd_flags="-ss"
ezjail_enable="YES"
#ifconfig_sk0_alias0="10.0.0.1/32"
#pf_enable="YES"

Ports-Tree für die Jail's kopieren:

> mkdir /usr/jails/basejail/usr/ports
> cp -a /usr/ports/ /usr/jails/basejail/usr/ports/

Jail bauen

die IP für die neue Jail hoch fahren:

> ifconfig sk0 alias 192.168.2.100/32

eine Jail bauen:

> ezjail-admin create minecraft 192.168.2.100

die Jail starten:

> service ezjail start minecraft

oder

> ezjail-admin console -f minecraft

jls - Jails anzeigen
jexec - Verbindung mit einer laufenden Jail / Starten eines Befehls / Programme Ausfuehren

nachsehen, ob die Jail läuft:

> jls                                  
   JID  IP Address      Hostname                      Path
     2  192.168.2.100   minecraft                     /usr/jails/minecraft

> ezjail-admin list
STA JID  IP              Hostname                       Root Directory
--- ---- --------------- ------------------------------ ------------------------
DR  2    192.168.2.100   minecraft                      /usr/jails/minecraft

sehen ob sie Netzwerk-Ports geöffnet hat:

> netstat -4anp tcp | fgrep 192.168.2.100

in Jail einloggen

in die Jail "minecraft" einloggen:

> ezjail-admin console minecraft

Jail konfigurieren

in die Jail einloggen:

> ezjail-admin console minecraft

Zeitzone einstellen:

> rm -f /etc/localtime; ln -s /usr/share/zoneinfo/MET /etc/localtime

in der Jail muss als erstes das GateWay eingetragen werden, sonst kann man keine Pakete aus dem Internet installieren (es ist auch eine gute Idee SSH zu aktivieren):

> vi /etc/rc.conf
hostname="minecraft.lan"                                # FQDN !!!
defaultrouter="192.168.2.1"
sshd_enable="YES"

ohne NameServer (DNS) geht nichts:

> vi /etc/resolv.conf
search lan.de
nameserver 192.168.2.1

aus der Jail wieder ausloggen:

> exit

den Hostnamen anpassen, hier fehlt ggf. die Domain:

> vi /usr/local/etc/ezjail/minecraft
...
export jail_minecraft_hostname="minecraft"
...

die Jail neu starten:

> ezjail-admin stop minecraft
> ezjail-admin start minecraft

alle Jails neu starten:

> service ezjail stop
> service ezjail start

in die Jail einloggen:

> ezjail-admin console minecraft

… und die BASH installieren:

> pkg install -y shells/bash-static
> bash ; exit

make-Optionen ⇒ kein X11 und optimieren für AMD K8 (siehe man make.conf und /usr/share/examples/etc/make.conf):

> vi /etc/make.conf
/etc/make.conf
WITHOUT_X11=yes
NO_X=yes
OPTIONS_UNSET=X11
CPUTYPE=k8
DOC_LANG=de_DE.UTF-8

… diese Paket braucht man fast immer:

> pkg install misc/mc sysutils/screen misc/gnu-watch archivers/unzip ftp/wget converters/base64 net/bmon net-mgmt/iftop editors/vim

für die, die es wohl nie lernen werden…

> pkg install editors/nano

Web-Server installieren:

> pkg install www/apache24

PHP installieren:

> pkg install lang/php56 www/mod_php56 ftp/php56-curl textproc/php56-xml converters/php56-mbstring devel/php56-json textproc/php56-simplexml textproc/php56-dom

Java installieren:

> pkg install java/openjdk8-jre

VNC-Server installieren:

> pkg install  net/tightvnc
Anzahl der CPU-Kerne
/usr/local/etc/ezjail/minecraft
...
export jail_minecraft_cpuset="1"
...
VNC-Server
> pkg install net/vnc x11/xorg x11-wm/icewm x11/xterm

> vi ~/.vnc/xstartup
#!/bin/sh
xrdb $HOME/.Xresources &
/usr/local/bin/icewm-session &
/usr/local/bin/xterm

> chmod 0755 ~/.vnc/xstartup
> vncserver -depth 24 -geometry 640x480 -nolisten tcp :1

mehrere Jail's

eine bestimmte Jail starten:

> service ezjail start minecraft

eine bestimmte Jail stoppen:

> service ezjail stop minecraft

alle Jails aktualisieren (Update)

alle Jails auf die aktuelle Version das Host-Systems aktualisieren:

> ezjail-admin stop
> rm -fr /usr/jails/basejail/usr/src/*
> cp -a /usr/src/ /usr/jails/basejail/usr/src/
> ezjail-admin update -p -u

so kann man in allen Jails gleichzeitig die Ports-Trees aktualisieren ohne die Jails zu stoppen:

> ezjail-admin update -P

die Jail-Umgebung neu kompilieren:

> ezjail-admin update -b

Fernzugriff

gewöhnlich geht das per SSH (Putty):

> ssh fritz@192.168.2.100

es geht aber auch grafisch mit VNC

Jail löschen

Jail "minecraft" anhalten:

> ezjail-admin stop minecraft

Jail "minecraft" löschen

> ezjail-admin delete -f minecraft
> rm -R /usr/jails/minecraft
> rm /usr/local/etc/ezjail/minecraft

oder so werden die Verzeichnisse auch gelöscht:

> ezjail-admin delete -w minecraft

zum Schluß kann man dann die IP der Jail auch aus der Konfigurationsdatei und der NIC entfernen:

> vi /etc/rc.conf
> ifconfig sk0 inet 192.168.2.100 -alias

Beispiel: Test-Jail anlegen

# Das Jail-Paket installieren:
# > cd /usr/ports/sysutils/ezjail
# > make clean
# > make config-recursive
# > make
# > make deinstall
# > make install
# > pkg info -ao | grep -Fi jail
# > make clean
#
# Die Jail-Umgebung kompilieren:
# > ezjail-admin update -b
#
# Den aktuell verwendeten Ports-Tree in die Jail-Umgebung kopieren:
# > mkdir /usr/jails/basejail/usr/ports
# > cp -a /usr/ports/ /usr/jails/basejail/usr/ports/
#
# Eine Jail einrichten:
# > ifconfig em0 alias 192.168.1.2/32
# > ezjail-admin create testjail 192.168.1.2
#
# Ein paar Einstellungen in der Jail vornehmen:
# > cat /etc/make.conf > /usr/jails/testjail/etc/make.conf
# > vi /usr/jails/testjail/etc/rc.conf
#   hostname="erde.fritz.box"
#   defaultrouter="192.168.1.254"
#   sshd_enable="YES"
# > vi /usr/jails/testjail/etc/resolv.conf
#   search fritz.box
#   nameserver 192.168.1.4
# > tar cf - /home/bin /home/sbin /home/etc | tar xf - -C /usr/jails/testjail/
# > chown -R 0:0 /usr/jails/testjail/home/
# > ls -lha /usr/jails/testjail/home/
#
# Jail starten
# > service ezjail start testjail
# > jls
# > netstat -4anp tcp | fgrep 192.168.1.2
#
# In die Jail einloggen und einige Kommandos ausführen:
# > ezjail-admin console testjail
#   > rm -f /etc/localtime
#   > ln -s /usr/share/zoneinfo/MET /etc/localtime
#   > exit
 
# > ezjail-admin console testjail
#   > cd /usr/ports/shells/bash-static
#   > make clean
#   > make
#   > make install
#   > make clean
#   > cd /usr/ports/sysutils/screen
#   > make clean
#   > make
#   > make install
#   > make clean
#   > screen -mdS Pakete /root/bin/Update_-_FreeBSD_-_alle_Pakete_aus_dem_Ports-Tree.sh
#   > exit
#
# Jail wieder runter fahren:
# > service ezjail stop testjail
/home/http/wiki/data/pages/freebsd/jail.txt · Zuletzt geändert: von manfred