SFTP-Benutzer erstellen und auf ein bestimmtes Verzeichnis beschränken (SFTP Chroot)

Melden

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.

  1. Gruppe anlegen:

    sudo groupadd sftp_users
  2. 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
  3. 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 root gehö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).
  1. Verzeichnisse erstellen:

    sudo mkdir -p /var/sftp/sftpuser/upload
  2. Rechte für das Chroot-Basisverzeichnis setzen:

    sudo chown root:root /var/sftp/sftpuser
    sudo chmod 755 /var/sftp/sftpuser
  3. 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.

  1. Öffne die Konfigurationsdatei mit einem Editor:

    sudo nano /etc/ssh/sshd_config
  2. 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 yes

    Erklärung der Parameter:

    • Match Group sftp_users: Wendet die folgenden Regeln nur auf Mitglieder dieser Gruppe an.
    • ChrootDirectory /var/sftp/%u: %u wird 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.
  3. Speichere die Datei (Strg + O, Enter) und schließe den Editor (Strg + X).


Schritt 4: Konfiguration prüfen und SSH neustarten

  1. Konfigurationsdatei auf Syntaxfehler prüfen:

    sudo sshd -t

    Wenn keine Ausgabe erscheint, ist die Konfiguration fehlerfrei.

  2. 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.

0