wildlife

Teamspeak 3 – How to Chroot

// December 22nd, 2009 // IT, Tutorials

Viele Dienst sind oft Ziel eines Angriffs. Teamspeak ist einer davon. Gerade bei Diensten, die 24/7 laufen, sollte man entsprechende Sicherheitsmaßnahmen ergreifen, um bei einem erfolgreichen Angriff den Schaden zu minimieren. Dazu empfehle ich, Teamspeak 3 in einer chroot-Umgebung laufen zu lassen.

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. Es ist auch ein einfacher Jail-Mechanismus. (via Wikipedia)

Da der Benutzer direkt nach dem Login in die chroot gesperrt werden soll, verwende ich das Programm chrlogin von Harald Weidner. Der Text dieses Scripts kann einfach in eine Datei kopiert werden (z.B. chrlogin.c). Anschließend ist noch eine Anpassung fällig. Abhängig von dem Verzeichnis, in welchen man den Benutzer chrooten möchte, muss die Zeile 45 angepasst werden (bei unserem Beispiel /home/chroot/ts3 wäre dies also Level 3):

#define CHROOT_LEVEL 3

Nun muss noch der Code kompiliert werden, um eine ausführbare Datei zu erhalten

gcc -Wall -O2 -s chrlogin.c -o chrlogin

Damit das Programm beim Aufruf ohne vollständigen Pfad gefunden wird, sollte man es in ein entsprechendes Verzeichnis kopieren:

cp chrlogin /usr/local/bin/

Jetzt noch die Datei mit den entsprechenden Berechtigungen versehen:

chown root:root /usr/local/bin/chrlogin
chmod 4755 /usr/local/bin/chrlogin

Nun sollte man den benötigten Verzeichnisbaum des Jails aufbauen. Ich habe hierbei /home/chroot/ts3 gewählt:

mkdir -p /home/chroot/ts3
cd /home/chroot/ts3
mkdir bin dev etc home lib usr var tmp
mkdir usr/bin usr/lib var/tmp
chmod 1777 tmp

Anschließend kopiert man die benötigten Binaries in das chroot, damit diese dort zur Verfügung stehen. Damit ein Angreifer im Falle einer Übernahme des Teamspeak Servers möglichst wenig Werkzeuge zur Anwendung vorfindet, kopiere ich nur die Shell selbst (hier /bin/bash) und nohup, mit welchem ich später den Teamspeak-Prozess im Hintergrund starten kann:

cp -p /bin/bash /home/chroot/ts3/bin/
cp -p /usr/bin/nohup /home/chroot/ts3/usr/bin/

Da die Programme / Binaries selbst noch diverse libraries benötigen, müssen wir diese in die /lib bzw. /usr/lib-Verzeichnisse des Chroot-Jails kopieren. Um herauszufinden, welche libs benötigt werden, kann man ldd nutzen. Hierbei muss jedoch der vollständige Pfad zu der Executable angegeben werden (z.B. ldd /bin/bash). Die verschiedenen libs notiert man sich und schaut, dass keine doppelt auftauchen. Anschließend kann man diese einfach an die benötigte Stelle kopieren:

cp -p /lib/libreadline.so.5 /home/chroot/ts3/lib/
cp -p /lib/libdl.so.2 /home/chroot/ts3/lib/
cp -p /lib/libc.so.6 /home/chroot/ts3/lib/
cp -p /lib/libncurses.so.5 /home/chroot/ts3/lib/
cp -p /lib/ld-linux.so.2 /home/chroot/ts3/lib/
cp -p /lib/librt.so.1 /home/chroot/ts3/lib/
cp -p /lib/libpthread.so.0 /home/chroot/ts3/lib/
cp -p /usr/lib/libstdc++.so.6 /home/chroot/ts3/usr/lib/
cp -p /lib/libm.so.6 /home/chroot/ts3/lib/
cp -p /lib/libgcc_s.so.1 /home/chroot/ts3/lib/
cp -p /lib/libresolv.so.2 /home/chroot/ts3/lib
cp -p /lib/libnss_dns.so.2 /home/chroot/ts3/lib

Danach sollte man noch ein paar Dateien aus /etc kopieren, die ggf. benötigt werden, um Hostnamen und ähnliches aufzulösen:

cp -p /etc/HOSTNAME /home/chroot/ts3/etc/
cp -p /etc/resolv.conf /home/chroot/ts3/etc/
cp -p /etc/hosts /home/chroot/ts3/etc/
cp -p /etc/fstab /home/chroot/ts3/etc/

Nun benötige ich noch einen Benutzer und eine Gruppe, mit welchen ich in dem Chroot-Jail Teamspeak 3 starten werde. Das Passwort kann und sollte natürlich geändert werden:

groupadd ts3
useradd -g ts3 -d /home/chroot/ts3/home/ts3 -m -s /usr/local/bin/chrlogin -p testpasswort ts3

Damit der Benutzer, das Passwort, die Gruppe, etc. auch im Chroot-Jail bekannt sind, muss ich die entsprechenden Einträge dort hin bringen. Dazu nutze ich grep, um nur die einzelnen Einträge zu kopieren:

grep ts3 /etc/passwd >> /home/chroot/ts3/etc/passwd
grep ts3 /etc/group >> /home/chroot/ts3/etc/group

In /home/chroot/ts3/etc/passwd muss ich noch das Home-Verzeichnis und die Shell von /home/chroot/ts3/home/ts3:/usr/local/bin/chrlogin auf /home/ts3:/bin/bash ändern. Nach der Benutzer und die Gruppe bekannt ist, kann ich dem Benutzer den Besitz auf die tmp-Verzeichnisse übertragen:

chown ts3:ts3 /home/chroot/ts3/tmp
chown ts3:ts3 /home/chroot/ts3/var/tmp

Nun benötige ich noch die null-, zero-, random- und urandom-Devices. /dev/null und /dev/zero lege ich mit mknod an, /dev/random und /dev/urandom mounte ich auf die Originalverzeichnisse:

mknod /home/chroot/ts3/dev/null c 1 3
chmod 666 /home/chroot/ts3/dev/null
mknod /home/chroot/ts3/dev/zero c 1 5
chmod 666 /home/chroot/ts3/dev/zero

mount -o bind /dev/random /home/chroot/ts3/dev/random
mount -o bind /dev/urandom /home/chroot/ts3/dev/urandom

Wenn Teamspeak 3 nicht als root gestartet wird (was es definitv nicht sollte), muss noch das shm-Device angelegt und als tempfs gemounted werden:

mkdir /home/chroot/ts3/dev/shm
mount -t tmpfs tmpfs /home/chroot/ts3/dev/shm

Danach kann man Teamspeak 3 in das neue Home-Verzeichnis des Benutzers kopieren und die Berechtigungen setzen:

cp -R ~/downloads/teamspeak3-server_linux-x86 /home/chroot/ts3/home/ts3
chown -R ts3:ts3 /home/chroot/ts3/home/ts3

Nun wechselt man mit su - ts3 in den neu angelegten Benutzeraccount und kann feststellen, dass man sich bereits im Chroot-Jail befindet. Da ich mehrere IP-Adresse auf meinem Server habe, muss ich diese in der ini-Datei für Teamspeak 3 angeben. Um diese ini-Datei zu erstellen, welchselt man in das teamspeak-Verzeichnis und startet die Executable mit dem Parameter createinifile=1:

cd teamspeak3-server_linux-x86/
./ts3server_linux_x86 createinifile=1

Die Datei kann nun z.B. über den root-Account angepasst werden. Im Chroot-Jail ist dies nicht möglich, da ich keinen Editor rüber kopiert habe. Nach dem Anpassen kann der Server nun mit dem Parameter inifile=<namederinidatei> gestartet werden:

./ts3server_linux_x86 inifile=server.ini

Hierbei läuft der Teamspeak 3 Server jedoch nur so lange, bis die Konsole geschlossen wird. Aus diesem Grund sollte man den Dienst mit nohup und dem Parameter >/dev/null 2>&1 & starten, um diesen auch bei geschlossener Session im Hintergrund laufen zu lassen:

nohup ./ts3server_linux_x86 inifile=server.ini >/dev/null 2>&1 &

Viel Spaß mit Eurem sicheren Teamspeak 3 Server.

Dank geht an

PS: In Kürze wird es wohl auch ein Script geben, mit welchem die oben gezeigten Aufgaben automatisch durchgeführt werden können. Dieses werde ich dann hier zur Verfügung stellen.

UPDATE 22.12.2009 1855 Uhr
Nachdem ich meine Non-Profit-Lizenz bekommen habe und der Teamspeak 3 Server bei der Lizenzüberprüfung zu den Aktivierungsservern verbindet, trat ein Fehler auf. Grund waren hierfür folgende fehlende Dateien:

cp -p /lib/libresolv.so.2 /home/chroot/ts3/lib
cp -p /lib/libnss_dns.so.2 /home/chroot/ts3/lib

Ich habe diese oben ergänzt, so dass die Anleitung auch bei Nutzung einer Lizenz funktioniert.

27 Responses to “Teamspeak 3 – How to Chroot”

  1. Jetzt fehlen nur noch ein paar Screenshots. Nein Scherz bei Seite. Werd es mal bei Gelegenheit auf meinem Testserver testen. ;) Danke für die Inspiration.

    Gruß,
    Adrian

  2. Uli says:

    Dachte mir schon beim lesen des Titels "Irgendwoher kennste das doch ..." ;) Wusste doch, ich hatte mal drüber geschrieben für die alte Version.

    • Torsten says:

      Hehe... habe mich auch gewundert, als ich nach Teamspeak und Chroot gesucht habe und Deinen Artikel ganz oben fand. :D Aber der Trackback ist scheinbar nicht angekommen oder haste ihn nur noch nicht freigeschaltet?

  3. Uli says:

    Kam keiner an, WordPress versendet nicht immer gleich alle. Musst nur den Artikel ein paar mal aktualisieren, bis alle versendet wurden ;)

  4. Torsten says:

    Ich schnall jedoch noch nicht ganz, wie ich jetzt ein Startscript erstellen kann, welches Teamspeak auch wirklich in dem chroot startet.

    Weil eigentlich müsste das Script ja erst in die 'gechrootete Shell' wechseln, um dort Teamspeak zu starten.

    • Uli says:

      Schau dir mal in meinem Beitrag unten das Init-Script an ;) der start-stop-daemon kann das bereits ;)
      Vg,
      Uli

      • Torsten says:

        Ich traue dem ganzen zwar noch nicht so 100%ig, aber ich werd's mal so umsetzen. ;)

        Danke Dir! :) Schöne Festtage noch.

        • Uli says:

          Sagen wirs mal so, ich wüsste jetzt nicht, wie ich es sonst "praktikabel" umsetzen würde. Wünsch dir ebenfalls schöne Feiertage!
          Vg,
          Uli

        • Torsten says:

          hmm... wollte mir gerade nochmal Dein Script anschauen, aber bekomme vom FF ein Downloadfenster für "application/octet-stream", wenn ich versuche die Seite zu öffnen.

        • Uli says:

          Ich fummel momentan am Webserver rum, jetzt sollte es grad wieder gehen^^ Mein nginx spielt noch nicht ganz so wie ich will ;)

  5. Chris says:

    Ist es möglich aus der chroot umgebung TS3 auch mit MySQL zu betreiben ?

    • Torsten says:

      Versuch mal mittels "mount -o" das Verzeichnis /var/lib/mysql aus dem 'Non-Chroot' in das Chroot zu mounten. Danach sollte eigentlich Teamspeak 3 auch auf MySQL-Server zugreifen können.

      • Chris says:

        Danke für den Tip
        habe es jetzt aber anders gelöst.

        einfach folgende libraries noch in's chroot kopieren

        cp -p /usr/lib/libmysqlclient.so.15 /home/chroot/ts3/lib/
        cp -p /usr/lib/libstdc++.so.6 /home/chroot/ts3/usr/lib/
        cp -p /lib/libm.so.6 /home/chroot/ts3/lib/
        cp -p /lib/libgcc_s.so.1 /home/chroot/ts3/lib/
        cp -p /lib/libc.so.6 /home/chroot/ts3/lib/
        cp -p /lib/libpthread.so.0 /home/chroot/ts3/lib/
        cp -p /lib/libcrypt.so.1 /home/chroot/ts3/lib/
        cp -p /lib/libnsl.so.1 /home/chroot/ts3/lib/
        cp -p /usr/lib/libz.so.1 /home/chroot/ts3/usr/lib/

        und in der ts3db_mysql.ini "locahlhost" durch die IP des Servers ersetzten (scheint anders nicht zu gehen)

        den rest wie gehabt (die Anleitung ist spitze) und Teamspeak läuft mit MySQL im chroot

        Randnotiz:
        aus welchem Grund auch immer, sind alle Versuche Fehlgeschlagen "random & urandom" zu mounten da sie aber zur Erstellung der ID's benötigt werden habe ich einfach neue "Generiert"
        mknod -m 444 /home/chroot/ts3/dev c 1 10
        mknod -m 444 /home/chroot/ts3/dev c 1 11

        • Torsten says:

          Super, vielen Dank für die Informationen. Werde den Beitrag um Deine Infos sobald wie möglich ergänzen.
          Viel Spaß noch mit TeamSpeak 3 ;)

  6. MHJ says:

    Leider bekomme ich bei den beiden mounts eine Fehlermeldung das die betreffende Datei nicht existiert.
    mount -o bind /dev/random /home/chroot/TS3ROB/dev/random
    mount: mount point /home/chroot/TS3ROB/dev/random does not exist

    Versuche ich dann
    mknod -m 444 /home/chroot/ts3/dev c 1 10
    mknod -m 444 /home/chroot/ts3/dev c 1 11

    kommt die Fehlermeldung File exist

    v32381:~# mknod -m 444 /home/chroot/TS3ROB/dev c 1 10
    mknod: `/home/chroot/TS3ROB/dev': File exists

    kann mir da wer weiterhelfen?

    LG

    MHJ

  7. Chris says:

    Hallo Torsten,
    danke für die gute Anleitung! Woher hast du das Programm "chrlogin". Ich konnte es leider nicht finden. Als Distro benutze ich Debian Lenny.

    Auch habe ich versucht das Skript von Uli habe ich schon versucht anzupassen, doch leider will das nicht so richtig funktionieren. In diesem Skript war die chroot Funktion ja schon integriert.

  8. RadioAdmin says:

    Hallo
    Ich bekomme immer folgenden fehler !
    Was mache ich falsch ?

    chrlogin: Could not chdir to new home directory /home/chroot/ts3/home/ts3 for user #10002:
    No such file or directory

    MFG

    • neji says:

      hast du in der /home/chroot/ts3/etc/passwd auch den pfad von '/home/chroot/ts3/home/ts3' auf '/home/ts3' geaendert?

  9. Hallo
    Ich bekomme immer folgenden fehler !
    was ist das ?

    chrlogin: Could not chdir to new home directory /home/chroot/ts3/home/ts3 for user #10002:
    No such file or directory

  10. Polygon says:

    Hi,
    ich habe vor, meinen Ts3 Server auch in einem chroot Modus zu betreiben, habe aber grad erst mit Linux angefangen. Muss ich nur dein Tut abarbeiten oder muss ich auch die Schritte in der Installationsanleitung vom Script befolgen?
    (http://wiki.ubuntuusers.de/chroot/chrlogin)

    Danke schon mal für das Tut

    MfG

  11. René says:

    Hi,

    super Anleitung. Leider bekomme ich random und urandom weder gemountet noch mit mknod angelegt.

    Betriebssystem: Debian Lenny
    Könntet Ihr mir da bitte weiterhelfen??

    Danke
    René

    • René says:

      Hat sich grad erledigt.

      Unter Debian Lenny muss man

      mknod -m 444 /home/chroot/ts3/dev/random c 1 8
      mknod -m 444 /home/chroot/ts3/dev/urandom c 1 9

      verwenden

  12. Robin says:

    Hi!

    ich würd gerne auch meinen ts3 server chroot'en. leider ist das script aber down... gibt es eine möglichkeit das script noch wo anders zu laden oder es ganz weg zu lassen? hab zwar bei google mal nach dem script gegooglet aber das sah anders aus und war fast immer nen direct link und das war mir dann doch zu gefährlich^^

Leave a Reply