SFTP-Benutzer erstellen und auf ein bestimmtes Verzeichnis beschränken (SFTP Chroot)
Dieses Tutorial zeigt Schritt für Schritt, wie unter Linux ein SFTP-Benutzer angelegt wird, der keinen SSH-Shell-Zugriff erhält und per Chroot-Jail strikt auf ein bestimmtes Verzeichnis isoliert wird. Der Benutzer kann sich somit nicht im restlichen Dateisystem des Servers umsehen.
Voraussetzungen
- Root-Zugriff oder ein Benutzer mit
sudo-Rechten. - Ein laufender OpenSSH-Server.
Schritt 1: SFTP-Gruppe und Benutzer anlegen
Aus Sicherheits- und Verwaltungsgründen empfiehlt es sich, eine eigene Gruppe für SFTP-Benutzer zu erstellen.
-
Gruppe anlegen:
sudo groupadd sftp_users -
Benutzer erstellen: Erstelle einen Benutzer (hier:
sftpuser), weise ihn der Gruppe zu und sperre den normalen SSH-Shell-Zugriff über/bin/false:sudo useradd -g sftp_users -s /bin/false -m sftpuser -
Passwort vergeben:
sudo passwd sftpuser
Schritt 2: Verzeichnisstruktur und Berechtigungen einrichten
OpenSSH verlangt aus Sicherheitsgründen sehr strikte Berechtigungen für das Chroot-Verzeichnis:
- Das Basis-Verzeichnis muss
rootgehören. - Weder der Benutzer noch die Gruppe dürfen Schreibrechte auf das Basis-Verzeichnis haben.
- Schreibrechte erhält der Benutzer nur in einem Unterordner (z. B.
upload).
-
Verzeichnisse erstellen:
sudo mkdir -p /var/sftp/sftpuser/upload -
Rechte für das Chroot-Basisverzeichnis setzen:
sudo chown root:root /var/sftp/sftpuser sudo chmod 755 /var/sftp/sftpuser -
Rechte für den Upload-Ordner setzen: Hier darf der SFTP-Benutzer Dateien hochladen, löschen und bearbeiten:
sudo chown sftpuser:sftp_users /var/sftp/sftpuser/upload sudo chmod 755 /var/sftp/sftpuser/upload
Schritt 3: SSH-Daemon (sshd) konfigurieren
Passe die SSH-Konfiguration an, um die Chroot-Umgebung für alle Mitglieder der Gruppe sftp_users zu erzwingen.
-
Öffne die Konfigurationsdatei mit einem Editor:
sudo nano /etc/ssh/sshd_config -
Scrolle ganz an das Ende der Datei und füge folgende Zeilen ein:
Match Group sftp_users ChrootDirectory /var/sftp/%u ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no PasswordAuthentication yesErklärung der Parameter:
Match Group sftp_users: Wendet die folgenden Regeln nur auf Mitglieder dieser Gruppe an.ChrootDirectory /var/sftp/%u:%uwird automatisch durch den jeweiligen Benutzernamen ersetzt (hier:/var/sftp/sftpuser). Dies wird das Root-Verzeichnis (/) für diesen Benutzer.ForceCommand internal-sftp: Erzwingt SFTP und verhindert jeglichen interaktiven Terminal-Zugriff.X11Forwarding no&AllowTcpForwarding no: Erhöht die Sicherheit, indem Tunneling deaktiviert wird.
-
Speichere die Datei (
Strg + O,Enter) und schließe den Editor (Strg + X).
Schritt 4: Konfiguration prüfen und SSH neustarten
-
Konfigurationsdatei auf Syntaxfehler prüfen:
sudo sshd -tWenn keine Ausgabe erscheint, ist die Konfiguration fehlerfrei.
-
SSH-Dienst neustarten:
sudo systemctl restart ssh(Auf manchen Distributionen wie RHEL/CentOS lautet der Dienstname
sshd)
Schritt 5: Verbindung testen
1. SFTP-Zugriff testen (Erfolgreich)
Verbinde dich von einem Client aus:
sftp sftpuser@DEINE_SERVER_IP
Nach Eingabe des Passworts solltest du dich im Prompt sftp> befinden. Wenn du pwd eingibst, siehst du /. Der Ordner upload sollte sichtbar und beschreibbar sein:
sftp> cd upload
sftp> put testdatei.txt
2. SSH-Shell-Zugriff testen (Muss fehlschlagen)
Versuche, eine normale SSH-Verbindung aufzubauen:
ssh sftpuser@DEINE_SERVER_IP
Die Verbindung muss sofort mit einer Meldung ähnlich wie dieser abgebrochen werden:
This service allows sftp connections only.
Damit ist der Benutzer erfolgreich eingesperrt und kann ausschließlich den definierten Ordner per SFTP verwalten.