Nextcloud: Diesmal richtig.
Schon seit Jahren betreibe ich privat eine Nextcloud-Instanz. Die habe ich damals eingerichtet, weil ich persönlich nicht mit Kalendern und Notizbüchern in Papierform zurecht komme. Sinnvoller finde ich ein Gerät, das in der Lage ist, mich an Termine, Aufgaben und ähnliches zu erinnern. Und weil es praktisch ist, solche digitalen Notizen auch geräteübergreifend verfügbar zu haben, bietet sich eine Server-Plattform im Hintergrund an.
Am einfachsten ist es da sicher, auf die Services von Google, Apple oder ähnlichen Anbietern zurückzugreifen, aber ich persönlich meide solche Plattformen aus Sorge um den Schutz meiner Privatsphäre. Und wenn man dank des entsprechenden Studiums in der Lage ist, Server selbst zu verwalten, kann es ja nur interessant sein, eine selbst gehostete Alternative wie Nextcloud zu verwenden. Und tatsächlich handelt es sich dabei um ein sehr ausgereiftes Produkt, dessen Installation verblüffend einfach gelingt.
Also habe ich mir damals bei einem Hoster einen virtuellen Server mit Ubuntu als Betriebssystem angemietet und Nextcloud darauf installiert. Der Einfachheit halber habe ich damals das snap-Paket verwendet. Snaps sind ein Software-Paketformat, das hauptsächlich von Canonical, dem Unternehmen hinter der Linux-Distribution Ubuntu, entwickelt wird. Dieses Snap-Paket hatte den Vorteil, dass man bei der Installation noch nicht einmal den Webserver separat installieren musste, der Befehl “snap install nextcloud” installierte Webserver, PHP-Module usw. komplett mit. Außerdem aktualisieren sich snap-Pakete automatisch. Das ist der Sicherheit zuträglich und gerade bei Software, die aus dem Netz erreichbar ist, eine gute Sache. Im Grunde musste ich mich danach nur noch um die Absicherung der Nextcloud-Instanz über ein Let’s Encrypt-Zertifikat kümmern, der Rest lief über das Web-Interface von Nextcloud.
Diese Nextcloud-Instanz hat mir in den letzten Jahren treue Dienste erwiesen. Sie verwaltet meine Kalender so, dass ich von allen meinen Geräten auf sie zugreifen kann. Auch ausgewählte Dokumente und Bilder werden über sämtliche Geräte hinweg synchronisiert. Sogar Canban-Boards kann ich über das Browser-Interface oder eine App erstellen und verwalten.
In letzter Zeit musste ich dann leider feststellen, dass mein alter Nextcloud-Server beginnt, Zicken zu machen. Er ist immer wieder nicht erreichbar. Und nachdem ich die Nextcloud-Instanz ohnehin seit einer Weile zu einem anderen Hoster umziehen wollte und gerade Zeit übrig habe, war der Zeitpunkt für eine Migration gekommen. Und diesmal wollte ich nicht schummeln. Kein snap-Paket, keine vorgefertigten Skripte. Stattdessen: Webserver einrichten, Datenbank konfigurieren und im besten Fall etwas daraus lernen. Ich behaupte nicht, dass das klüger oder besser wäre, als das snap-Paket zu nutzen - ich wollte die Installation im Grunde nur der Neugier halber diesemal anders umsetzen.
Also habe ich beim neuen Hoster einen Server mit dem neuesten Ubuntu hochgezogen - wie beim anderen Hoster ging das auch hier in Sekunden - und die offizielle Nextcloud-Dokumentation ins Auge gefasst. Auch die Installation nach offizieller Vorgehensweise ist erfreulich simpel.
Ich habe mir angewöhnt, komplexe Abläufe, die ich neu lerne, zu dokumentieren. Das liegt einfach daran, dass ich es nicht leiden kann, Dinge zweimal recherchieren zu müssen. Entsprechend habe ich auch diese Nextcloud-Installation nebenher notiert. Ich ergänze diese Mitschrift hier - vielleicht kann ein:e Leser:in ja davon profitieren? Ich bitte dabei aber zu beachten, dass ich kein professioneller Administrator bin. Entsprechend empfehle ich ausdrücklich einen Blick auf die offizielle Dokumentation. Das gilt insbesondere für Software-Versionen, die neuer sind als die unten aufgeführten.
Installation: Nextcloud 18.04 auf Ubuntu 20.04
Initiale Absicherung des Servers
Der Vollständigkeit halber beginne ich diese Dokumentation direkt nach dem initialen Aufsetzen des virtualisierten Ubuntu-Servers. Es gibt einige gängige Schritte, mit denen man den Remote-Zugang zu einem Linux-Server nach der ersten Verbindung über SSH absichern kann. Der übliche erste Schritt ist das Hinzufügen eines non-root Nutzers mit sudo-Rechten.
Server> sudo adduser username
Server> sudo adduser username sudo
Außerdem ist es ratsam, Logins via SSH nicht über die Nutzung eines Passworts durchzuführen, sondern auf dem zugreifenden Rechner ein Schlüsselpaar zu erzeugen, das dafür verwendet wird. Dadurch wird kein Passwort im Klartext verschickt, was sowohl Man in the Middle-Angriffe als auch Brute Force-Attacken ermöglichen würde. Es gilt also zunächst, ein sicheres Schlüsselpaar auf dem zugreifenden Client zu erzeugen.
Client> ssh-keygen -b 4096
Nach Eingabe des Befehls wird abgefragt, wie die Schlüsseldatei genannt und wo sie abgelegt werden soll. Dort werden zwei Dateien erzeugt, ein privater Schlüssel und ein öffentlicher Schlüssel, welcher durch die Dateiendung .pub erkennbar ist. Der Inhalt dieser .pub-Datei muss nun noch auf den Server übertragen werden, damit das Schlüsselpaar zum Login auf dem Server verwendet werden kann. Dafür gibt es mehrere Wege, wobei ich persönlich in aller Regel copy-and-paste aus der .pub-Datei in einen Texteditor auf dem Server vorziehe. Dazu muss zunächst der passende Ordner angelegt werden, in dem eine Datei mit den autorisierten Schlüsseln abgelegt wird.
Server> mkdir ~/.ssh # Anlegen des Ordners
Server> touch ~/.ssh/authorized_keys # Anlegen der Datei
Server> nano ~/.ssh/authorized_keys # Öffnen der Datei
In diese Datei wird der Inhalt der .pub-Datei auf dem Client eingefügt. Im Anschluss wird die Session als root geschlossen und es folgt ein Login mit der Identität des neuen sudo-Nutzers.
Server> ssh prieblinger@<ip>
Nun wird die SSH-Konfiguration auf dem Server abgesichert, indem der SSH-Login als root deaktiviert wird, ebenso der Login mitels Passwort.
Server> sudo nano /etc/ssh/sshd_config
In dieser Datei werden die folgenden beiden Optionen gesetzt:
PermitRootLogin no
PasswordAuthentication no
Anschließend wird der SSH-Dienst neu gestartet:
Server> sudo service ssh restart
Vorbereitung der Nextcloud-Installation
Die Installation von Nextcloud setzt wie viele Webserver-basierte Software die Installation des üblichen LAMP-Stacks (Linux, Apache2-Webserver, MySQL/MariaDB, PHP) voraus. Für das spätere Entpacken der Nextcloud-Software ist außerdem das Paket “unzip” erforderlich.
Server> apt-get install apache2 mariadb-server libapache2-mod-php7.4
Server> apt-get install php7.4-gd php7.4-json php7.4-mysql php7.4-curl php7.4-mbstring
Server> apt-get install php7.4-intl php-imagick php7.4-xml php7.4-zip
Server> apt-get install unzip
Für die Datenbank MariaDB empfiehlt sich zunächt über den ersten der folgenden Befehle die interaktive Absicherung über den folgenden Befehl. Das root-Passwort der MariaDB sollte man sich dabei notieren, etwa in einem Passwort-Manager. Anschließend wird in MariaDB eine Datenbank und ein Nutzer für Nextcloud angelegt.
Server> sudo mysql_secure_installation
Server> sudo mysql -u root -p
Server> CREATE DATABASE nextcloudDB;
Server> CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY '<sicheres Passwort eingeben>'
Server> GRANT ALL PRIVILEGES ON nextcloudDB.* TO 'nextcloud'@'localhost';
Server> FLUSH PRIVILEGES;
Server> exit
Installation der Nextcloud-Software
Nextcloud selbst kann als Zip-Archiv von der Nextcloud-Website heruntergeladen werden. Dazu bietet sich an, die Website auf dem Client aufzurufen, den Downloadlink zu kopieren und in das SSH-Terminal zum Server in einen wget-Befehl einzufügen. Dadurch wird die Datei hinter dem Link auf den Server heruntergeladen. Anschließend wir das heruntergeladene zip-Archiv dekomprimiert und der entpackte nextcloud-Ordner ins Verzeichnis /var/www/html/nextcloud auf dem Apache-Webserver verschoben. Zuletzt werden die Zugriffsrechte angepasst.
Server> cd ~
Server> wget https://download.nextcloud.com/server/releases/nextcloud-18.0.4.zip
Server> unzip nextcloud-18.0.4.zip
Server> sudo mv ~/nextcloud /var/www/html/nextcloud
Server> sudo chown -R www-data:www-data /var/www/html/nextcloud/
Als nächstes muss eine Konfigurationsdatei für Nextcloud in Bezug auf den Webserver angelegt werden.
Server> sudo nano /etc/apache2/sites-available/nextcloud.conf
Dort werden die folgenden Zeilen eingetragen:
Alias / "/var/www/html/nextcloud/"
<Directory /var/www/html/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
Nun wird die Nextcloud-Konfiguration aktiviert, ebenso eine Reihe von Apache2-Modulen. Danach wird der Apache2-Dienst neu gestartet, um die Änderungen wirksam zu machen.
a2ensite nextcloud.conf
a2enmod rewrite headers env dir mime
sudo service apache2 restart
Von hier ab gibt es verschiedene Möglichkeiten, die Installation von Nextcloud zu vollenden. Eine der Möglichkeiten ist der Wizard in der Weboberfläche. Das Eingeben von Passwörtern und Nutzernamen in einer noch unverschlüsselten Website ist eine unsichere Angelegenheit, daher sollte man diesen Weg eher vermeiden, solange man noch keine Absicherung über https eingerichtet hat. Alternativ kann dieses Setup aber auch vorab in der command line erstellt werden.
cd /var/www/nextcloud/
sudo -u www-data php occ maintenance:install --database "mysql" --database-name "nextcloudDB" --database-user "nextcloud" --database-pass "passowrd_of_database" --admin-user "adminprieblinger" --admin-pass "password_of_nextcloud_admin"
Nun ist Nextcloud fast Einsatzbereit. Es fehlt nur noch das Eintragen der IP-Adresse und der Domain des Servers in einer Konfigurationsdatei:
sudo nano /var/www/nextcloud/config/config.php
Die Datei wird wie folgt angepasst, wobei unter 1 und 2 die jeweils erworbene IP-Adresse und Domain eingetragen wird:
array (
0 => 'localhost',
1 => 'ip_addr_des_servers',
2 => 'www.meineclouddomain.de',
),
Nun kann die Anmeldemaske der Nextcloud-Instanz über die IP-Adresse des Servers im Browser aufgerufen werden. Auch über die eben eingetragene Domain ist der Aufruf möglich, sobald diese in einen DNS-Server eingetragen ist, zum Beispiel beim Anbieter, über den man den Server gemietet hat.
Vor dem ersten Login sollte die Anmeldeseite jedoch noch über https abgesichert werden, um die Möglichkeit des Abhörens von Zugangsdaten von Vornherein zu verhindern. Dank dem von der Electronic Frontiers Foundation (EFF) veröffentlichten CertBot ist das glücklicherweise kostenlos und einfach möglich, genau Angaben dazu finden sich auf der CertBot-Seite.
Bei Bedarf gibt es diverse zusätzliche Sicherheitsmaßnahmen, die auf das System angewandt werden können, doch diese würden den Rahmen dieses Eintrags sprengen.