malte70.blog()

Benutzer mit reinem SFTP-Zugang und chroot

Das SSH-basierte Protokoll SFTP ist nicht nur sicherer als das alte und unverschlüsselte FTP-Protokoll, auch erfordert es keine zusätzliche Server-Software, da meist eh schon SSH für den Fernzugriff auf Linux-Server benutzt wird.

Möchte man einem Nutzer allerdings keinen Zugriff auf eine Shell oder System-Verzeichnisse bieten, sondern auschließlich auf dessen eigene Dateien, kann OpenSSH diesen Nutzer in einem chroot einsperren.

Verzeichnisstruktur, Gruppe und Benutzeraccount

Da ein chroot nur in ein Verzeichnis möglich ist, das root gehört, müssen wir beim Home-Verzeichnis des Nutzers etwas tricksen:

  • Home-Verzeichnis des Nutzers johndoe ist /home/sftponly/johndoe/data
  • Das Verzeichnis /home/sftponly/johndoe gehört root, und ist Ziel des chroot

Zuerst legen wir die Gruppe sftponly an, und danach den Benutzer johndoe mit der gleichen primären Gruppe wie der Webserver/PHP und zusätzlich als Mitglied der eben angelegten Gruppe:

# Gruppe mit der GID 2000 anlegen
sudo groupadd -g 2000 sftponly

# chroot-Verzeichnis
sudo mkdir -p /home/sftponly/johndoe

# Benutzer mit GID > 2000 anlegen, mit primärer Gruppe gleich dem Webserver:
# (www-data unter Debian, apache unter Red Hat/Fedora und http
# unter ArchLinux)
sudo useradd -u 2001 -g apache -G sftponly \
	-d /home/sftponly/johndoe/data -s /bin/false -m johndoe

# Passwort für den Benutzer
sudo passwd johndoe

SSH-Konfiguration

Nun muss OpenSSH so konfiguriert werden, dass Benutzer in der Gruppe sftponly nur auf SFTP, und das nur im chroot, zugreifen können. Um die Haupt-Konfigurationsdatei nicht zu unübersichtlich werden zu lassen legen wir eine neue in /etc/ssh/sshd_config.d/sftponly.conf an:

Subsystem sftp internal-sftp

Match Group sftponly
	ChrootDirectory /home/sftponly/%u
	ForceCommand internal-sftp -d /data
	AllowTcpForwarding no
	X11Forwarding no

Nun muss nur noch OpenSSH neu gestartet werden:

sudo systemctl restart sshd

Konfiguration testen

Ein Login via SSH sollte nicht mehr möglich sein:

$ ssh johndoe@localhost
This service allows sftp connections only.
Connection to localhost closed.
$ 

Und nun SFTP:

$ sftp johndoe@localhost
johndoe@localhost's password:
Connected to localhost.
sftp> pwd
Remote working directory: /data
sftp>