Chrooted SFTP User in Ubuntu


Kurzanleitung zur Einrichtung von Useraccounts, die nur sftp Zugang haben und in ihrem Homeverzeichnis eingesperrt sind. Die Anleitung orientiert sich stark an http://www.ericstockwell.com/?p=54. Wir verzichten auf Tools wie scponly, die meiner Meinung nach, ein unverschämtes UI haben.

Wir müssen zwei Dinge tun:

  1. Einen User anlegen und die richtigen Einstellungen vornehmen.
  2. Den SSH Daemon so umkonfigurieren, dass er den User in ein Chroot einsperrt.

Fall noch nicht geschehen, dann muss ssh installiert werden:

# apt-get install ssh

User anlegen

SSH ist sehr sensibel gegenüber Dateirechten, deshalb müssen wir sicherstellen, dass der Ordner in den wir den User einsperren wollen die richtigen Rechte gesetzt hat. Erstmal legen wir den User an, erzeugen sein Homeverzeichnis (das Verzeichnis in welches er eingesperrt werden soll), setzen das Passwort und dann stellen wir sicher, dass die Dateirechte richtig sind. Das Homeverzeichnis muss root gehören, und nur root hat Schreibrechte, die Gruppe ist im Prinzip egal, aber es macht Sinn die Gruppe des Users zu verwenden.

# useradd myuser
# mkdir /home/myuser
# usermod -d /home/myuser myuser
# passwd myuser
# chown root:myuser /home/myuser
# chmod 755 /home/myuser

Einer der wichtigsten Schritte ist es dem User die Loginshell wegzunehmen.

# usermod -s /bin/false myuser

/bin/false ist ein Kommando, das nichts tut und das auch noch unerfolgreich (siehe Manpage false(1)), d.h. wenn der User sich versucht einzuloggen, dann wird /bin/false ausgeführt, das schlägt fehl und der User wird sofort wieder rausgeworfen. Das sollte man vielleicht mal ausprobieren mit

$ su - myuser

Auch ein Loginversuch über ssh kann das Vertrauen erhöhen. Hier erfolgt der Rauswurf erst nachdem man versucht hat Befehle abzusetzen.

$ ssh myuser@host

SSHD einrichten

Beim SSHD müssen wir zwei Dinge abändern, erstens das Subsystem und zweitens müssen wir SSH sagen, dass wir myuser in sein Homeverzeichnis sperren wollen. Beides wird in der /etc/ssh/sshd_config eingestellt. Danach muss der sshd neu gestartet werden.

Als erstes ersetzen wir die Zeile die mit Subsystem beginnt durch

Subsystem sftp internal-sftp

Dann fügen wir am Ende der sshd_config folgendes ein:

Match User myuser
     ChrootDirectory /home/myuser
     ForceCommand internal-sftp

Und den sshd neustarten.

# /etc/init.d/ssh restart

Ab jetzt sollte es möglich sein, sich über sftp und nur über sftp als myuser zu verbinden. Und man sollte ausser einem leeren Verzeichnis nichts sehen und auch nicht in der Lage sein Dateien hochzuladen. Das sollten wir testen.

$ sftp myuser@host

Falls der Login nicht klappt, dann hilft ein Blick ins /var/log/auth.log Verzeichnis. Da könnte z.B. sowas drinstehen:

fatal: bad ownership or modes for chroot directory component „/home/“

Was in unserem Fall bedeuten würde, dass /home nicht root gehört.

Uploadverzeichnis einrichten

Ein Uploadverzeichnis ist eines mit Schreibrechten für den User.

$ mkdir /home/myuser/upload
$ chown myuser:myuser /home/myuser/upload
$ chmod 755 /home/myuser/upload

Weiteres