«

»

Aug 31 2013

Home Cloud Light – SFTP auf dem Raspberry Pi (inkl. fail2ban)

1. Vorwort
2. SSH / SFTP – Installation und Konfiguration
3. ES Datei Explorer – Zugriff einrichten
4. AutoShare – Zugriff einrichten
5. Fail2Ban – Server absichern
6. SFTP – Speicher mit Dolphin öffnen

1. Vorwort
Wer seine Daten lieber auf dem eigenen Speicherplatz weiß und dennoch nicht auf die bequemen Funktionen einer Cloud verzichten möchte (oder kann), der wird eine Weile nach Lösungen suchen können. Man sollte annehmen, dass in Zeiten von Dropbx und Co. zahlreiche Scripte für den heimischen Server bereit stehen. Weit gefehlt – denn neben OwnCloud gibt es nur sehr wenige Alternativen (u.a. Seafile, Ajaxplorer). Diese mögen zwar auf einem schnellen Server auch gut laufen und mit Features glänzen, allerdings kann man auf einem Raspberry Pi an der Geschwindigkeit verzagen. Dabei bietet Linux mit SSH schon alles an, was man für eine „Cloud light“ braucht.

Meine Lösung:
SFTP-Zugang (nicht zu verwechseln mit FTPS)
Datei-Verwaltung im Browser mittels eXtplorer (eXtplorer auf dem Raspberry Pi installieren) und SSL
Datei-Verwaltung mit Android: ES Datei Explorer / AutoShare
Datei-Verwaltung mit Linux über Dolphin

___

2. SSH / SFTP – Installation und Konfiguration
sftp
Quellen:
http://www.gambaru.de/blog/2011/08/11/sicherer-datentausch-ein-sftp-server-mit-chroot/
  Sicherer Datentausch-Ein sftp Server mit chroot (179,8 KiB, 990 Klicks)

http://www.hack-job.org/how-tos/sftp-downloads-to-the-rescue/
  sftp downloads to the rescue (130,9 KiB, 545 Klicks)
http://madapez.com/it/linux/howto-chroot-sftp-zugang-openssh-ohne-shell-ssh/
  Chroot sftp Zugang - openssh (144,6 KiB, 1.782 Klicks)

Ich setze nun voraus, dass SSL schon auf dem Raspberry Pi installiert ist (was in den meisten Beschreibungen der Fall ist) – wenn nicht, dann „sudo apt-get install ssh“ 😉

1. Gruppe „nas“ anlegen:

sudo addgroup nas


Weiter unten habe ich einen Kombinations-Befehl aufgeschrieben, der alle nötigen Schritte zum Anlegen eines neuen Users auf einmal ausführt, ich empfehle jedoch mindestens einmal diesen hier beschriebenen Weg zu gehen, damit ihr wisst, was die Befehle überhaupt bewirken.

2. Wir legen einen User an,
dem vorerst der Zugriff „nur lesen“ gewährt wird.
loader“ steht dabei für den Username. Ihr könnt den Namen frei wählen, müsst dann natürlich unten überall bei loader den gewählten Namen ersetzen.
Mit diesem Namen loggen wir uns dann später in Kombination mit dem Passwort auf dem Server ein.

Es soll sein Home-Verzeichnis automatisch angelegt werden (-m), er soll keinen Shell-Zugang bekommen (-s /bin/false) und er soll der Gruppe „nas“ angehören (-G nas):

sudo useradd -m -s /bin/false -G nas loader
# alt: sudo useradd --create-home --home-dir /home/loader --shell /bin/bash loader

Passwort anlegen:

sudo passwd loader


Home/Loader-Ordner „absichern“

(bzw. dem Benutzer root zuweisen)
Damit erhält der User „loader“ auf seinen home-Ordner nur Lese-Rechte. Später erhält er seinen „eigenen“ Unterordner zum schreiben (uploaden)

sudo chown root.root /home/loader
sudo chmod 0755 /home/loader


optional: Speicherort festlegen

Ich habe nun versucht mittels folgende Anleitung PDF einen USB-Stick einzubinden und diesen als Speicher zu nutzen.
Leider war mir dies bis jetzt nicht möglich, da chroot misslingt. Ansonsten hätte es so ähnlich funktioniert:

sudo mkdir /media/usbstick/loader
sudo chown root.root /media/usbstick/loader
sudo mkdir /media/usbstick/loader/uploads
sudo chown loader.loader /media/usbstick/loader/uploads

Es dürfte ganz schlicht an dem Format der SD Karte gelegen haben. Diese sollte auf NTFS formatiert sein.
Da ich aber nun mit BerryBoot das OS vollständig auf eine externe USB-Festplatte ausgelagert habe, hat sich das Problem erledigt.

Daher weiter mit
Uploadordner für „loader“ anlegen:
Und den Besitzer auf „loader“ setzen. Wir können natürlich beliebig viele Ordner anlegen und diese „loader“ zuordnen. Innerhalb von diesen kann dann loader selbst neue Ordner und Dateien anlegen und verwalten.

sudo mkdir /home/loader/uploads
sudo chown loader.loader /home/loader/uploads


Kombinations-Befehl
für das schnelle Anlegen eines neuen Users.
Einfach den gewünschten Username bei neuerbenutzername=’karlheinz‘ eingeben (in diesem Fall natürlich „karlheinz“ ersetzen). Der Benutzer erhält dann automatisch seinen Upload Ordner (hier „ups“ genannt)

neuerbenutzername='karlheinz'    && sudo useradd -m -s /bin/false -G nas $neuerbenutzername && sudo passwd $neuerbenutzername && sudo chown root.root /home/$neuerbenutzername && sudo chmod 0755 /home/$neuerbenutzername && sudo mkdir /home/$neuerbenutzername/ups && sudo chown $neuerbenutzername.$neuerbenutzername /home/$neuerbenutzername/ups && sudo /etc/init.d/ssh restart


3. ssh config öffnen:

sudo nano /etc/ssh/sshd_config

Dort einfügen (damit wird nach dem Gruppenzugehörigkeit geschaut und der User dann in sein Verzeichnis eingesperrt. Zudem wird sftp erzwungen):

Match group nas
      ChrootDirectory /home/%u
      X11Forwarding no
      AllowTcpForwarding no
      ForceCommand internal-sftp
Match

( Wenn der Stick funktioniert, sieht die ChrootDirectory Zeile so aus:
„ChrootDirectory /media/usbstick/%u“ )
Damit würde ich auf den USB Stick verweisen, welchen ich nach dieser Anleitung eingebunden habe.
Ein Ordner mit dem entsprechenden Username (hier loader) muss vorhanden sein. Dieser muss „root“ gehören. Ein Unterordner „uploads“ muss hingegen dem User „loader“ gehören. Daran scheiterte das USB-Vorhaben.

Ganz wichtig: jetzt ssh neustarten

sudo /etc/init.d/ssh restart


4. Der Test:

sftp loader@192.168.xx.yy

sollte als Ergebnis liefern:
Connected to 192.168.xx.yy.

hingegen die SSH Verbindung sollte unterbunden sein:

ssh loader@192.168.xx.yy

sollte als Ausgabe liefern:
This service allows sftp connections only.
Connection to 192.168.1.123 closed.

Um einen User später wieder zu löschen, genügt folgender Befehl:

deluser username

___

3. ES Datei Explorer – Zugriff einrichten


Funktioniert nun der SSH-Zugang können wir uns an die Konfiguration des ES Datei Explorers machen. Dieses Programm ist im Google Play-Store kostenlos zu haben und meiner Meinung nach die beste Datei-Verwaltung für Android. Neben zahlreichen Features (z.B. Cload-Unterstützung) und Tools (wie z.B. ein Tool zum Bereitstellen der Dateien auf dem Gerät über FTP) hat der ES Datei Explorer eben auch eine SFTP Client Funktion. XDA-Developers Link (engl.)

ES Datei Explorer Schnellzugriff

Nun unten-links auf das „+“ klicken (für neuen Server) -> SFTP wählen und die entsprechenden Daten eingeben. Fertig. Die Dateien lassen sich nun verwalten, als wären sie lokal auf dem Smartphone.

___

4. AutoShare – Zugriff einrichten
autoshare
Auto Share im PlaystoreXDA Developers Beitrag
AutoShare ist ein kleines Tool, welches das schnelle Hinzufügen von Dateien in unsere Cloud ermöglicht. Dabei können Bilder und andere Inhalte wie gewohnt über den Teilen-Button verschickt werden. AutoShare lädt diese dann im Hintergrund hoch (oder verschickt diese per Mail oder oder oder). Für meinen Zweck habe ich nur die SFTP Funktion aktiviert. Alternativ würde auch AndFTP funktionieren, allerdings finde ich es etwas zu mächtig für die einfache Senden-Aufgabe. Wer jedoch den ES-Datei-Explorer nicht benutzen möchte, der ist mit AndFTP sehr gut beraten.

Im PlayStore steht zu AutoShare:
„Weiterleiten von Inhalten wie Text, Links oder Bilder per E-Mail, HttpPost, ftp, Sftp, Dropbox oder Box ohne weitere Interaktion des Benutzers. Ohne jedesmal die gewünschte E-Mail-Adresse eingeben zu müssen.
Offline Weiterleiten: Verzögertes senden nur im WLAN ist ebenfalls möglich.
Wie mit Google+ teilen Sie Ihre Fotos sofort nach der Aufnahme(optional).“

Die Einrichtung sollte selbsterklärend sein.

___

5. Fail2Ban – Server absichern
fail2ban

Zu guter Letzt sollten wir eine zusätzliche Absicherung nach außen vornehmen. SSH habt ihr hoffentlich aktiviert (und ruft natürlich eure Verwaltung im Browser nur mit https auf) 😉
Da die Ports für uns offen sind, wird nun natürlich auch von bestimmten Netz-Nutzern versucht, in das System dahinter einzudringen. Eine Methode ist das s.g. Brute-Force (Wikipedia), bei welcher durch zahlloses Versuchen ein Erraten des Passworts erfolgt. Um dem einen Riegel vor zu schieben, begrenzen wir die Versuche und sperren danach die IP für eine bestimmte Zeit. Das ist kein Allheilmittel, aber eben ein zusätzlicher Schutz. Wer nur von bestimmten IP-Adressen zugreift, kann natürlich eine Whitelist für diese erstellen und alle anderen aussperren.

Fail2Ban prüft die Logfiles der aktivierten Programme und wenn o.g. Versuch erkannt wird, erfolgt die Sperre.
Die Installation ist denkbar einfach (Quelle: http://www.myslug.de/index.php?title=Firewalling:_iptables_und_Fail2Ban )

Fail2Ban installieren:

sudo apt-get install fail2ban

Falls noch nicht automatisch geschehen, auch whois installieren:

sudo apt-get install whois

Konfigurationsdatei jail.conf nach jail.local kopieren:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Konfiguration bearbeiten:

sudo nano /etc/fail2ban/jail.local

„bantime = XYZ“ nach Wunsch ändern (600 Sekunden = 10 Minuten)
„maxretry“ gibt die maximale Anzahl der Versuche an.
„ignoreip“ sollte die feste IP eines PC im Netzwerk sein, mit dem ihr auf jeden Fall zugreifen können wollt.

SSH / SFTP ist schon aktiviert, wir können jedoch auch gleich noch den Lighttpd mit in die Überwachungsliste nehmen, indem wir am Ende folgendes anhängen:

[lighttpd-fastcgi]
enabled = true
port    = http,https
filter  = lighttpd-fastcgi
logpath = /var/log/lighttpd/error.log #anpassen wenn nötig
maxretry = 2

speichern und fail2ban neustarten:

sudo /etc/init.d/fail2ban restart

Noch ein paar Informationen zu Fail2Ban:

1. Die aktuelle log findet ihr unter

cat /var/log/fail2ban.log

2. Um eine geblockte IP wieder frei zu geben, geht wie folgt vor:

sudo iptables -L -n

Nun nach „Chain fail2ban-xyz“ suchen und den genauen Namen merken. Auch die Dazugehörige „DROP“ Position der IP-Adresse.
Beispiel (4.8.15.16 soll wieder frei gegeben werden):

Chain fail2ban-vsftpd (1 references)
target prot opt source destination
DROP 0 — 123.123.123.123 0.0.0.0/0
DROP 0 — 4.8.15.16 0.0.0.0/0
RETURN 0 — 0.0.0.0/0 0.0.0.0/0

Ihr merkt euch also „fail2ban-vsftpd“ und die Position 2 ( auf der 1. steht 123.123.123.123 )
Gebt nun ein:

sudo iptables -D fail2ban-vsftpd 2

Fertig.

___

6. SFTP – Speicher mit Dolphin öffnen

Der Zugriff unseres SFTP Speichers ist in Dolphin ein Kinderspiel. Einfach wie auf dem Bild zu sehen die IP Adresse eingeben und mit Enter bestätigen. Danach erscheint ein Dialog zur Eingabe des Usernamen und Passworts. Diesen ausfüllen und abschicken und schon habt ihr Zugriff auf euer NAS.
sftp_in_dolphin

Downloads

  Sicherer Datentausch-Ein sftp Server mit chroot (179,8 KiB, 990 Klicks)
  sftp downloads to the rescue (130,9 KiB, 545 Klicks)
  Chroot sftp Zugang - openssh (144,6 KiB, 1.782 Klicks)

8 Kommentare

Zum Kommentar-Formular springen

  1. dingdong

    erstmal vielen dank für diesen beitrag.

    aber ist denn die verwendung von ssl denn noch sinnvoll?

    http://www.spiegel.de/politik/ausland/nsa-und-britischer-geheimdienst-knacken-systematisch-verschluesselung-a-920710.html

    1. Marco

      Hi,

      ich denke schon, dass eine Verschlüsselung sinnvoll ist, denn besser eine haben, die von hoher Stelle geknackt wird, als gar keine haben, wodurch dann Hans und Franz mitlesen könnten 😉

      Viele Grüße

  2. Daniel

    Klasse tutorial, nur habe ich da ein Problem wenn ich den nutzer angelegt habe.
    Wenn ich mich nun per sftp einloggen will (mit winSCP) kommt immer Authentication failed.

    Ich habe alles befolgt, bis auf ne Kleinigkeit, das der user cloud bei mir heißt und das homedir nicht unter /home sondern auf einer 2. internen HDD mittels -d /pfad/zum/home/dir erstellt wurde. (kleine anmerkung, unter /home geht es auch nicht)

    Wo könnte das Problem sein?

  3. Andreas

    Sehr gute Anleitung.
    Was mich aber an der Stelle noch interessieren würde: Wie macht man dann einen Ordner auch von außerhalb, über das Internet, zugänglich? So dass ich also von überall auf meine Daten zugreifen kann.

    1. Marco

      Du richtest im Router ein Portforwarding / Portweiterleitung auf den RPi ein.

      Beispiel: dein Raspberry ist im Netzwerk unter 192.168.1.50 erreichbar. Nun stellst du im Router ein, dass Zugriffe über die SFTP Ports direkt auf diese IP weiter geleitet werden.
      Nun kannst du schon von außerhalb (mittels SFTP Client) über deine „Internet-IP“ darauf zugreifen. Wenn dein Router jetzt noch DynDNS Anbieter unterstützt, musst du dir nicht einmal diese IP merken. Ich hoffe dir etwas geholfen zu haben.

      Viele Grüße
      Marco

  4. Roque

    Hi,

    die Anleitung zum Einsatz fail2ban ist Dir gelungen. Eine Frage hätte ich aber noch dazu, wobei ich davon ausgehe, dass die fail2ban Konfigurationsdatei jail.conf ist.

    Also. Wozu ist das Kopieren der Konfigurationsdatei jail.conf nach jail.local notwendig, wenn die Änderungen nur an der jail.local durchgeführt werden, d.h. in der jail.conf aber nicht zur Verfügung stehen.

    Oder greift fail2ban auch auf die jail.conf zu?

    Gruß Roque

    1. Marco

      Hallo,

      Meines Wissens greift es auf die jail.local zu, daher auch die Anpassung in dieser.

      Viele Grüße

  5. GnuRip

    Hi,

    ich bin grad bei der Suche danach wie ich einem sftp Nutzer verbiete aus seinem home Verzeichnis zu gehen auf diesen Eintrag gestoßen.
    Danke schonmal dafür.

    Eine Anmerkung zu Abschnitt 2.3 weil man sich damit ganz schön ins Knie schießen kann.
    In aktuellen Versionen darf es in der /etc/ssh/sshd_config keine Zeile geben die nur „Match“ beinhaltet. Da geht der ssh Dienst in den failed Zustand.

    In der Man page dazu steht:

    „If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the global section of the config file, until either another Match line or the end of the file.“

    Es wird also kein Ende des Match Blocks angegeben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>