Benutzer-Werkzeuge

Webseiten-Werkzeuge


freebsd:jail

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
freebsd:jail [2023-12-12 14:01:58] – [Quick&Dirty] manfredfreebsd:jail [2025-08-10 01:30:45] (aktuell) manfred
Zeile 1: Zeile 1:
 +====== Jail ======
 +
 +[[https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/jails-ezjail.html]]
 +
 +Hier wird beispielhaft eine Jail speziell für einen [[Minecraft]]-Server eingerichtet (deshalb heißt sie nicht "jail01" sondern "minecraft").
 +
 +hilfreiche Links:
 +  * [[https://docs.freebsd.org/de/books/handbook/book/index.html#jails]]
 +  * [[https://docs.freebsd.org/de/books/handbook/book/index.html#jails-ezjail]]
 +  * [[https://www.cyberciti.biz/faq/howto-setup-freebsd-jail-with-ezjail/|How To Setup FreeBSD Jails With ezjail]]
 +  * [[http://scratching.psybermonkey.net/2010/06/freebsd-how-to-setup-configure-jail.html]]
 +  * [[http://bsdstart.com/2014/10/08/freebsd-jails-ezjail.html]]
 +  * [[https://www.freebsdnews.com/2009/11/18/creating-jail-vnc-server-freebsd/]]
 +  * [[https://erdgeist.org/arts/software/ezjail/]]
 +  * [[https://www.freebsd.org/doc/handbook/jails-ezjail.html]]
 +  * [[http://www.cyberciti.biz/faq/howto-setup-freebsd-jail-with-ezjail/]]
 +
 +
 +===== Quick&Dirty =====
 +
 +  * [[https://docs.freebsd.org/de/books/handbook/book/index.html#jails|Kapitel 32. Jails]]
 +  * **[[https://docs.freebsd.org/de/books/handbook/book/index.html#jails-ezjail|32.6. Verwaltung von Jails mit ezjail]]**
 +
 +so kann das Skript einfach genutzt werden:
 +  > jail-classic_quick_and_dirty.sh testjail 10.10.10.10
 +
 +<file bash 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
 +"
 +</file>
 +
 +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 ''alias**0**'' (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
 +        192.168.0.13    minecraft                     /usr/jails/minecraft
 +        192.168.0.14    jail02                        /usr/jails/jail02
 +        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
 +<file>
 +...
 +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"
 +</file>
 +
 +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
 +        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
 +<file bash /etc/make.conf>
 +WITHOUT_X11=yes
 +NO_X=yes
 +OPTIONS_UNSET=X11
 +CPUTYPE=k8
 +DOC_LANG=de_DE.UTF-8
 +</file>
 +
 +... 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 ==
 +
 +<file c /usr/local/etc/ezjail/minecraft>
 +...
 +export jail_minecraft_cpuset="1"
 +...
 +</file>
 +
 +
 +== 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 ====
 +
 +<code bash>
 +# 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
 +</code>
 +