Teamspeak 3 – How to Chroot
// December 22nd, 2009 // 22 Comments » // 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 3Nun muss noch der Code kompiliert werden, um eine ausführbare Datei zu erhalten
gcc -Wall -O2 -s chrlogin.c -o chrloginDamit 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/chrloginNun 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 tmpAnschließ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/libDanach 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 ts3Damit 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/groupIn /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/tmpNun 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/urandomWenn 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/shmDanach 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/ts3Nun 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=1Die 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.iniHierbei 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
- Wolf-U.li - Teamspeak-Server in ein Chroot verbannen
- Wikipedia - nohup, chroot
- The Slack World - A How To on Creating a chroot Environment
- Ubuntuusers.de Wiki - chroot
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/libIch habe diese oben ergänzt, so dass die Anleitung auch bei Nutzung einer Lizenz funktioniert.


