
Normalerweise erwarte ich, dass meine Datei nach erfolgreicher Anmeldung sftp
und Ausführung eines put
Befehls in das Verzeichnis des angemeldeten Benutzers übertragen wird $HOME
. Das funktioniert sofort, aber ich möchte den sftp
Benutzer auf sein Verzeichnis beschränken (damit er beispielsweise $HOME
nicht mehr Ebenen aufsteigen kann ).cd
Hier verwende ich ChrootDirectory
- gemäß der Dokumentation (https://linux.die.net/man/5/sshd_config)
ChrootDirectory: Gibt einen Pfad an, zu dem chroot(2) nach der Authentifizierung gehen soll. Dieser Pfad und alle seine Komponenten müssen root-eigene Verzeichnisse sein, die von keinem anderen Benutzer oder keiner anderen Gruppe beschreibbar sind.
Ich glaube, ich habe die Ordner/Berechtigungen richtig eingerichtet. Der nächste Satz der Dokumentation funktioniert meiner Meinung nach nicht oder verhält sich nicht wie erwartet.
Nach dem Chroot ändert sshd(8) das Arbeitsverzeichnis in das Home-Verzeichnis des Benutzers.
Nach der Änderung sshd_config
zur Verwendung ChrootDirectory
und dem erfolgreichen Zugriff auf den Server über sftp
ist das Arbeitsverzeichnis des Benutzers NICHT auf das $HOME-Verzeichnis des Benutzers eingestellt, sondern tatsächlich auf eine Ebene darüber. (z. B. /home
anstelle von /home/userTest
) Die offensichtliche Lösung für den Benutzer besteht darin, in das richtige Verzeichnis eine Ebene darunter zu wechseln. Wenn Sie jedoch ein automatisiertes System verwenden, das Daten einfach per FTP in das aktuelle Arbeitsverzeichnis überträgt, kann dies sehr problematisch sein.
Ich werde zuerst den allgemeinen Fall zeigen und ihn dann modifizieren, um zu zeigen, wie sich das Verhalten des Standardarbeitsverzeichnisses ändert, sobald es ChrootDirectory
eingeführt wirdsshd_config
Dies funktioniert wie erwartet:
- Erstellen Sie den Benutzer (verwenden Sie ihn,
-m
um das Home-Verzeichnis dieses Benutzers zu erstellen):sudo useradd -m userTest
- Geben Sie dem Benutzer ein Passwort:
sudo passwd userTest
- Hinweis
userTest
$HOME-Verzeichnis:cat /etc/passwd
->userTest:x:1002:1004::/home/userTest:/bin/sh
- Senden Sie für den gerade erstellten Benutzer eine SFTP-Verbindung zu Ihrem Server:
sftp userTest@<your-server>
- Notieren Sie sich das Arbeitsverzeichnis nach erfolgreicher Anmeldung:
pwd
->Remote working directory: /home/userTest
Das obige Beispiel funktioniert genau wie erwartet. Das einzige Problem besteht darin, dass userTest
es nicht im Arbeitsverzeichnis gesperrt ist und cd ..
das Dateisystem zurückgesetzt werden kann.
In mehreren Anleitungen wurde die gleiche grundlegende Lösung für dieses Problem beschrieben (https://linuxconfig.org/wie-man-einen-sftp-server-unter-ubuntu-20-04-focal-fossa-linux-einrichtet)
Ergänzend zu den vorherigen Schritten
- Fügen Sie eine SFTP-Gruppe hinzu (diese wird als Schlüssel für unseren
Match
Block in verwendetsshd_config
):sudo addgroup sftp
userTest
Benutzer zur Gruppe hinzufügen :sudo usermod -a -G sftp userTest
- Bearbeiten
sshd_config
:sudo nano /etc/ssh/sshd_config
- Fügen Sie am Ende der Datei die folgenden Zeilen hinzu
Match group sftp
ChrootDirectory /home
ForceCommand internal-sftp
(Das bedeutet grundsätzlich, dass jeder Benutzer, der zu dieser Gruppe gehört, den Regeln sftp
unterliegt .)ChrootDirectory
ForceCommand
Datei speichern und ssh neu starten: sudo systemctl restart ssh
Überprüfen Sie, ob das angegebene Verzeichnis ChrootDirectory
die Anforderungen aus der obigen Dokumentation erfüllt: ls -ltr
-> drwxr-xr-x 4 root root 4096 Jun 10 09:02 home
(ich glaube, das ist erfolgreich)
Vergleichen Sie die Ergebnisse der sofort einsatzbereiten Einrichtung mit denen unserer neuen SFTP-Konfiguration, indem Sie userTest
erneut Folgendes verwenden:sftp userTest@<your-server>
Notieren Sie das aktuelle Arbeitsverzeichnis: pwd
->Remote working directory: /
Dies ist kein sicheres Zeichen dafür, dass etwas nicht stimmt. Wir gehen davon aus, dass sich das Arbeitsverzeichnis ändert. Sehen wir uns dennoch schnell den Inhalt des aktuellen Arbeitsverzeichnisses an:
ls -ltr
-> drwxr-x--- 3 1002 1004 4096 Jun 10 09:10 userTest
(!!!)
Gemäß der Dokumentation:
Nach dem Chroot ändert sshd(8) das Arbeitsverzeichnis in das Home-Verzeichnis des Benutzers.
ls -ltr
zeigt uns, dass sich das Arbeitsverzeichnis NICHT im userTest
Home-Verzeichnis befindet, sondern tatsächlich eine Ebene DARÜBER.
Gibt es eine Konfigurationsmöglichkeit ChrootDirectory
oder eine andere Möglichkeit, damit dies wie erwartet funktioniert?
HINWEIS: Das Entfernen ForceCommand
aus sshd_config verursacht tatsächlich dieses andere Problem, das vor 11 Jahren als ERRATA geschlossen wurde?
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=681202