Nextcloud

Mit der Open-Source-Software Nextcloud speichern Sie Ihre Dateien datenschutzrechtlich einwandfrei auf Ihrem eigenen Server, genießen aber trotzdem die vielfältigen Nutzungs- und Zugriffsmöglichkeiten bekannter Cloudspeicher-Systeme wie Dropbox, Google Drive und Microsoft OneDrive. Die Software lässt sich über Apps im Administrationsbereich um Groupware-Funktionalitäten wie E-Mail, Kalender, Kontakte, Notizen und Aufgaben erweitern.

Die aktuellen Beschreibungen basieren auf Nextcloud in der Version 19.

Erfüllte Anforderungen

Diese Anforderungen erfüllt das Schulnetzkonzept:

  • Zugriffsmöglichkeiten: Web, WebDAV (Netzlaufwerke), App, Synchronisationsclient
  • Webzugriff
    • Verschlüsselter Zugriff via https in Kombination mit einem Let's-Enrypt-Zertifikat
    • Wohlgeformte URLs (ohne index.php)
  • Anbindung an vorhandenes Benutzer- und Gruppenverzeichnis (Samba via LDAP)
    • personalisierter Zugriff je Benutzer
    • gemeinsame Verzeichnisse auf Basis von Gruppenzugehörigkeiten
    • granulare Einstellung von Zugriffsberechtigungen passend zum Einsatzzweck (nur lesen, schreiben, ...)

TODO

Daran muss noch gearbeitet werden:

  • Beschreibung der Groupware-Funktionalitäten

Installation

Virtuelle Maschine erzeugen

Verwenden Sie hierzu die Beschreibung zur Installation eines virtuellen Linux-Debians.

Dimensionierungsbeispiel der virtuellen Maschine für 750 Benutzer:

  • 2 CPUs
  • 300 GB Festplattenspeicher
  • 8 GB Arbeitsspeicher
  • 1 Netzwerkkarte mit Zugriff auf das Netzwerk LAN_SERVER

Voraussetzungen für Zugriff von außerhalb der Schule

  • Provider für öffentliche Domäne für Zugriff von außen
    • z. B. Subdomain ihrer Schuldomain: nextcloud.ihre-schule.de
    • Möglichkeit des Setzens von A-Name bzw. C-Name-Einträgen
    • Notwendige externe Router-Ports: 80, 443
  • Eine gute Internetanbindung, v. a. was die Uploadgeschwindigkeit anbelangt, sodass Zugriffe von außen in angemessener Zeit abgearbeitet werden können.

Notwendige Pakete installieren

# Notwendige Tools
apt install sudo zip unzip -y

# Aktuelleres PHP (7.4) als das vom Debian-Repository (7.3) installieren
sudo apt -y install lsb-release apt-transport-https ca-certificates wget
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
apt update
apt install php7.4 php7.4-common php7.4-cli

# Vorgeschlagene Pakete aus Nextcloud-Dokumentation
apt install apache2 mariadb-server libapache2-mod-php7.4
apt install php7.4-gd php7.4-mysql php7.4-curl php7.4-mbstring php7.4-intl
apt install php7.4-gmp php7.4-bcmath php-imagick php7.4-xml php7.4-zip

# Zusätzlich für unser Konzept notwendig:
apt install php7.4-ldap php7.4-apcu

Datenbankserver (MariaDB/MySQL) einrichten

Zunächst starten Sie einen textbasieren Assistenten zur Absicherung Ihres Datenbankservers.

Dabei vergeben Sie bitte ein eigenes Passwort für den Datenbank-User root. Wenn Sie im weiteren Verlauf in einem Konsolenbefehl die Zeichenfolge <dbuser-root-pw> sehen, dann ersetzen Sie diese bitte mit Ihrem selbst vergebenen Passwort.

mysql_secure_installation

# Bitte tätigen Sie folgende --> Angaben:

# Passwort für Datenbank-User root festlegen
# Remove anonymous users? [Y/n] --> y
# Disallow root login remotely? [Y/n] --> y
# Remove test database and access to it? [Y/n] --> y
# Reload privilege tables now? [Y/n] --> y

Nun erzeugen Sie einen Datenbank-User mit dem Namen nextcloud und eine gleichnamige Datenbank.

Dabei vergeben Sie bitte ein eigenes Passwort für den Datenbank-User nextcloud. Wenn Sie im weiteren Verlauf in einem Konsolenbefehl die Zeichenfolge <dbuser-nextcloud-pw> sehen, dann ersetzen Sie diese bitte mit Ihrem selbst vergebenen Passwort.

Schließen Sie jede der folgenden Zeilen einzeln mit Eingabe der Enter-Taste ab.

mysql -uroot -p
<dbuser-root-pw>
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY '<dbuser-nextcloud-pw>';
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
quit;

Webserver (Apache) einrichten

Zunächst erzeugen Sie eine Konfigurationsdatei für die Nextcloud-Webseite.

Beachten Sie, dass die Datei als letzte Zeile eine Leerzeile hat.

vim /etc/apache2/sites-available/nextcloud.conf
Datei /etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:80>
  DocumentRoot /var/www/nextcloud/
  ServerName  nextcloud.ihre-schule.de
  ServerAlias www.nextcloud.ihre-schule.de

  <Directory /var/www/nextcloud/>
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews

    <IfModule mod_dav.c>
      Dav off
    </IfModule>

  </Directory>
  
  <IfModule mod_headers.c>
      Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
  </IfModule>
  
</VirtualHost>

#wichtig: Leerzeile als letzte Zeile der Datei!

Die Default-Konfiguration des Webservers deaktivieren und die Konfiguration für die Nextcloud aktivieren:

a2dissite 000-default.conf
a2ensite nextcloud.conf

In den PHP-Einstellungen für Apache muss noch der Default-Wert für das Memory-Limit auf 512 MB erhöht werden:

vim /etc/php/7.4/apache2/php.ini
Datei /etc/php/7.4/apache2/php.ini
# Zeile beginnend mit "memory_limit" finden und wie folgt abändern:
memory_limit = 512 M

Im Anschluss aktivieren Sie die für den Betrieb von Nextcloud notwendige Apache-Module und starten den Webserver neu:

a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime

systemctl restart apache2

Nextcloud-Dateien herunterladen und entpacken

Suchen Sie auf der Downloadseite von Nextcloud nach dem aktuellsten Downloadlink für die ZIP-Datei von Nextcloud und laden diese auf der Konsole mit dem Programm wget herunter:

# In das www-Verzeichnis des Webservers wechseln
cd /var/www/

# Achtung: hier den selbst recherchierten
# aktuellen Link zur aktuellen ZIP-Datei verwenden:
wget https://download.nextcloud.com/server/releases/latest.zip

# ZIP-Datei entpacken - Achtung verwenden Sie den richten Namen:
unzip latest.zip

# Die ZIP-Datei wird nicht mehr benötigt und kann gelöscht werden:
rm latest.zip

Dateiberechtigungen anpassen

chown -R www-data:www-data /var/www/nextcloud/
find /var/www/nextcloud/ -type d -exec chmod 750 {} \;
find /var/www/nextcloud/ -type f -exec chmod 640 {} \;

Die Benutzerdateien außerhalb des Ordners /var/www aufbewahren

Zur Steigerung der Sicherheit erstellen wir den Ordner zur Aufbewahrung der Dateien aller Nextcloud-Benutzer außerhalb des www-Verzeichnisses:

mkdir /srv/nextcloud-data
chown www-data:www-data /srv/nextcloud-data/

Beenden der Nextcloud-Installation

  • Rufen Sie die URL Ihrer Nextcloud auf, z. B.: nextcloud.ihre-schule.de
  • Legen Sie ein Administrator-Konto für Ihre Nextcloud an
  • Tätigen Sie folgende Angaben:
    • Datenverzeichnis: /srv/nextcloud-data
    • Datenbank: MySQL/MariaDB
    • Datenbank-Benutzer: nextcloud
    • Datenbank-Passwort: <dbuser-nextcloud-pw>
    • Datenbank-Name: nextcloud
    • Datenbank-Host: localhost

Anpassen der Konfigurationsdatei Ihrer Nextcloud

vim /var/www/nextcloud/config/config.php
Datei /var/www/nextcloud/config/config.php
# Folgende Einstellungen - falls noch nicht vorhanden - ergänzen/abändern:
'trusted_domains' => 
  array (
	  0 => 'nextcloud.ihre-schule.de',
	  # ggf. wollen Sie unter den trusted Domains die www-Subdomäne ergänzen:
	  1 => 'www.nextcloud.ihre-schule.de',
  ),
'ldapUserCleanupInterval' => 15,
'memcache.local' => '\OC\Memcache\APCu',
'overwrite.cli.url' => 'https://nextcloud.ihre-schule.de/',
'overwriteprotocol' => 'https',
'htaccess.RewriteBase' => '/',
'trusted_proxies' => 
  array (
# Tragen Sie hier die LAN_SERVER-IP des Reverse-Proxies (OPNsense) ein: z. B. 10.1.100.1
    0 => '10.1.100.1',
  ),
  'forwarded_for_headers' => 
  array (
    0 => 'HTTP_X_FORWARDED_FOR',
  ),
# Mit nachfolgenden beiden Angaben landen alle Freigaben für einen Benutzer
# automatisch im Ordner 'Mit mir geteilt', ohne dass der Nutzer hierzu
# explizit zustimmen muss.
'share_folder' => '/Mit mir geteilt',
'sharing.enable_share_accept' => false,

index.php aus URL entfernen

Wenn Sie in der Adresszeile Ihrer Nextcloud die unschöne Angabe index.php entfernen wollen, führen Sie folgende Befehle aus:

cd /var/www/nextcloud
sudo -u www-data php occ maintenance:update:htaccess

Installation und Konfiguration der LDAP-Verbindung zum Samba-Server

Freilich ließe sich die Nextcloud auch mit der integrierten Benutzer- und Gruppenverwaltung betreiben. Unser Schulnetzkonzept sieht aber vor, die Benutzer und Gruppen auch für andere Dienste zu verwenden (personalisiertes WLAN über Freeradius). Damit der Benutzerbestand nun nicht zweimal gepflegt werden muss, ist der Betrieb eines gesonderten Benutzer- und Gruppenverzeichnisses (Samba-Server) die ökonomischere Variante.

  • Melden Sie sich bei Ihrer Nextcloud als Administrator an, klicken Sie auf Ihr Benutzer-Icon und wählen den Menüpunkt "Apps".
  • Suchen Sie unter App-Pakete nach "LDAP user and group backend" und aktivieren Sie dieses.
  • Stellen Sie vor dem nächsten Schritt sicher, dass der Samba-Server über eine verschlüsselte Verbindung erreichbar ist (s. dazu Anleitung Samba-Server).
  • Nun können Sie mit der LDAP-Einrichtung beginnen. Begeben Sie sich hierzu zu den Einstellungen und darin zum Punkt LDAP / AD Integration:
    • Server
      • Host: ldaps://ldap.ihre-schule.de
      • Port: 636
      • Benutzer-DN: CN=Administrator,CN=Users,DC=schulnetz,DC=intra
        (Passen Sie die an Ihre Installation an!)
      • Passwort: <sambauser-Administrator-pw>
      • Basis-DN: DC=schulnetz,DC=intra
        (Passen Sie die Angaben an Ihre Installation an!)
    • Benutzer
      • Belassen Sie die Standardeinstellungen.
    • Anmelde-Attribute
      • Haken bei: LDAP-/AD-Benutzername:
    • Gruppen
      • Wählen Sie die Gruppen aus, welche für die Datei- bzw. Freigbeverwaltung für Sie relevant sind, z. B. schueler, lehrer, 5a, ...
    • Fortgeschritten
      • Ordnereinstellungen:
        • Anzeigenamen des Benutzers: displayName
        • Basis-Benutzerbaum:  OU=Users,OU=School,DC=schulnetz,DC=intra
          (Passen Sie die Angaben an Ihre Installation an!)
        • Anzeigenamen der Gruppe: cn
        • Basis-Gruppenbaum: OU=Groups,OU=School,DC=schulnetz,DC=intra
          (Passen Sie die Angaben an Ihre Installation an!)
        • Assoziation zwischen Gruppe und Benutzer: member(AD)
      • Spezielle Eigenschaften
        • Kontingent Feld: postOfficeBox
          (= Quota; wird im LDAP-Account-Manager je Benutzer bei Postfach hinterlegt; Beispiele: 500 MB, 1 GB, ...)
        • E-Mail-Feld: mail
      • Experte
        • Interner Benutzername: userPrincipalName

Einrichtung der Hintergrundaufgaben

Damit die Nextcloud reibungslos funktioniert muss sie im Hintergrund diverse Aufgaben erledigen. Der effektivste Weg dafür ist das Ausführen der Aufgaben als Benutzer www-data über einen Cronjob vom System anzustoßen:

crontab -u www-data -e
Datei crontab
# am Ende der Datei folgende Zeile(n) einfügen:
# Ausführung von cron.php alle 5 Minuten:
*/5  *  *  *  * php -f /var/www/nextcloud/cron.php
# E-Mail-Versand bei der Verwendung des Aktivitäts-Moduls alle 5 Minuten:
*/5  *  *  *  * php /var/www/nextcloud/occ activity:send-mails

Nun müssen Sie als Administrator in den Einstellungen der Nextcloud diese Variante der Hintergundaufgaben-Erledigung noch aktivieren:

  • Begeben Sie sich zum Punkt Grundeinstellungen.
  • Wählen Sie unter Hintergrund-Aufgaben die Option "Cron".

Anlage von Ordnern und Freigaben

Zur gemeinsamen Zusammenarbeit an Dateien und Ordnern in der Schule schlage ich folgende Ordnerstruktur (samt Freigaben) vor, welche Sie als Nextcloud-Administrator anlegen:

  • Schule
    • Klassen (Schreibzugriff für Gruppe Lehrer)
      • 5a (Schreibzugriff für Gruppe 5a)
      • 5b (Schreibzugriff für Gruppe 5b)
      • ...
    • Für Lehrer (Schreibzugriff für Gruppe Lehrer)
    • Für Schüler (Schreibzugriff für Gruppe Lehrer, Lesezugriff für Gruppe Schüler)

Die an einen Benutzer freigegebenen Ordner erscheinen in dessem Startverzeichnis im Ordner "Mit mir geteilt".

Damit Benutzer an sie geteilte Ordner nicht an andere weiterverteilen können (z. B. Schüler der 5a teilt den Klassenordner an Schüler der 5b) empfiehlt es sich, bei den Freigabeeinstellungen des jeweiligen Ordners den Haken bei "Weiterverteilen erlauben" zu entfernen.

Über die oben dargestellten Freigaben hinaus kann jeder Benutzer eigene Dateien und Ordner (außerhalb des Ordners "Mit mir geteilt") mit beliebigen Personen und Gruppen teilen.

Wenn ein Benutzer einen Freigegebenen Ordner (versehentlich) entfernt hat, findet er diesen wieder im linken Seitenmenü unter "Freigaben → Mit Ihnen geteilt", "Freigaben → Gelöschte Freigaben" oder "Freigaben → Ausstehende Freigaben".

Nextcloud verschlüsselt über vollqualifizierte Domänennamen erreichbar machen

Damit die Nextcloud nicht über Ihre IP sondern über z. B. https://nextcloud.ihre-schule.de sowohl von außen als auch von innerhalb des Schulhauses aufgerufen werden kann, lesen Sie in der Anleitung zu OPNsense folgende Abschnitte:

  • Vollqualifizierte Domänennamen für Schulnetzdienste
  • Installation und Konfiguration des Reverse-Proxy-Servers
  • Installation und Konfiguration der automatisierten Zertifikatsverwaltung

Wartung

Update der Nextcloud

Als Nextcloud-Administrator können Sie in den Einstellungen unter "Übersicht" in Erfahrung bringen, ob für Ihre Nextcloud Updates bereitstehen. Diese spielen Sie dieses am besten über die Konsole ein, da die Fertigstellung des Updates ohnehin den Umgang mit der Konsole verlangt. Es empfiehlt sich vor dem Update im Virtualisierungshost einen Snapshot der Nextcloud-VM zu erstellen.

cd /var/www/nextcloud
sudo -u www-data php updater/updater.phar
# Die Fragen zum Update mit Y (Yes) beantworten.
# Die Frage nach Beibehaltung des Wartungsmodus mit N (No) beantworten.
  • Testen Sie Ihre aktualisierte Nextcloud.
  • Nach erfolgreichem Test können Sie ggf. den zuvor erstellten Snapshot wieder entfernen.

Gelöschte Samba- bzw. LDAP-Benutzer auch in der Nextcloud löschen

Wenn Sie auf dem mit der Nextcloud über LDAP verbundenen Samba-Server einen Benutzer löschen, kann sich dieser zwar nicht mehr in der Nexcloud anmelden, aber seine Daten sind nach wie vor im Ordner /srv/nextcloud-data vorhanden.

Vorneweg ein Hinweis: Wenn Sie viele Nutzer auf einmal löschen, dauert es ein wenig, bis die Nextcloud dies erkannt hat. Laut Ihrer Festlegung in der config.php (s. oben: ldapUserCleanupInterval) sucht die Nextcloud alle 15 Minuten nach gelöschten Benutzern. Je Interval kann für maximal 50 Benutzer festgestellt werden, dass diese vom Benutzerverzeichnis gelöscht wurden.
→ Die Feststellung von 500 gelöschten Benutzern dauert somit: 500 User / 50 User/Interval = 10 Intervalle
→ 10 Intervalle * 15 Minuten/Intervall = 150 Minuten

Zur Anzeige der Benutzer, welche die Nextcloud als "zu löschend" erkannt hat, führen Sie folgenden Befehl aus:

cd /var/www/nextcloud
sudo -u www-data php occ ldap:show-remnants

Um die User zu löschen führen Sie den nachfolgenden Befehl aus.

Bitte beachten Sie, dass es dabei zu Fehlermeldungen kommt. Diese sind lediglich der Tatsache geschuldet, dass der Befehl zeilenweise die Nextcloud-Ausgabe der zu löschenden User abarbeitet. Da die Ausgabe auch Zeilen ohne einen Benutzer beinhaltet (Überschrift, Trennzeilen), kommt es in diesen zu Fehlern. Diese beeinflussen die Löschung der Benutzer aber nicht.

cd /var/www/nextcloud
sudo -u www-data php occ ldap:show-remnants | while read pipe user line ; do echo $user ; sudo -u www-data php occ user:delete $user ; done

Letzte Aktualisierung der Seite: 2020-08-29 20:48