Teamspeak-Server in ein Chroot verbannen

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.

Quelle

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 ;) ):

CODE:
  1. mkdir etc
  2. mkdir dev
  3. mkdir lib
  4. mkdir tmp
  5. mkdir -p usr/lib/gconv
  6. mkdir usr/lib/locale
  7. mkdir -p var/run
  8. cp /etc/group etc
  9. cp /etc/ld.so.conf etc
  10. cp /etc/localtime etc
  11. cp /etc/passwd etc
  12. cp /lib/ld-linux.so.2 lib
  13. cp /lib/libc.so.6 lib
  14. cp /lib/libdl.so.2 lib
  15. cp /lib/libncurses.so.5 lib
  16. cp /lib/libpthread.so.0 lib
  17. cp /usr/lib/gconv/ISO8859-15.so usr/lib/gconv
  18. cp /usr/lib/gconv/gconv-modules usr/lib/gconv
  19. cp /usr/lib/locale/locale-archive usr/lib/locale/

Nun muss die etc/passwd sowie die etc/groups editiert und alle Zeilen bis auf den root und den TS-User/TS-Gruppe entfernt werden.

Teamspeak braucht leider ein /dev/null, ohne das produziert es einen Haufen Fehler, daher machen wir mal eben eins:

CODE:
  1. cd /home/ts-chroot/dev/
  2. mknod null c 1 3
  3. chmod 0666 null

Den Teamspeak-Server selbst muss man dann in ein Verzeichnis im Chroot kopieren, also z.B. in /home/ts-chroot/home/ts2/

Nun braucht man noch ein Script zum Starten des Server, für Debian Sarge habe ich es aus einem Forenbeitrag im Teamspeakforum kopiert:

CODE:
  1. #! /bin/sh
  2. #
  3. # tss2    init script for TeamSpeak 2 Server
  4. #
  5. #      Written by Alexander Skwar <askwar @email-server.info>.
  6. #       Modified slightly by Andrew Myers.
  7. #
  8.  
  9. # Modify the next 3 lines
  10. CHROOT_DIR=/home/ts-chroot/
  11. EXECDIR=/home/ts2
  12. USER=tss2
  13. GROUP=tss2
  14.  
  15. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:${CHROOT_DIR}
  16. EXEC=${EXECDIR}/server_linux
  17. DAEMON=${CHROOT_DIR}${EXEC}
  18. NAME=tss2
  19. DESC="TeamSpeak 2 Server"
  20. PIDFILE=${EXECDIR}/$NAME.pid
  21. test -x $DAEMON || exit 0
  22.  
  23. set -e
  24.  
  25. case "$1" in
  26.   start)
  27.     echo "Starting $DESC: $NAME"
  28.     start-stop-daemon --start --quiet --pidfile $PIDFILE \
  29.         --chuid $USER:$GROUP \
  30.         --chroot ${CHROOT_DIR} \
  31.         --startas $EXEC \
  32.         --exec $DAEMON \
  33.         -- \
  34.         -ini=${EXECDIR}/server.ini \
  35.         -pid=$PIDFILE \
  36.         -httpdocs=${EXECDIR}/httpdocs \
  37.         -log=${EXECDIR}/server.log
  38.     echo "."
  39.     ;;
  40.   stop)
  41.     echo -n "Stopping $DESC: $NAME "
  42.     start-stop-daemon --stop --quiet --pidfile ${CHROOT_DIR}$PIDFILE \
  43.         --exec $DAEMON
  44.     echo "."
  45.     ;;
  46.   #reload)
  47.     #
  48.     #   If the daemon can reload its config files on the fly
  49.     #   for example by sending it SIGHUP, do it here.
  50.     #
  51.     #   If the daemon responds to changes in its config file
  52.     #   directly anyway, make this a do-nothing entry.
  53.     #
  54.     # echo -n "Reloading $DESC configuration..."
  55.     # start-stop-daemon --stop --signal 1 --quiet --pidfile \
  56.     #   /var/run/$NAME.pid --exec $DAEMON
  57.     # echo "done."
  58.   #;;
  59.   restart|force-reload)
  60.     #
  61.     #   If the "reload" option is implemented, move the "force-reload"
  62.     #   option to the "reload" entry above. If not, "force-reload" is
  63.     #   just the same as "restart".
  64.     #
  65.     echo "Restarting $DESC: $NAME"
  66.     start-stop-daemon --stop --quiet --pidfile ${CHROOT_DIR}$PIDFILE \
  67.         --exec $DAEMON
  68.     sleep 1
  69.     start-stop-daemon --start --quiet --pidfile $PIDFILE \
  70.         --chuid $USER:$GROUP \
  71.         --chroot ${CHROOT_DIR} \
  72.         --startas $EXEC \
  73.         --exec $DAEMON \
  74.         -- \
  75.         -ini=${EXECDIR}/server.ini \
  76.         -pid=$PIDFILE \
  77.         -httpdocs=${EXECDIR}/httpdocs \
  78.         -log=${EXECDIR}/server.log
  79.     echo "."
  80.     ;;
  81.   *)
  82.     N=/etc/init.d/$NAME
  83.     # echo "Usage: $N {start|stop|restart|reload|force-reload}">&2
  84.     echo "Usage: $N {start|stop|restart|force-reload}">&2
  85.     exit 1
  86.     ;;
  87. esac
  88.  
  89. exit 0

Das ganze kann man nun als /etc/init.d/teamspeak ablegen und mittels update-rc.d teamspeak defaults automatisch bei Systemstart ausführen lassen.

Das wars!

4 Antworten zu “Teamspeak-Server in ein Chroot verbannen”


  • Hi,
    der Artikel ist zwar schon alt, aber ich versuche gerade verzweifelt eine TSS2 im chroot laufen zu lassen unter Debian mit dem Kernel 2.6.18-5-486.

    Als ersters hatte ich Probleme mit deinem Startskript:

    “MeinServer:/home/TSServer/home/tss2# /etc/init.d/ChailTSS2 start
    Starting TeamSpeak 2 Server: ts
    start-stop-daemon: stat /home/TSServer//home/TSServer/home/tss2/server_linux: No such file or directory (No such file or directory)”

    Wenn ich dann die Variable: –exec $DAEMON gegen –exec $EXEC austausche bekomme ich dann einen anderen Fehler:

    “Runtime error 234 at 0804CE2F”

    Hast du eine Idee wie ich das Problem lösen kann. LDD sagt mir auch keine anderen Lib-Files als wie du es oben beschrieben hast. Wäre Cool wenn du da noch eine Idee hättest.

    Vielen Dank im vorraus
    York

  • Hoi,
    ich würde mich zunächst durch das TeamspeakForum suchen. Leider habe ich kein Debian mehr zur Verfügung, weshalb ich nicht testen kann, wie es funktionieren könnte.

    Hast du glibc-locale installiert? :)

    Ansonsten probier folgendes:

    Editier Dein teamspeak2-server_startscript und füg das hier:

    export GCONV_PATH=”/usr/lib/gconv/”

    nach:

    PATH

    ein

  • @ York Keyser
    geht es bei dir jetzt? Denn ich würde auch gerne TS unter einem Chroot laufen lassen

  • danke genau das habe ich gesucht danke..

Eine Antwort hinterlassen

XHTML: Du kannst folgende Elemente benutzen <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> :