Heute habe ich einen Teamspeak-Server in ein Chroot verbannt, weshalb ich hier kurz schildern möchte, wie ich das gemacht habe. Doch zunächst: Was ist ein Chroot?
chroot steht für “change root” und ist eine Funktion auf Unix-Systemen um das Rootverzeichnis zu ändern. Sie wirkt sich nur auf den aktuellen Prozess und seine Kindprozesse aus. “chroot” selbst kann sich auf den Systemaufruf chroot(2) als auch das Dienstprogramm chroot(8) beziehen.
Ein Programm das auf ein Verzeichnis re-rooted wurde, kann nicht mehr auf Dateien außerhalb dieses Verzeichnisses zugreifen. Chrooting bietet somit eine einfache Möglichkeit, nicht vertrauenswürdige, Test- oder sonstwie gefährliche Programme in eine Sandbox zu versetzen.
Ich habe mich dabei an das Tutorial aus dem Teamspeak-Forum gehalten, welches ich hier in erweiterter und übersetzter Form veröffentlichen möchte:
Zunächst muss man sich ein Verzeichnis schaffen, in dem das Chroot ausgebaut werden soll, also z.B. /home/ts-chroot/. Darin werden die benötigten System-Verzeichnisse erstellt (der TS-Server soll ja nicht merken, dass er nicht mehr im richtigen System ist ;) )Anschließend muss man ein paar Libraries, die Teamspeak braucht ins Chroot kopieren (übrigens kann man mit einem Klick auf “PLAIN TEXT” das ganze einfacher kopieren ;) ):
#! /bin/sh
## tss2 init script for TeamSpeak 2 Server## Written by Alexander Skwar <askwar @email-server.info>.# Modified slightly by Andrew Myers.## Modify the next 3 linesCHROOT_DIR=/home/ts-chroot/
EXECDIR=/home/ts2
USER=tss2
GROUP=tss2
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:${CHROOT_DIR}EXEC=${EXECDIR}/server_linux
DAEMON=${CHROOT_DIR}${EXEC}NAME=tss2
DESC="TeamSpeak 2 Server"PIDFILE=${EXECDIR}/$NAME.pid
test -x $DAEMON||exit0set -e
case"$1" in
start)echo"Starting $DESC: $NAME" start-stop-daemon --start --quiet --pidfile $PIDFILE\
--chuid $USER:$GROUP\
--chroot ${CHROOT_DIR}\
--startas $EXEC\
--exec $DAEMON\
-- \
-ini=${EXECDIR}/server.ini \
-pid=$PIDFILE\
-httpdocs=${EXECDIR}/httpdocs \
-log=${EXECDIR}/server.log
echo".";; stop)echo -n "Stopping $DESC: $NAME " start-stop-daemon --stop --quiet --pidfile ${CHROOT_DIR}$PIDFILE\
--exec $DAEMONecho".";;#reload)## If the daemon can reload its config files on the fly# for example by sending it SIGHUP, do it here.## If the daemon responds to changes in its config file# directly anyway, make this a do-nothing entry.## echo -n "Reloading $DESC configuration..."# start-stop-daemon --stop --signal 1 --quiet --pidfile \# /var/run/$NAME.pid --exec $DAEMON# echo "done."#;; restart|force-reload)## If the "reload" option is implemented, move the "force-reload"# option to the "reload" entry above. If not, "force-reload" is# just the same as "restart".#echo"Restarting $DESC: $NAME" start-stop-daemon --stop --quiet --pidfile ${CHROOT_DIR}$PIDFILE\
--exec $DAEMON sleep 1 start-stop-daemon --start --quiet --pidfile $PIDFILE\
--chuid $USER:$GROUP\
--chroot ${CHROOT_DIR}\
--startas $EXEC\
--exec $DAEMON\
-- \
-ini=${EXECDIR}/server.ini \
-pid=$PIDFILE\
-httpdocs=${EXECDIR}/httpdocs \
-log=${EXECDIR}/server.log
echo".";; *)N=/etc/init.d/$NAME# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2echo"Usage: $N {start|stop|restart|force-reload}" >&2exit1;;esacexit0
Das ganze kann man nun als /etc/init.d/teamspeak ablegen und mittels update-rc.d teamspeak defaults automatisch bei Systemstart ausführen lassen.