HOWTO chroot SFTP (only)


Last updated: 17 May 2007
Current version of OpenSSH: 4.6
Current version of sftp-server.c: 1.71


Vorwort
Dieses Dokument habe ich aus dem Englischen von www.minstrel.org.uk/papers/sftp/ übersetzt. Der Autor hat mir ausdrüklich die Erlaubnis dazu gegeben ( Christian Strässle 17 May 2007) .



Hintergrund
Seit ein paar Jahren habe ich immer wieder versucht den richtigen Weg zufinden, um den Web-Hosting Kunden eine sichere SFTP Datei übertragung anzubieten. Seit ich SSH (und SFTP) auf dem Server für meine eigenen Zwecke verwende, war es offensichtlich die nahe liegenste Lösung dazu. Ich wollte nie nur einen schlichen FTP-Zugriff anbieten (welcher zwar in geeigneter Weise eine geschlossene Heimatzone auf Benutzerbasis anbietet), weil einige von ihnen Verbindungen von/über heikle Netzwerke aufbauen.

Schon seit einer langen Zeit habe ich OpenSSH mit einem Patch, um die Benutzer zu chrooten, im Einsatz, aber es unglaublich müsam zu warten - jedesmal wenn eine neue Version von OpenSSH erschienen ist, musste ich die gepatchte Version holen, kompilieren und installieren. Ebenfalls mussten alle Libraries in den Heimatverzeichnissen der Benutzer auf ihre Aktualität prüfen und sicherstellen, dass ich nirgens eine Fehlkonfiguration eingeführt habe. Diese Lösung hatte immernoch einen grosses Fehler - die Benutzer hatten zwar noch Shell-Zugriff, wenn auch nur in ihrer Umgebung - das konnte aber dazu führen (und es passierte auch), dass die Benutzer ihre eigene Umgebung durcheinander brachten.

Ich habe schlussendlich die richtige Lösung gefunden - in der Zeit als OpenSSH 4.4p1 erschien, ist das chrootssh-Project von SourceForge für eine längere Zeit verschwunden - Ich war gezwungen selber die Sache in die Hand zunehmen statt faul wie immer einfach das Packet eines Anderen zu nehmen. Das gab mir die Gelegenheit eine funktionierende Lösung zu implementieren, welches die Menge meiner Wartungsarbeiten reduzierte und sogar die Benutzer noch eine Stufe mehr abschloss - die Benutzer können jetzt nur noch ihre eigenen Dateien verändern.

Ich habe dieses Dokument veröffentlich um, jedem mit ähnlichem Szenario wie meinem, zu helfen:

  • Die Benutzer sollten Datei upload/download Zugriff erhalten;
  • Die Bentuer sollen keinen Shell-Zugriff erhalten; und
  • Der zusätzliche Wartungsaufwand bei einem OpenSSH-Upgrade soll kleinst möglich gehalten werden.

Diese Lösung wäre jedoch nicht angebracht wenn:

  • Die Benutzer Shell-Zugriff benötigen; oder
  • stattdessen SCP-Zugriff erlaubt werden soll (für das gibt es sicher eine änliche Lösung).

Die Informationen die ich hier zusammengetragen habe, sind alle irgendwo im Internet vorhanden, aber es hat mich einige Zeit gekostet die richtigen Zauberformeln für Google zu finden und dann alles zusammenzusetzten, so wie es zusammen passt. Teilweise waren diese Stücke praktisch in unleserlichen Sätze abgefasst und an völlig verschiedenen Plätzen zu finden. Jedoch hoffe ich das dieses HOWTO anderen helfen wird eine ähnliche Umgebung aufzusetzen.

Auf meinem Server läuft Solaris, aber ich denke diese Instruktionen sollten ziemlich auf allen *NIX Systeme gleich durchführbar sein.

Folgende Punkte sind die Ziele dieses HOWTOs:

  • Die Möglichkeit den Benutzer individuell SFTP-Zugriff (ohne SCP oder Shell) gewähren;
  • Die Möglichkeit jeden Benutzer in sein Heimatsverzeichnis zu CHROOTen; und
  • Keine Notwendigkeit für Libraries oder andere Dateien in den Heimatsverzeichnissen der Benutzer.

Bemerkung: Dieses Setup wird einer robusten 'privilege escalation'-Attacke nicht standhalten, vorallem weil auf dem sftp-server das SUID-Bit gesetzt ist, jedoch bin nicht sicher wie es gemacht werden könnte (falls es jemand weiss, wäre ich interessiert zu hören wie).


Die Methode
Es sieht so aus als benötigst du eine Umgebung wie ich eine aufgesetzt habe. Folge einfach den folgenden Instruktionen (falls du OpenBSD 4.0 im Einsatz hast: ein paar kleine unterschiede folgen - vielen Dank an Bryan Irvine für das weitergeben dieser Informationen)...

Generische Instruktionen

  1. Downloade den neusten OpenSSH Source Tarball von OpenSSH.org - ich verwende die 'portable' Version, weil ich kein OpenBSD habe.
    Bemerkung: weil ich nie die 'portable' version verwendet habe, bin ich nicht zu 100% sicher, dass diese Instruktionen auch auf der 'main' OpenBSD Version funktionieren. Feedback ist erwünscht.
  2. Extrahiere die source files in einem Verzeichnis.
  3. Im source Verzeichnis ersetzte sftp-server.c mit meiner modifizierten Version - Alle meine Anpassungen sind alle in der Datei kommentiert (suche nach 'Minstrel') um zu verstehen was passiert.
    Bemerkung: Eine Änderung die ich vor dem kompilieren durchführe ist in der version.h, damit OpenSSH keine detailierte Versions-Information preisgibt, aber ich bin nur paranoid!
  4. Führe wie gewohnt ein ./configure mit den relevanten Parameter für deine Umgebung aus (Ich z.B. benütze --with-tcp-wrappers - lese die Bemerkung am Ende der Seite).
  5. make
  6. make install
  7. Wenn SSH den sftp-server starten möchte muss er seine Privilegien ablegen - darum muss das SUID-Bit gesetzt werden chmod +s /usr/local/libexec/sftp-server (evt. installiert dein System das sftp-server Binary anderswo).

OpenBSD 4.0 Variation

Falls du OpenBSD 4.0 im Einsatz hast, ist der der Prozess ein bischen einfacher, and auch ein bischen anders. Die folgende Nummerierung stimmt mit dieser aus aus 'Generischen Instruktionen' überein...

  1. Downloade den Source vom CVS nach den OpenBSD Instruktionen. Du wirst den Source-Baum unter /usr/src auffinden.
  2. Im letzten Schritt enthalten.
  3. Downloade mein sftp-server.c und kopieren ihn nach /usr/src/usr.bin/ssh/. Editiere die Datei und entferne die Linie welche include.h enthält.
  4. Nicht spezifiziert.
  5. CD nach /usr/src/usr.bin/ssh/ und tippe make
  6. CD nach /usr/src/usr.bin/ssh/sftp-server/ und tippe make install
  7. wie oben

Näste Schritte - Alle Variationen

Hoorah! Du hast jetzt ein funktionsfähiges sftp-server Binary welches Benutzer CHROOTen kann. Die haupt SSH shell ist nicht CHROOTed, wir m¨ssen also als nächstes die Benutzer auf SFTP only einschränken. Ich habe dazu ein einfaches C Programm verwendet, dass eine neue Shell erzeugen, die nichts anderes macht ausser den sftp-server zu wrappen.

  1. Downloade sftpsh.c - Das ist das Programm wie ich es vorgefunden habe, es wurde durch mich nicht verändert bis auf die erwähnten Modifizierungen weiter unten.
  2. Editiere sftpsh.c und passe folgende Linien deiner Umgebung an (lese die Kommentare in der Datei selber):

    #define SFTP_BINARY "/usr/local/libexec/sftp-server"
    #define SFTP_EXNAME "/usr/local/libexec/sftp-server"
    #define SFTP_ARGS ""

  3. Kompiliere diese Programm wie folgt: gcc sftpsh.c -o sftpsh
  4. Kopiere die neue Shell in dein System Pfad mit: cp sftpsh /bin
  5. Stelle sicher, dass dein System die neue Shell erkennt, indem sie in der /etc/shells aufgeführt wird: echo /bin/sftpsh >> /etc/shells
  6. Konfiguriere die bestehenden und die neuen Benutzer-Accounts wie folgt:
    • Konfiguriere als Shell /bin/sftpsh
    • Benutze das chroot 'magic token' (a full stop) bei ihren Heimatsverzeichnis einstellungen, z.B. /home/username/./ - Der Pfad vor dem '.' wird dem Benutzer als root '/' dargestellt, während der Pfad nach dem '.' das Verzeichnis definiert wo er nach dem einloggen landet.
    • Setzte die Zugriffsreche auf /home/username/ damit die Benutzer ihre Dateien modifizieren können (z.B. chmod -R username:users /home/username).
    • Vergewissere dich, dass die UMASK entsprechend konfiguriert ist - Ich habe Benutzer welche verwirrt sind wenn ihre Dateien nicht automatisch die Reche rwxr-xr-x (755) bekommen, deswegen habe ich die CMASK auf 022 gesetzt ( /etc/default/login).
  7. Teste das Setup - benutze sftp username@hostname.org und versichere dich, dass du nicht aus der Jail raus kommst. Überprüfe auch, dass der normale SSH-Zugang verweigert wird mit: ssh username@hostname.org

Fertig! Du hast jetzt eine sauber eingeschränkte Umgebung für alle deine Benutzer welche selber ihre Dateien auf ihre Web-Seite laden möchten.


Wartung
Achte dich auf OpenSSH Updates - sie erscheinen ziemlich regelmässig. Es ist es also wer sich in der openssh-unix-announce Liste einzutragen. Wenn eine neue Version erscheint kannst du die oben genannten Instruktionen folgen (nicht alle) - zusammengefasst:

  1. Downloade den neusten Tarball und entpacke diesen.
  2. Überprüfe die Version vom sftp-server.c mit der Information ganz oben auf dieser Seite - Wenn es die gleiche ist, kannst du meine benutzen, ansonnsten mache dieselbe modifikationen oder warte bis ich diese Seite auf den neusten Stand gebracht habe.
    Falls du deine version.h wie ich verändert hast, vergiss sie nicht nachzuführen.
  3. Kompiliere und installiere wie oben erklärt.
  4. chmod +s /usr/local/libexec/sftp-server
  5. Teste dein Setup nochmals sorgfältig.

Die sftpsh Shell muss nicht neu kompiliert werden, sie funktioniert unabhängig von der benutzen SSH Version. Die Benutzer-Accounte müssen ebenfalls nicht verändert werden.


Ende
Falls es irgendwelche Versäumnisse oder Fehler im Text haben sollte, oder falls du Verbesserungsvorschläge hast, sende mir eine E-Mail. Ich bin auch gerne bereit Hilfestellung zuleisten, aber ich kann nicht garantieren, dass ich überhaupt eine Hilfe sein kann!

Schlusswort zu SSH: Interaktive login Möglichkeiten übers Internet anzubieten sind nicht empfehlenswert, aber die Umstände veranlassen mich es doch zu tun. Für die SSH/SFTP Sicherheit empfiehlt sich DenyHosts oder ähnliches anzuwenden. Der --with-tcp-wrappers Parameter wurde weiter oben erwähnt.