Photo by Joshua Sortino / Unsplash

SFTP in Unterordner einrichten

sftp 8. Juli 2023

Falls du einen Server betreibst (oder eine VM/LXC/etc.) und anderen Benutzern in bestimmten Verzeichnissen Berechtigungen geben möchstest, damit sie zum Beispiel Dateien hoch-/ oder runterladen können, kann dies sehr einfach mit dem ohnehin schon vorhandenen OpenSSH eingerichtet werden.

Für diese Freigabe nutzen wir SFTP (Secure File Transfer Protocol). Dies basiert auf SSH und ist damit Bestandteil des OpenSSH-Servers, den wir schon für unsere SSH-Verbindungen nutzen.

Um sich per SFTP mit einem Server zu verbinden, gibt es viele Tools mit grafischer Oberfläche, zum Beispiel:

  • FileZilla
  • Cyberduck

Natürlich kann man auch auf Zusatzprogramme verzichten und den Zugang auf der Kommandozeilenebene nutzen.

Um den jeweilige Benutzer in seinen Ordner einzusperren, nutzen wir die Funktion chroot von Linux. Damit ist es dem Benutzer nicht möglich, aus diesem definierten Ordner auszubrechen, es sind also nur alle untergeordneten Verzeichnisse sichtbar, nicht die übergeordneten.

Neuen Benutzer anlegen

Zunächst legen wir einen neuen Benutzer an, der für die SFTP-Verbindung genutzt werden soll.

sudo adduser testuser

Nach Ausführung des Befehls erscheint eine Aufforderung, um das Passwort festzulegen. Alle weiteren Abfragen können auch leer bleiben.

Verzeichnis anlegen

Nachdem wir einen neuen Benutzer angelegt haben, kommt jetzt das Verzeichnis, in das sich der Benutzer einloggen können soll. Dies kann jeder beliebige Unterordner sein, für dieses Beispiel legen wir einen neuen Ordner an.

sudo mkdir -p /var/sftp-shares/testuser/data

Jetzt müssen die Besitzer der Ordner richtig definiert werden. Der Ordner in den sich der Benutzer einloggen soll muss root:root gehören.

💡
Wenn diese Berechtigungen nicht richtig gesetzt sind, funktioniert später der Login nicht! Der ausgegebene Fehler sollte darauf hinweisen, dass die Berechtigungen im System nicht passen.
sudo chown root:root /var/sftp-shares/testuser

Der Unterordner, in diesem Fall data, in dem der Benutzer Berechtigungen haben soll, muss dementsprechend auch ebendemselbem gehören.

sudo chown testuser:testuser /var/sftp-shares/testuser/data -R

SSH-Konfig anpassen

Da wie schon erwähnt SFTP ein Teil von OpenSSH ist, müssen wir auch die schon aus anderen Beiträgen bekannte SSH-Konfig erweitern. Dazu öffnen wir Datei mit:

sudo nano /etc/ssh/sshd_config

und ergänzen diese am Ende der Datei mit folgendem Inhalt:

Match User testuser
    ForceCommand internal-sftp
    ChrootDirectory /var/sftp-shares/testuser
    PermitTunnel no
    AllowAgentForwarding no
    AllowTcpForwarding no
    X11Forwarding no

Speichern und schließen mit
Win: STRG+O, ENTER, STRG+X
Mac: CONTROL+O, ENTER, CONTROL+X

und dann einmal mit dem Befehl sudo sshd -t testen ob die Konfiguration in Ordnung ist (keine Ausgabe bedeutet dass es keinen Fehler gibt) und dann den SSH-Server neu starten:

sudo systemctl restart sshd

Die Anpassungen in der Konfiguration führen dazu, dass sobald sich der Benutzer testuser anmeldet, nach dem Login der Befehl internal-sftp erzwungen wird. Der Benutzer kann sich also nicht normal per SSH verbinden, sondern ist immer in einer SFTP-Session. ChrootDirectory definiert dann das Verzeichnis, in dem der Benutzer "eingesperrt" wird. Dieses muss wie schon erwähnt zwingend root:root gehören.

Verbindung herstellen

Damit ist alles eingerichtet, um eine SFTP-Verbindung für zum Beispiel einen Dateiupload herzustellen. Die nachfolgenden sichtbaren Screenshots zeigen das Tool Cyberduck, welches ich hauptsächlich für SFTP-Verbindungen nutze.

Für den Login schaltet ihr auf "SFTP" um, sofern euer Tool eine solche Option bietet. Dies ändert nur den Port, der genutzt wird, ihr könnt auch manuell die "22" eintragen. Falls ihr euren SSH-Port geändert habt, müsst ihr natürlich diesen benutzen.

Es reicht als die Eingabe von IP des Servers, SSH-Port, Benutzername und Passwort.

Cyberduck - Login auf SFTP-Server

Danach befindet ihr euch in dem Verzeichnis, das in der SSH-Konfig angegeben worden ist und seht den Unterordner.

Cyberduck - Ansicht nach Login auf SFTP-Server

Auf dieser Ebene habt ihr keine Berechtigungen, sondern nur innerhalb des Unterordners. Versucht ihr hier auf der obersten Ebene eine Datei hochzuladen, kommt es zu einem Fehler.

Cyberduck - Permission denied auf oberster Ordnerebene

Im Unterordner dagegen hat der Benutzer Berechtigungen und kann problemlos eine Datei hochladen.

Cyberduck - Datei in Unterordner erfolgreich geladen

Zusatzinfo

Man kann die SSH-Konfig auch so anpassen, dass der Benutzer nach dem Login direkt im Unterverzeichnis landet. Dazu muss die ForceCommand-Zeile erweitert werden.

SSH-Konfig öffnen:

sudo nano /etc/ssh/sshd_config

ForceCommand-Zeile gegen nachfolgenden Inhalt tauschen:

ForceCommand internal-sftp -d /data

Speichern und schließen mit
Win: STRG+O, ENTER, STRG+X
Mac: CONTROL+O, ENTER, CONTROL+X

Und die Konfig nochmal testen und den SSH-Server neu starten:

sudo sshd -t
sudo systemctl restart sshd

Beim nächsten Login befindet ihr euch nun direkt im Unterverzeichnis data und müsst nicht erst dort hineinwechseln.

💡
Dies verhindert nicht, dass der Benutzer sich trotzdem eine Ebene nach oben aus dem Unterverzeichnis bewegen kann. Aber Berechtigungen hat er auf dieser Ebene ohnehin nicht.

Unterstützung

Hast du Hinweise oder benötigst Hilfe? Dann schaue gerne bei uns im Discord vorbei.

Bei Anmerkungen oder Fragen kommt gerne auf unseren Discord.

Join the IceFlom & maarsellow & Viertelwissen Discord Server!
Gemeinschaftsdiscord von IceFlom, Maarsellow und Viertelwissen

Tags