In dieser Artikelserie möchte ich meine Erfahrungen zusammenfassen, die ich beim Einrichten meiner eigenen privaten Wolke auf einem Raspberry Pi gemacht habe. Dabei haben mir hauptsächlich die Artikel von Jan Karres sehr weitergeholfen. Da ich aber ein anderes Setup hatte und seine Artikel nun auch schon einige Jährchen auf dem Buckel haben, möchte ich meine einzelnen Schritte (auch für mich zum späteren Erinnern) hier aufzeigen. Insbesondere, was das Setup von Radicale und Seafile angeht, hat sich da einiges geändert.
Ich habe mich entschlossen, dies als Artikelserie umzusetzen, da für einige Nutzer vielleicht nur das eine (oder andere) von Interesse ist. Los geht es mit dem Wichtigsten: der Inbetriebnahme des Raspberry Pi. Die weiteren Teile findet man hier:
- Teil 2: Einrichten von Radicale als Kontakt- und Kalenderserver
- Teil 3: Einrichten von Seafile als Cloud-Speicher
Bevor es los geht, möchte ich allerdings darauf hinweisen, dass dieser Artikel nach bestem Wissen und Gewissen zusammengestellt wurde. Es funktioniert bei mir alles tadellos, aber ob es im Endeffekt ein sicheres Setup ist, kann nur ein IT-Fachmann beurteilen. Da ich so einer nicht bin, kann ich auch keine Gewährleistung für auftretende Schäden übernehmen. Einen Großteil der Informationen in diesem Artikel habe ich neben den oben genannten Quellen auch in anderen Quellen von Fachleuten wiedergefunden, sodass es ein gängiges Setup darstellen sollte. Für Hinweise und Verbesserungen bin ich natürlich offen und passe diese Anleitung dann auch dementsprechend an.
Vorwort
Um auf meinen Computern und Telefon Dateien sowie Kontakt- und Kalenderdaten austauschen zu können, hatte ich am Anfang verschieden Clouddienste wie Dropbox, UbuntuOne, Google Kontakte und Google Kalender genutzt.
Irgendwann wollte ich die Daten aber gerne unter der eigenen Kontrolle haben und habe angefangen, meine eigenen Dienste dafür auf dem eigenen Webspace aufzusetzen. Am Anfang habe ich mit Owncloud experimentiert, bin dann aber schnell bei Seafile als Dropbox-Ersatz gelandet, da es performanter und zuverlässiger war als die damaligen Owncloud-Versionen. Gleichzeitig entdeckte ich Baïkal-Server als Kontakt- und Terminserver. Mittlerweile nutze ich diese Kombination seit mehreren Jahren auf einem gehosteten Server ohne jegliche Probleme.
Somit war für mich schnell klar, dass ich diese Software auch für meine eigene kleine Wolke nutzen wollte. Bei der Recherche stellte sich nun aber heraus, dass Baïkal (vorerst) nicht weiter entwickelt wird. Daher macht es keinen Sinn, eine Anleitung für eine Software zu schreiben, welche schnell veraltet sein wird. Als Alternative werde ich daher Radicale nutzen, ein ebenso schlanker Open-Source-Kontakt- und Terminserver.
Hardware und Software
Für meine Wolke nutze ich folgende Hardware-Ausstattung:
- Raspberry Pi 1 Modell B+ als Server
- SanDisk microSD-Karte mit 16 GB Kapazität für das Betriebssystem
- Western Digital PiDrive mit 314 GB als Datenspeicher
- Netzteil mit mindestens 2A Output, da die Festplatte mitversorgt werden muss
- Fritz!Box als Router
Diese Anleitung basiert auf folgenden Software-Versionen:
- Raspbian 9 (Stretch)
- Seafile Server 6.2.3 for Raspberry Pi
Baïkal Server 0.4.6- Radicale 2.1.8
- Nginx Webserver 1.10.3
Für die Einrichtung werden keine zusätzlichen Monitore, Tastaturen oder Mäuse benötigt. Es wird alles über einen externen Rechner bzw. über SSH eingerichtet.
Vielleicht auch wichtig vorab: Ich nutze nur Linux auf meinen Rechnern bzw. Android auf meinem Telefon als Betriebssystem, sodass ich keine Aussagen zu MacOS oder Windows tätigen kann.
Schritt 1: Raspbian installieren
Als Betriebssystem habe ich mich für Raspbian entschieden, da es zum Einen als offizielles Betriebssystem von der Raspberry Pi Foundation zur Verfügung gestellt wird und speziell an den Raspberry Pi angepasst ist. Zum Anderen benötigte ich ein Betriebssystem, welches sehr stabil läuft, da ich möglichst immer an meine Daten herankommen möchte.
Schritt 1a: Raspbian herunterladen
Eine aktuelle Version von Raspbian findet man auf der Downloadseite der Raspberry Pi Foundation. Ist die Datei heruntergeladen, kann man sie entpacken und erhält eine Image-Datei (IMG).
Schritt 1b: Das Image auf die SD-Karte übertragen
Mit Hilfe des Linux-Werkzeugs dd wird das Image dann auf die SD-Karte übertragen. Dabei nutzt man folgenden Befehl:
dd bs=1M if=/Pfad/zur/Image-Datei of=/Pfad/zur/SD-Karte
Dabei bedeutet die Option bs=1M
, dass das Image nur in 1-Megabyte-Blöcken gelesen und geschrieben werden soll. Bei der Angabe if=
muss der richtige Pfad zur Imagedatei angegeben werden. Bei der Angabe of=
muss der richtige Pfad zur SD-Karte angegeben werden.
Nachdem das Image auf die SD-Karte übertragen wurde, sollten auf dieser 2 Partitionen vorhanden sein: eine ca. 40 MB kleine FAT32-Partition (die Boot-Partition) und eine ca. 1,7 GB große ext4-Partition (die Raspbian-Partition)).
Da diese Anleitung für den Fall gedacht ist, dass man keinen zusätzlichen Monitor für den RasPi hat bzw. benötigt, muss man auf diesen per SSH zugreifen. Seit November 2016 ist SSH bei den Raspbian-Releases standardmäßig deaktiviert. Um es zu aktivieren, erstellt man eine Textdatei mit dem Namen ssh. Dabei ist es vollkommen egal, was in der Datei drin steht. Sie kann auch leer sein. Hauptsache, sie heißt ssh ohne eine Endung.
Diese Datei kopiert man dann in die Boot-Partition der SD-Karte. Wenn im nächsten Schritt der RasPi gestartet wird, sucht das System nach der ssh-Datei. Wenn sie gefunden wird, wird automatisch SSH aktiviert und die Datei gelöscht.
Schritt 1c: Raspberry Pi für die Installation von Raspbian vorbereiten
Die SD-Karte kann man dann in den Raspberry Pi einsetzen. Bevor der Raspberry Pi mit Strom versorgt wird, sollte er dann noch über ein Ethernet-Kabel mit der Fritzbox verbunden werden. Danach kann der RasPi gestartet werden.
Schritt 2: Raspbian Konfigurieren
Schritt 2a: Grundeinstellungen konfigurieren
Nun kann man sich über SSH mit dem RasPi verbinden. Dazu öffnet man ein Terminalfenster und gibt folgenden Befehl ein:
ssh pi@192.168.200.101
Die IP-Adresse muss dabei an die eigene angepasst werden. Hier ist es empfehlenswert, dem RasPi in der Weboberfläche des Routers eine feste IP zuzuweisen.
Nach der Eingabe des Befehls wird man nach dem Passwort gefragt, welches standardmäßig raspberry lautet.
Ist man eingeloggt, ruft man mit folgendem Befehl dann das Konfigurationsmenü des RasPi auf:
sudo raspi-config
Es öffnet sich ein Konfigurationsmenü, in dem man als Erstes den Punkt Advanced Options >> Expand Filesystem auswählt. Damit wird die Partition, auf der sich das Raspbian befindet auf die ganze SD-Karte erweitert.
Als nächstes geht man zum Punkt Localisation Options >> Change locale. Man wählt die Option de_DE.UTF-8 UTF-8 mit der Leertaste aus und bestätigt dies mit der Auswahl der OK-Schaltfläche. Danach wird man gefragt, welche Sprache anderssprachige Anwendungen wählen sollen. Hier wählt man en_GB.UTF-8 aus.
Zurück im Hauptmenü wählt man Localisation Options >> Change Timezone und stellt die richtige Zeitzone ein.
Alle anderen Optionen lassen wir erst einmal unangetastet. Als Abschluss geht man im Hauptmenü auf Finish und bestätigt, dass man den RasPi neu starten möchte. Damit wäre der Raspberry Pi erstmal konfiguriert und vollständig lauffähig.
Man sollte allerdings noch einige weiterführende Schritte durchführen, um das System für den eigentlichen Bestimmungszweck vorzubereiten
Schritt 2b: Raspbian aktualisieren
Mit dem unten stehenden Befehl bringt man das Betriebssystem erst einmal auf den aktuellsten Stand.
sudo apt-get update && sudo apt-get upgrade
Schritt 2c: Den SWAP erweitern (optional)
Nicht zwingend notwendig, bei manchen Modellen aber hilfreich, ist es, einen Zwischenspeicher (SWAP) zu nutzen, um im Fall der Fälle den RAM virtuell erweitern zu können. Das ist zwar nicht so performant, wie echter RAM, aber immer noch besser, als zu wenig RAM zur Verfügung zu haben. Dafür muss man zunächst mit den beiden Zeilen unten zunächst eine SWAP-Datei erzeugen.
sudo su -c 'echo "CONF_SWAPSIZE=1024" > /etc/dphys-swapfile' sudo dphys-swapfile setup
Im Anschluss muss der SWAP noch aktiviert werden:
sudo dphys-swapfile swapon
Schritt 3: Raspbian absichern
Vier weitere (optionale) Schritte betreffen die Absicherung des Systems. Sie sind nicht zwingend notwendig, aber wenn man den RasPi mit der Zielstellung betreibt, auch aus dem Internet darauf zugreifen zu wollen, dann sind diese Schritte für eine bessere Absicherung empfehlenswert.
Schritt 3a: SSH-Port ändern
Der Standard-SSH-Port ist 22. Um es potentiellen Angreifern ein bisschen schwieriger zu machen, kann man den SSH-Port ändern:
Zunächst meldet man sich wieder am RasPi an (falls man nicht schon aus den vorherigen Schritten sowieso schon angemeldet ist). Dann öffnet man die SSH-Konfiguration mit dem Konsolen-Editor nano.
sudo nano /etc/ssh/sshd_config
Ziemlich weit am Anfang steht ein Zeile:
#Port 22
Diese ersetzt man durch den gewünschten Port (!!!Achtung!!!: die Raute # am Anfang entfernen):
Port 1027
Dabei ist darauf zu achten, dass der Port durch keinen anderen Dienst beansprucht wird (Eine Liste standardisierter Portnutzungen findet man in Wikipedia).
Man verlässt den Editor mit Strg+X und bestätigt mit Y und Enter, dass man die Datei auch speichern möchte. Danach muss der SSH-Dienst noch neu gestartet werden.
sudo /etc/init.d/ssh restart
In Zukunft wird einfaches Einloggen wie in Schritt 2a nicht mehr funktionieren. Man muss nun zusätzlich den Port mit angeben, da der Standard-Port ja geändert wurde:
ssh pi@192.168.200.101 -p 1027
Schritt 3b: Standard-Benutzer ändern
Ein noch wichtigerer Schritt ist aber eigentlich den Standard-Nutzer zu ändern, da dieser allgemein bekannt ist. Dadurch muss ein potentieller Angreifer nicht nur den SSH-Port ermitteln, sondern auch den Benutzernamen und das Passwort.
Dafür muss man zunächst einen temporären Nutzer anlegen, mit dem man dann den Benutzer pi umbenennen kann:
sudo adduser --no-create-home temp
temp ist in diesem Fall der temporäre Nutzer. Die Option no-create-home sorgt dafür, dass für diesen Nutzer kein Home-Verzeichnis angelegt wird. Man wird auch direkt zur Eingabe eines Passworts aufgefordert. Die restlichen Fragen kann man mit Enter einfach die Default-Werte setzen.
Den temporären Nutzer muss man in die sudoers-Datei schreiben, damit er später auch Root-Rechte bekommen kann:
sudo visudo
Als letzte Zeile fügt man folgende ein (wobei temp für den Namen des temporären Nutzers steht):
temp ALL=(ALL) NOPASSWD: ALL
Den Editor kann man wieder mit Strg+X, Y und Enter verlassen. Man loggt sich nun mit dem Befehl logout aus und loggt sich als temporärer Nutzer temp wieder ein.
Als nächstes wird der Benutzername und das Home-Verzeichnis von pi geändert (in diesem Beispiel soll der neue Benutzer hotzenplotz heißen):
sudo usermod --move-home --login hotzenplotz --home /home/hotzenplotz pi
Die Benutzergruppe sollte genauso heißen wie der neue Benutzername (in diesem Beispiel wieder hotzenplotz):
sudo groupmod -n hotzenplotz pi
Der temporäre Benutzer temp hat seine Schuldigkeit getan, sodass wir ihn aus der sudoers-Datei wieder herausnehmen können. Wir tauschen ihn einfach durch den neuen Benutzer (in diesem Beispiel hotzenplotz) aus.
sudo visudo
temp ALL=(ALL) NOPASSWD: ALL
hotzenplotz ALL=(ALL) NOPASSWD: ALL
Nach erfolgter Änderung und Abspeichern mit Strg+X, Y und Enter loggt man sich wieder aus und meldet sich mit dem neuen Benutzer an (da ja nur Name und Home-Verzeichnis umbenannt wurde, lautet das Passwort weiterhin (noch) raspberry). Den temporären Benutzer braucht man nun nicht mehr, sodass er gelöscht werden kann:
sudo deluser temp
Als letzten Schritt sollte man noch das Passwort in ein weniger leicht erratbares ändern.
passwd
Schritt 3c: Root-Login über SSH verhindern
Da man sich mit dem neuen Benutzer auf dem RasPi einloggt und mittels sudo Root-Rechte erlangt, wird ein direkter Root-Zugriff über SSH nicht benötigt, sodass dieser sicherheitshalber deaktiviert werden kann. Dazu öffnet man wieder die SSH-Config und ändert den Wert für PermitRootLogin in no.
sudo nano /etc/ssh/sshd_config PermitRootLogin no
Nach dem Abspeichern muss der SSH-Dienst neu gestartet werden:
sudo /etc/init.d/ssh restart
Schritt 3d: Brute-Force-Attacken verhindern
Um Brute-Force-Attacken zum Ausprobieren von Passwortkombinationen zu verhindern, kann man das Paket Fail2Ban installieren. Die Standard-Einstellungen sollten dabei ausreichen, sodass hier außer der Installation nichts weiter konfiguriert werden muss.
sudo apt-get install fail2ban
Damit ist der Raspberry Pi soweit vorbereitet, seinen Dienst als Cloudserver zu verrichten. Im nächsten Teil wird es zur Einrichtung des Kontakt- und Terminservers gehen.
Hi,
danke für den spannenden Artikel. Ich bin aktuell auch auf der Suche nach einer Lösung für meine Datensynchronisation inkl. integrierter Verschlüsselung und bin dabei auch auf Seafile gestoßen und würde mich dabei sehr über den zweiten Teil freuen. Da ich selbst momentan aus Zeitgründen mich nicht ausführlich genug mit dem Thema beschäftigen kann, wäre es cool eine Anleitung dafür zu bekommen.
Der zweite Teil kommt hoffentlich noch vor Weihnachten. Er wird sich aber erstmal mit Baikal befassen. Seafile kommt dann erst im dritten Teil dran, sorry.
Frage zu Baikal: Kalender und Adressbücher teilen geht immer noch nicht, oder?
Soweit ich weiß, nicht. Habe mich aber das letzte Mal vor ein paar Monaten intensiver damit beschäftigt. Wie es derzeit aussieht, weiß ich leider (noch) nicht.
sudo usermod –move-home –login hotzenplotz –home /home/hotzenplotz pi
wenn ich diese unter Schritt 3b mache, kommt :
user pi is currently used by process 434
Eine Idee wie ich hier weiterkomme ?
Hast du dich aus pi ausgeloggt? Der Befehl muss unter dem temporären Benutzerkonto eingegeben werden.
Habe ein ähnliches Problem. Auch wenn ich pi auslogge, ich die raspberry neu starte oder ausschalte wird user pi ständig von einem Prozess benutzt.
Bootet dein System in die Desktopumgebung? Falls ja, probiere es mal in der raspi-config das Booten in die Eingabeauforderung zu aktivieren. Danach blieb die mir Fehlermeldung aus, scheinbar handelte es sich um Prozesse die mit dem Desktop in Zusammenhang standen.