Monthly Archives: May 2014

SSH Tunnel trotz /bin/false

Ein interessantes Feature von SSH ist das man trotz einer Shell wie /bin/false oder /bin/nologin einen SSH Tunnel aufbauen kann. Normalerweise setzt man einer der genannten Shells gerade für (s)/FTP Benutzer ein, damit sich diese nicht auf dem Server mit einer Shell einloggen dürfen. Leider interessiert dieses SSH absolut gar nicht und für einen Tunnel braucht man eben keine Shell (channel!).

Viele Anbieter bieten FTP für ihre Dienste an und falls dann noch SSH läuft wäre es somit möglich die Firewalls zu umgehen und einen direkten Zugang auf das System und den dahinterliegenden zu erhaschen. Das ganze funktioniert leider auch wenn man den Benutzer in einer Match Gruppe nur SFTP erlaubt hat.

Ein SSH Tunnel ist schnell aufgebaut und schon kann man loslegen:

# ssh -N -L 1337:localhost:80 $ftpuser@$server

Viel mehr Spaß macht es dann eigentlich nur noch die File Descriptor auf dem Server bequem und schnell zu verbrauchen:

# ssh -N -L 1337:localhost:80 $ftpuser@$server
# ssh -N -R 1337:localhost:80 $ftpuser@$server
# telnet localhost 1337

Das einzige was man dagegen machen kann ist den Zugriff auf SSH nur für bestimmte Benutzer zu erlauben (AllowUsers, AllowGroups) und Tunnel, Forwarding zu verbieten (AllowTcpForwarding, X11Forwarding, PermitTunnel)

Wunderbar beschrieben im Jahr 2005 auf semicomplete.com und immer noch möglich.

Chroot Manager

Aus verschiedenen Gründen muss man ab und zu eine komplette chroot für einen Benutzer erstellen. Meistens ist dieses einzusetzen wenn man noch eine alte Distribution benutzt neuere Möglichkeiten einfach nicht anbietet.

Vor ein paar Monaten hatte ich die Idee chrooted shells auf Servern die auf der ganzen Welt verteilt sind zu vermieten. Das ist ganz hilfreich wenn man seine Dienste aus anderen Ländern wie China testen möchte. Leider habe ich das Projekt nie komplett abgeschlossen und released. Zustande kam jedoch ein kleines Script das automatisch eine chroot für einen Benutzer erstellt. Zusätzlich wurde der Traffic limitiert, damit andere Benutzer nicht komplett ausgebremst werden und ein paar MB auf dem der Benutzer Scripte ablegen kann.

Getestet ist das Script auf Ubuntu 12.04, aber sollte auch auf nachfolgenden Versionen funktionieren. Als erstes muss man auf dem Server ein paar Programme installieren und Konfiguration für ssh und Limitierungen für die Benutzer setzen.

$ create_chroot.sh init_server

Anschließend kann man loslegen und einen Benutzer ‘u007’ erstellen:

$ create_chroot.sh create_user u007

Normalerweise wird eth0 benutzt und die Traffic Limitierung ist auf ca. 100kb/s. Falls etwas anderes gewünscht ist muss dieses im Script angepasst werden. Dieses gilt auch für die Programme die in der Chroot zur Verfügung gestellt sein sollen.

Gerade das Traffic Shaping für jeden einzelnen Benutzer einzugrenzen war etwas kniffelig, aber nach viel ausprobieren dann doch hinbekommen. Vielleicht kann ich damit jemanden viel Zeit sparen:

NEWUSERID=$(id -u $NEWUSER)
IF=eth0
DNLD=1kbps

iptables -t mangle -A OUTPUT -m owner --uid-owner $NEWUSER -j MARK --set-mark $NEWUSERID
tc qdisc add dev $IF root handle 1: htb default 30 >/dev/null 2>&1
tc class add dev $IF parent 1: classid 1:1 htb rate $DNLD >/dev/null 2>&1
tc filter add dev $IF protocol ip parent 1:0 prio 1 handle $NEWUSERID fw flowid 1:1 >/dev/null 2>&1

Mehr Optionen und das Script gibt es auf github.com.