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
-
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.
-
Extrahiere die source files in einem Verzeichnis.
-
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!
-
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).
-
make
-
make install
-
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...
-
Downloade den Source vom CVS nach den OpenBSD
Instruktionen. Du wirst den Source-Baum unter
/usr/src auffinden.
-
Im letzten Schritt enthalten.
-
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.
-
Nicht spezifiziert.
-
CD nach /usr/src/usr.bin/ssh/
und tippe make
-
CD nach /usr/src/usr.bin/ssh/sftp-server/
und tippe make install
-
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.
-
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.
-
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 ""
-
Kompiliere diese Programm wie folgt: gcc sftpsh.c -o sftpsh
-
Kopiere die neue Shell in dein System Pfad mit:
cp sftpsh /bin
-
Stelle sicher, dass dein System die neue Shell erkennt,
indem sie in der /etc/shells
aufgeführt wird:
echo /bin/sftpsh >>
/etc/shells
-
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).
-
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:
-
Downloade den neusten Tarball und entpacke diesen.
-
Ü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.
-
Kompiliere und installiere wie oben erklärt.
-
chmod +s
/usr/local/libexec/sftp-server
-
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.
|