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
johndoeist/home/sftponly/johndoe/data - Das Verzeichnis
/home/sftponly/johndoegehörtroot, 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>