{"id":3304,"date":"2011-08-11T01:45:33","date_gmt":"2011-08-10T23:45:33","guid":{"rendered":"https:\/\/www.gambaru.de\/blog\/?p=3304"},"modified":"2011-08-11T01:45:33","modified_gmt":"2011-08-10T23:45:33","slug":"sicherer-datentausch-ein-sftp-server-mit-chroot","status":"publish","type":"post","link":"https:\/\/gambaru.de\/blog\/2011\/08\/11\/sicherer-datentausch-ein-sftp-server-mit-chroot\/","title":{"rendered":"Sicherer Datentausch: Ein sftp-Server mit chroot"},"content":{"rendered":"<p>Vor zwei Jahren wollte ich mehrere 100 MB an Fotos mit ein paar Freunden teilen, die sich nach einem gemeinsamen Urlaub angesammelt hatten. Damals waren Dropbox und \u00e4hnliche Dienste noch nicht ganz so pr\u00e4sent wie heute. Au\u00dferdem war es eine gute Gelegenheit mehr \u00fcber FTP- und SSH-Server zu lernen und manch bekennenden Windowsnutzer ordentlich zu verwirren: \"Ja, du musst ssh benutzen. Es gibt keine andere M\u00f6glichkeit um an die Fotos zu gelangen.\" haha \ud83d\ude08<br \/>\nZu dieser Zeit sollte es unbedingt ein sftp-Server sein, da ich f\u00fcr viele andere Aufgaben sowieso schon ssh einsetzte. Damit spart man sich das Einrichten eines zus\u00e4tzlichen ftp-Servers und erh\u00e4lt gleichzeitig noch eine sichere Methode zum Datenaustausch dazu.<br \/>\nDie folgende Anleitung beschreibt die Einrichtung eines ssh-Servers, der f\u00fcr eine Gruppe von Benutzern nur als sftp-Server zug\u00e4nglich sein soll. Alle User werden dabei in einer chroot-Umgebung eingesperrt und Shell-Zugriff verwehrt um die Sicherheit auf dem Server zu erh\u00f6hen. Als Beispiel dient mir der Benutzer mika und die Gruppe freunde. Das HowTo sollte mit jeder auf Debian basierenden Distribution funktionieren und sich mit jeder anderen nachvollziehen lassen.<\/p>\n<h3>Installation<\/h3>\n<blockquote><p>aptitude install ssh<\/p><\/blockquote>\n<h3>Anlegen der f\u00fcr sftp berechtigten Nutzer und der Gruppe freunde<\/h3>\n<blockquote><p>adduser mika<br \/>\naddgroup freunde<br \/>\nadduser mika freunde<\/p><\/blockquote>\n<h3>Absichern des Chroot Verzeichnisses<\/h3>\n<blockquote><p>chown root.root \/home\/mika<\/p><\/blockquote>\n<p>Mikas Heimverzeichnis sollte im Besitz von root sein, damit er effektiv darin eingesperrt ist und er standardm\u00e4\u00dfig keine Dateien auf dem Server hochladen kann. Da aber ein Datenaustausch auch manchmal in umgekehrter Richtung sinnvoll sein kann, gen\u00fcgt es, einen Ordner wie upload in diesem Verzeichnis zu erstellen und ihn Mika mit<\/p>\n<blockquote><p>chown mika.mika \/home\/mika\/upload<\/p><\/blockquote>\n<p>zu \u00fcberantworten.<\/p>\n<h3>Konfiguration von \/etc\/ssh\/sshd_config<\/h3>\n<h4>Notwendige Sicherheitsvorkehrungen<\/h4>\n<ul>\n<ul>\n<li><strong>Port 42123<\/strong><\/li>\n<\/ul>\n<\/ul>\n<p>Der Standardport f\u00fcr SSH ist 22. Mit dieser Variablen l\u00e4sst sich der Listen Port z.B. auf 42123 f\u00fcr den Server \u00e4ndern. Das macht den Server zwar kein bisschen sicherer (security through obscurity), hilft aber unter Umst\u00e4nden die Existenz des ssh-Servers zu verschleiern.<\/p>\n<ul>\n<ul>\n<li><strong>PermitRootLogin no<\/strong><\/li>\n<\/ul>\n<\/ul>\n<p>Wenn ein Angreifer root werden m\u00f6chte, muss er mit dieser Einstellung mindestens noch das Passwort eines weiteren Users auf dem Server kennen.<\/p>\n<ul>\n<ul>\n<li><strong>PermitEmptyPasswords no<\/strong><\/li>\n<\/ul>\n<\/ul>\n<p>SSH-Nutzer ohne Passwort sind nat\u00fcrlich ein Unding. Obwohl ich mir gut vorstellen kann, dass man das als eine weitere M\u00f6glichkeit zu \"<a href=\"https:\/\/www.gambaru.de\/blog\/2011\/07\/03\/was-man-mit-alten-computern-machen-kann\/\">Was man mit alten Computern machen kann<\/a>\" hinzuf\u00fcgen k\u00f6nnte. Anstatt selbst zu lernen wie man in den eigenen alten Rechner einbricht, k\u00f6nnte man das doch auch andere tun lassen... \ud83d\ude09<\/p>\n<ul>\n<ul>\n<li><strong>Subsystem sftp internal-sftp<\/strong><\/li>\n<\/ul>\n<\/ul>\n<p>Das aktiviert sshds internen sftp-Service. Normalerweise verweist Subsystem sftp auf eine ausf\u00fchrbare Bin\u00e4rdatei wie z.B. <em>\/usr\/lib\/openssh\/sftp-server<\/em>. Diese muss durch den internen Dienst ersetzt werden.<br \/>\nAm Ende der \/etc\/ssh\/sshd_config sollte dann folgender Match-Eintrag hinzugef\u00fcgt werden.<\/p>\n<pre class=\"brush:plain\">Match group freunde\n      ChrootDirectory \/home\/%u\n      X11Forwarding no\n      AllowTcpForwarding no\n      ForceCommand internal-sftp\n<\/pre>\n<p>Der Match-Block gilt nur f\u00fcr die Gruppe freunde und jeden Nutzer, der sich darin befindet. Mika kann sich deswegen nur per sftp mit dem Server verbinden und landet danach im festgelegten Chroot-Verzeichnis. Der Shell Zugriff mit ssh wird effektiv unterbunden. Das Chroot muss nicht zwangsl\u00e4ufig mit Mikas Homeverzeichnis \u00fcbereinstimmen und kann beliebig gew\u00e4hlt werden. Der Parameter <strong>%u<\/strong> wird durch den eingeloggten Nutzer ersetzt.<\/p>\n<h3>Der erste Test<\/h3>\n<p>Jetzt ist es an der Zeit den OpenSSH-Server neuzustarten. Als SFTP-Klienten eignen sich sp\u00e4ter z.B. das Firefox Addon Fireftp, Filezilla, WinSCP f\u00fcr Windows oder ganz einfach das Kommandozeilenprogramm sftp.<\/p>\n<blockquote><p>\/etc\/init.d\/ssh restart<\/p><\/blockquote>\n<p>Danach sollte der sftp-Zugriff f\u00fcr Mika am Beispielrechner 192.168.0.200 funktionieren.<\/p>\n<blockquote><p>sftp -P 42123 mika@192.168.0.200<\/p><\/blockquote>\n<p>und der ssh-Zugriff verwehrt werden<\/p>\n<blockquote><p>ssh -p 42123 mika@192.168.0.200<\/p><\/blockquote>\n<h3>DynDNS.org<\/h3>\n<p>Es ist zwar sch\u00f6n, dass der Server nun in unserem internen Netzwerk funktioniert, aber irgendwie m\u00fcssen die Freunde von au\u00dferhalb darauf zugreifen k\u00f6nnen. Die meisten werden sicherlich eine dynamische IP vom Provider zugewiesen bekommen, weshalb es Sinn macht einen kostenlosen DNS-Dienst wie z.B. <a href=\"http:\/\/dyn.com\/dns\/dyndns-free\/\">dyndns.org<\/a> zu benutzen, um eine leicht zu merkende URL wie z.B. <strong>4freunde.dyndns.org<\/strong> zu erhalten.<br \/>\nNachdem man sich bei dyndns.org angemeldet hat, muss man dem Dienst auf irgendeine Art noch mitteilen wie die aktuelle IP-Adresse des Heimservers lautet. Dazu bietet sich z.B. <a href=\"http:\/\/packages.debian.org\/ddclient\">ddclient<\/a> an. Bei der Installation wird man nach Login und Passwort bei dyndns.org gefragt und kann ansonsten die Standardeinstellungen verwenden.<br \/>\nSollte man eine Firewall einsetzen oder wie ich einen Router mit eingebauter Firewall haben, dann muss nur noch der SSH-Dienst mit Hilfe von PortForwarding an den Zielserver und Port 42123 weitergeleitet werden. Danach kann sich dann Mika von \u00fcberall auf der Welt mit<\/p>\n<blockquote><p>sftp -P 42123 mika@4freunde.dyndns.org<\/p><\/blockquote>\n<p>auf dem Heimserver einloggen.<\/p>\n<h3>Last but not least - Denyhosts<\/h3>\n<p>Wenn man seinen Server eine Weile laufen l\u00e4sst und spa\u00dfeshalber mal die Datei <strong>\/var\/log\/auth.log<\/strong> \u00f6ffnet, fallen einem die regen Zugriffsversuche auf...die allesamt nicht von den Freunden stammen. Willkommen im Internet! John Doh und Nihao versuchen mit Brute-Force-Attacken in den ssh-Server einzubrechen. Eine wirksame Methode das zu unterbinden ist z.B. <a href=\"http:\/\/packages.debian.org\/denyhosts\">denyhosts<\/a> oder noch besser gleich den <a href=\"https:\/\/gambaru.de\/blog\/2012\/03\/19\/ssh-schlussel-port-andern-und-anmeldung-als-root-verwehren\/\">SSH-Port \u00e4ndern und auf SSH-Schl\u00fcssel<\/a> umstellen.<br \/>\nBei Debian konnte ich nach der Installation mit den Voreinstellungen sehr gut leben. Die Datei <strong>\/etc\/denyhosts.conf<\/strong> ist aber hervorragend kommentiert und l\u00e4sst sich leicht an die eigenen W\u00fcnsche anpassen. Das Programm registriert fehlgeschlagene Logins und setzt die IP Adresse des Angreifers nach einer festgelegten Anzahl von Versuchen in die Datei <strong>\/etc\/hosts.deny<\/strong>, womit jeder weitere Loginversuch verwehrt wird. Es gibt noch viele weitere M\u00f6glichkeiten einen Mi\u00dfbrauch zu verhindern. Ich fand damals <a href=\"http:\/\/www.heise.de\/security\/artikel\/SSH-vor-Brute-Force-Angriffen-schuetzen-270140.html\">diesen Heise-Artikel<\/a> zum Thema sehr lesenswert. Wenn man sehr restriktiv ist und vielleicht sogar die IP-Adresse der Freunde kennt, kann man auch alle Zugriffe mit Hilfe von <em>\/etc\/hosts.allow<\/em> und <em>\/etc\/hosts.deny<\/em> verbieten und nur ausgew\u00e4hlte IPs erlauben.<br \/>\nSSH ist ein ausgesprochen vielseitiges und n\u00fctzliches Werkzeug. Als Beweis, dass ich nicht der Einzige bin, der positive Erfahrungen mit ssh gemacht hat, hier mal ein Link zu keros Artikel \"<a href=\"http:\/\/exdc.net\/2011\/07\/15\/sperr-mich-ein-baby\/\">sperr mich ein baby<\/a>\".<\/p>\n<h3>Meine Quellen<\/h3>\n<ul>\n<li><a href=\"http:\/\/www.debian-administration.org\/articles\/590\">Debian Administration - OpenSSH SFTP chroot() with ChrootDirectory<\/a><\/li>\n<li>man sshd_config<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Vor zwei Jahren wollte ich mehrere 100 MB an Fotos mit ein paar Freunden teilen, die sich nach einem gemeinsamen Urlaub angesammelt hatten. Damals waren Dropbox und \u00e4hnliche Dienste noch nicht ganz so pr\u00e4sent wie heute. Au\u00dferdem war es eine gute Gelegenheit mehr \u00fcber FTP- und SSH-Server zu lernen und manch bekennenden Windowsnutzer ordentlich zu &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/gambaru.de\/blog\/2011\/08\/11\/sicherer-datentausch-ein-sftp-server-mit-chroot\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eSicherer Datentausch: Ein sftp-Server mit chroot\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[53,178,184,202],"_links":{"self":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/3304"}],"collection":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/comments?post=3304"}],"version-history":[{"count":0,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/posts\/3304\/revisions"}],"wp:attachment":[{"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/media?parent=3304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/categories?post=3304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gambaru.de\/blog\/wp-json\/wp\/v2\/tags?post=3304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}