SSH/SFTP – Chroot-Umgebung in Debian/Ubuntu

Content TreeUm den eigenen Server abzusichern gibt es mehr als nur einen Weg.
Spätestens wenn Dritten Zugriff auf den Server gestattet wird, ist es angebracht, über erweiterte Sicherheitsmechanismen nachzudenken. Das ist vor allem notwendig, um Zugriff auf Daten anderer zu verhindern, auch wenn die Rechte falsch gesetzt wurden.
Da ich für die Administration des Servers SSH benutze und SSH bereits ein Datenübertragungsprotokoll besitzt, erachte ich es als unnötig, extra für den Transfer von Daten einen FTP Serverdienst zu installieren und diesen zu warten/pflegen.
Darüber hinaus bietet FTP standardmäßig keine Verschlüsslung, wobei der Datentransfer über SSH (SFTP) nur verschlüsselt stattfinden kann. Vor allem Kunden ist es schwer klar zu machen, dass man bei FTP von den ursprünglichen Einstellungen abweichen muss, um eine Verschlüsslung einzusetzen. Daher ist es meiner Ansicht nach nur logisch, FTP auszulassen und SFTP (Secure File Transfer Protocol) zu verwenden.

Werbung

SSH

Als erstes muss die Konfiguration von SSH zum Bearbeiten geöffnet werden.

nano /etc/ssh/sshd_config

Darin befindet sich die Zeile (Unterer Teil der Datei)

Subsystem sftp /usr/lib/openssh/sftp-server

Diese Zeile muss auskommentiert und eine neue Zeile hinzugefügt werden

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Das bewirkt, dass der SFTP Serverdienst OpenSSH nicht weiter benutzt wird, sondern der interne SFTP Dienst benutzt werden soll.

Am Ende der Datei (Ja, es muss als letztes platziert werden) muss folgende Anweisung platziert werden:
Chroot für Gruppen (Nur SFTP Zugriff, kein Shell (ForceCommand)):

Match Group sftpusers 
    ChrootDirectory %h 
    ForceCommand internal-sftp 
    AllowTcpForwarding no

Dies teilt dem Server mit, dass die eingerückten Befehle für alle Benutzer der Gruppe sftpusers gilt.
ChrootDirectory %h bewirkt, dass der Homeordner des Benutzers als Chroot Umgebung angenommen wird.
ForceCommand internalsftp bewirkt, dass nur SFTP Zugriff gewährt wird und kein SSH Zugriff.
AllowTcpForwarding no verweigert dem Nutzer die Portweiterleitung.

Benutzer und Gruppen

Vorher haben wir definiert, dass Benutzer der Gruppe sftpusers nur SFTP Zugriff haben. Aber die Gruppe existiert noch nicht. Also muss diese nun erstellt werden.

addgroup sftpusers

Falls der Benutzer für den Zugriff noch nicht vorhanden ist, erstellen wir diesen Benutzer nun.

useradd --home-dir /var/vhosts/domain.tld/ --shell /bin/false Benutzername

„Benutzername“ sowie home-dir kannst du mit jedem beliebigen unix validen Benutzernamen ersetzen.
Hierbei wird der Benutzer „Benutzername“ erstellt, dessen Home Ordner „/var/vhosts/domain.tld/“ ist.
Gelingt der Zugriff auf SSH, wird mittels der –shell Anweisung die Session wieder sofort beendet. (Statt auf die Konsolenumgebung /bin/sh bzw. /bin/bash)

Nun muss noch der vorhandene Benutzer zu der Gruppe sftpusers hinzugefügt werden:

usermod -a -G sftpusers Benutzername

Ob ein Benutzer bereits Mitglied einer Gruppe ist, kannst du mit dem Befehl groups überprüfen.

groups Benutzername

Die Ordnerstruktur

Einen Nachteil/Vorteil gibt es in der Chroot Umgebung. Im Root Ordner (/) können vom Benutzer keine Ordner erstellt werden.
Ebenfalls muss der Ordner des Benutzers root gehören und bestimmte Sicherheitskriterien erfüllen.

Zuerst überschreiben wir den Ordner dem Benutzer root mit der Gruppe sftpusers.

chown root:sftpusers /var/vhosts/domain.tld/

Nun vergeben wir dem Ordner folgende Rechte:

Besitzer Gruppe Andere
Lesen J J N
Schreiben J N N
Ausführen J J J
chmod 0751 /var/vhosts/domain.tld/

Die Daten, in diesem Fall ein WebSpace, werden im Ordner httpdocs platziert. Also muss nun noch der Ordner httpdocs erstellt und die richtigen Rechte zugewiesen werden.
Hierbei ist der Besitzer des Ordners der Benutzer.

mkdir /var/vhosts/domain.tld/httpdocs/
chown Benutzername /var/vhosts/domain.tld/httpdocs/

Zum Abschluss muss dem Ordner httpdocs noch die richtigen Rechte zugesprochen werden:

Besitzer Gruppe Andere
Lesen J J N
Schreiben J J N
Ausführen J J J
chmod 0771 /var/vhosts/domain.tld/httpdocs/

Es kann vorkommen, dass manche Einstellungen nicht sofort übernommen werden da diese im Cache zwischengespeichert werden.
Daher empfiehlt es sich, das System mittels „reboot“ neu zu starten. Dies ist aber nicht immer notwendig.

Das wars!
Viel Spaß beim Experimentieren.
Aber Vorsicht! Mit den falschen Einstellungen kann man sich selbst aus dem System aussperren.

Pretty office icon set part 5 by Custom Icon Design.
Wie immer der rechtliche Teil des Artikels: Ich hafte für keinerlei Beschädigungen am System oder Gerät, die im Zuge der Verwendung dieser Erklärung auftreten können.

Author: Thomas2500

SSH/SFTP – Chroot-Umgebung in Debian/Ubuntu
5 (100%) 5 votes

4 thoughts on “SSH/SFTP – Chroot-Umgebung in Debian/Ubuntu

  1. Super Artikel! Mich persönlich würde mich interessieren, wie man Benutzer mit einem Shell-Zugriff richtig chrooten kann. Damit die Programme compilieren & ausführen können, aber nicht in andere Verzeichnis über /home/user sehen können. Würde mir ein Tutorial dazu wünschen 🙂

  2. Mark

    Hallo,
    ich war echt froh, dass ich Deine Anleitung gefunden hatte und habe auch alles befolgt. Leider funktioniert es bei mir nicht. Ich kann mich mit Filezilla und dem angelegten User nicht einloggen.

    Ich bekomme ständig

    Fehler: Server unexpectedly closed network connection
    Fehler: Herstellen der Verbindung zum Server fehlgeschlagen

    Was doch eigentlich auf die falschen Rechte hinweist. Die sind aber richtig, Irgendeine Idee?

    Mark

    1. Sind unter /var/log/auth.log weitere Informationen bei einem Loginversuch einlesbar?

  3. Tobi

    Ich kann zwar nur in das Benutzerverzeichnis Daten reinkopieren. Jedoch kann ich mich durch das gesamte Verzeichnis hangeln.

    Kann man das deaktivieren?

Kommentar verfassen