Nextcloud

Diese Dokumentation beschreibt, wie ich meine eigene Nextcloud bei AWS eingerichtet habe.

Einrichtung

Was wird benötigt:

  • EC2-Instanz (virtueller Server)
  • EBS Volume (virtuelle Festplatte)
  • EBS Snapshot (Sicherung der virtuellen Festplatte auf S3)
  • S3 (Speicher für Daten und Backups)

Optional: VPC erstellen

Für eine einfache Einrichtung kann der Standard-VPC genutzt werden. Möchte man aber in der Zukunft einen RDS anbinden oder eine zweite EC2-Instanz mit Dokumenten-Kollaboration, dann empfiehlt sich ein individueller VPC.

Anleitung dazu siehe Create a VPC for Nextcloud (optional) auf https://blog.roykincaid.com

Virtuellen Server auf AWS EC2 erstellen

  • Auswahl der nächstgelegenen Region:
    “EU: Frankfurt”
  • Auf dem EC2 Dashboard eine neue Instanz starten
  • Wahl des Betriebssystems:
    “Ubuntu 18.04 LTS” (wegen Nutzung von Snap und weil Empfehlung von Nextcloud)
  • Wahl des Instanz-Typs:
    “t3a.micro” (mit 2 CPUs und 1 GB RAM)
  • Erstellung der virtuellen Festplatte:
    SSD mit 8 GB
  • Sicherheitsgruppe für den Datenverkehr:
    • SSH (Port 22) nur von der eigenen aktuellen IP aus erreichbar machen
    • HTTP/HTTPS (Port 80/443) global erreichbar machen; wird durch Absicherung mittels Let’s Encrypt später nur auf HTTPS umgeleitet
  • Erstellung eines Schlüsselpaares für die SSH-Verbindung (der öffentliche Schlüssel wird automatisch auf dem Server hinterlegt)
    • Den Inhalt der Keys in einem Passwort Manager speichern
    • Unter Linux der PEM-Datei die Zugriffsrechte 400 geben: chmod 400 keys.pem
  • Zuweisung einer Elastic IP:
    • Im EC2 Dashboard zur Zuweisung einer Elastic IP starten
    • Zuweisung der EC2-Instanz zur erzeugten Elastic IP
    • Je nach TTL kann die Änderung einen Moment benötigen, bis sie angewendet wird

Installation der Nextcloud

  • Per SSH auf dem EC2-Serer einloggen:
    ssh -i "keys.pem" ubuntu@123:123:123:123
  • Konfiguration der Firewall:
    sudo ufw allow 80,443/tcp
  • Installation von Nextcloud, Apache Webserver und MySQL-Datenbank via Snap:
    sudo snap install nextcloud
  • Evtl. Einrichten von S3 als primären Speicher (siehe dazu Anbindung von primärem Speicher mit AWS S3)
  • Erzeugen eines Administrator-Kontos:
    sudo nextcloud.manual-install <admin_username> <admin_password>
  • Konfiguration der vertrauenswürdigen Domains:
    sudo nextcloud.occ config:system:set trusted_domains 1 --value=<dns-domain>
  • PHP Speicherlimit setzen (sollte 512 MB sein):
    sudo snap set nextcloud php.memory-limit=512M
  • Evtl. Setzen des Intervalls für den Hintergrund-Prozess (Cronjob) zum Checken diverser Sachen (ist standardmäßig 15 Minuten):
    sudo snap set nextcloud nextcloud.cron-interval=10m

(Sub-)Domain erstellen

  • In der DNS-Konfiguration (Route 53 bei AWS) muss ein A Record mit der (Sub-)Domain erstellt werden
  • Diese zeigt auf die zuvor erstellte Elastic IP

HTTPS durch Nutzung von Let’s Encrypt ermöglichen

  • Abruf eines Zertifikats und Konfiguration von SSL auf dem Server:
    sudo nextcloud.enable-https lets-encrypt
  • Dabei muss eine E-Mail-Adresse und der Name der (Sub-)Domain angegeben werden

Anbindung von AWS S3 als Speicher

S3 kann als primärer oder externen Speicher angebunden werden. In beiden Fällen muss dazu ein IAM-Nutzer angelegt werden.

Nachteile des externen S3-Speichers:

  • Unzureichende Zugriffskontrolle, da für jeden Nutzer ein eigener Bucket erstellt werden muss oder bei einem gemeinsamen Bucket alle auf alles zugreifen können
  • Speicher-Quotas sind nicht möglich
  • Nextcloud Sharing ist nicht möglich mit externen Nutzern

IAM-Nutzer für AWS S3 erstellen

  • Im IAM Dashboard in AWS eine Richtlinie anlegen, welche einem Nutzer volle Zugriffsrechte auf den zu nutzenden S3 Bucket gibt:
    “Nextcloud-S3BucketFullAccess”
  • Dabei den Namen des S3 Buckets in die eigene, verwendete (Sub-)Domain ändern
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::cloud.example.com",
                "arn:aws:s3:::cloud.example.com/*"
            ]
        }
    ]
}
  • Im IAM Dashboard einen Nutzer erzeugen, der nur programmatischen Zugriff hat und dem die eben erstelle Richtlinie zugewiesen wird:
    “nextcloud-s3-admin”
  • Die Credentials des Users (als CSV-Datei) herunterladen

Anbindung von primärem Speicher mit AWS S3

  • Dieser Schritt muss während der Installation erfolgen, noch bevor ein Account für den Administrator erstellt wird!
  • In AWS kann ein neuer S3-Bucket mit eindeutigem Namen angelegt werden und liegt am besten in der selben Region wie der EC2-Server. Dieser darf aber noch nicht genutzt werden (keine Dateien darin speichern!). Der Bucket kann aber auch durch Nextcloud automatisch erzeugt werden.
  • Im Konfigurations-Verzeichnis von Nextcloud (/var/snap/nextcloud/current/nextcloud/config/) eine eigene Konfigurationsdatei storage.config.php anlegen:
<?php
$CONFIG = [
    'objectstore' => [
        'class' => 'OC\\Files\\ObjectStore\\S3',
        'arguments' => [
            'bucket' => 'bucketname',
            // Erstellt den Bucket, wenn noch nicht existent
            'autocreate' => true,
            'key' => 'AAAAAAAAAAAAAAAAAAA',
            'secret' => 'AaAAaaaAAA11aAAAAAaa11aA+aAaAA1aAaaAAaAAAAA',
            // Nur, wenn NICHT AWS S3
            'hostname' => 'example.com',
            // Nur, wenn NICHT AWS S3
            'port' => 443,
            'use_ssl' => true,
            'region' => 'eu-central-1',
            // Nur true, wenn NICHT AWS S3
            'use_path_style'=> false,
        ],
    ],
];
  • Im primären Objektspeicher werden nur die Dateien gespeichert. Alle Metadaten wie Datei- und Verzeichnisnamen werden in der Datenbank gespeichert.
  • Das Sperren von Transaktionsdateien erfolgt schon durch S3. Dadurch sollte dies in der Nextcloud deaktiviert werden. Dazu in der config.php die Zeile 'filelocking.enabled' => false, ergänzen.
  • Ebenso sollte auf Verschlüsselung durch Nextcloud aus Performance-Gründen verzichtet werden. So wird auch eine Kompatibilität mit allen Nextcloud-Apps gewährleistet.

Anbindung von externem Speicher mit AWS S3

  • Nach dem Anmelden als Administrator auswählen von Apps
  • Aus der Liste der Disabled Apps die folgenden aktivieren:
    • Default encryption module
    • External storage support
  • In den Einstellungen unter Administration > Security im Abschnitt Server-side encryption diese aktivieren
  • In den Einstellungen unter Administration > External storages den S3 Bucket hinzufügen:
    • Sinnvollen Ordnernamen vergeben (bspw. “S3”)
    • Als Bucket Name den selben wie in der Policy verwenden. Der Bucket darf noch nicht existieren!
    • Als Access token und Secret key die Werte aus den Credentials nutzen
    • Die Einstellungen Enable SSL und Enable Path Style aktivieren
    • Mit dem Häkchen ganz rechts speichern und auf das grüne Häckchen ganz links warten
  • Um hohe Kosten durch viele Abfragen über die S3 API zu vermeiden, sollte die Option auf die Prüfung von Änderungen verzichtet werden.

Sicherungen

Backup des EBS Volumes

  • Im EC2 Dashboard Volumes wählen
  • Per Rechtsklick auf das Volume des virtuellen Servers einen Snapshot erzeugen
  • Dieser Snapshot wird in AWS S3 gespeichert

Backup mit snap

Backup nach S3

Backup der Datenbank

Evtl. Master-Slave-Replikation

Aktualisierung

  • Vor der Aktualisierung muss der Maintenance-Modus eingeschaltet werden, danach wieder ausgeschaltet:
    sudo nextcloud.occ maintenance:mode --on
    sudo nextcloud.occ maintenance:mode --off
  • Snap-Befehl in der Kommandozeile des EC2:
    sudo snap refresh nextcloud --channel=<channel>
  • Auf fehlende Indizes in der Datenbank prüfen und bei Bedarf hinzufügen:
    sudo nextcloud.occ db:add-missing-indices

Einstellungen

  • Die Speicherung von verschlüsselten Dateien aus der Nextcloud heraus auf einem externen Speicher wie S3 kann zu Problemen führen. Hierfür gibt es noch einen offenen Bug.
  • Aktivierung der Brute-force settings verbannt verdächtige IPs für 24 Stunden (von dort kann man sich nicht mehr einloggen)
  • Einstellung einer Disk Quota für alle Benutzer, um eine Kontrolle über die maximale Datennutzung zu behalten
  • Die maximale Dateigröße beträgt standardmäßig 512 MB. Um größere Dateien zu erlauben, muss dies per snap konfiguriert werden:
    • Maximale Dateigröße ändern:
      sudo snap set nextcloud php.upload-max-filesize=500G
    • Dienst neu starten:
      sudo systemctl restart snap.nextcloud.apache
  • Das tmp-Verzeichnis sollte laut einer Warnung von Nextcloud mind. 50 GB fassen können. Dazu hier evtl. eine externe Platte anbinden.
  • Zur späteren Deaktivierung der Verschlüsselung müssen alle verschlüsselten Daten wieder entschlüsselt werden:
    • Wartungsmodus einschalten:
      nextcloud.occ maintenance:mode --on
    • Alle Dateien entschlüsseln:
      nextcloud.occ encryption:decrypt-all
    • Verschlüsselung im Administrations-Menü der Nextcloud deaktivieren
    • Wartungsmodus ausschalten:
      nextcloud.occ maintenance:mode --off
  • Verzeichnis der Nextcloud-Konfiguration:
    /var/snap/nextcloud/current/nextcloud/config/config.php
  • Speicherorte von Logs

Sicherheits- & Einrichtungswarnungen

Transaktionales Sperren ist deaktiviert, was zu Problemen mit Laufzeitbedingungen führen kann. ‘filelocking.enabled’ in der config.php aktivieren, um diese Probleme zu vermeiden. Weitere Informationen finden sich in unserer Dokumentation.

Diese Meldung erscheint nach der Konfiguration des S3-Speichers als primärem Objektspeicher mit anschließendem Deaktivieren des Sperrens von Transaktionsdateien durch die Option filelocking (siehe oben).

Dieser Installation fehlen einige empfohlene PHP-Module. Für bessere Leistung und bessere Kompatibilität wird dringend empfohlen, diese zu installieren.
imagick

Da die Snap-Installation read-only ist, kann man dieses PHP-Modul nicht (ohne Weiteres) nachinstallieren. Das ist aber auch gar nicht notwendig, da es nur für das Generieren eines Favicons durch die App “themes” notwendig wäre. Da imagick jedoch als Sicherheitsrisiko gesehen wird, ist es nicht im Snap-Image dabei. (siehe Nextcloud-Snap Issue #1249)

Diese Instanz verwendet einen S3-basierten Objektspeicher als Primärspeicher. Die hochgeladenen Dateien werden temporär auf dem Server gespeichert und es wird daher empfohlen, 50 GB freien Speicherplatz im temp-Verzeichnis von PHP zur Verfügung zu haben. Überprüfe die Protokolle, um alle Details über den Pfad und den verfügbaren Platz zu erhalten. Um dies zu verbessern, kann das temporäre Verzeichnis in der php.ini geändert oder mehr Platz in diesem Pfad zur Verfügung gestellt werden.

Ob wirklich 50 GB benötigt werden, kann ich nicht bestätigen. Bislang reichten meine 8 GB EBS aus.

Weitere Warnungen werden in der offiziellen Dokumentation unter Warnings on admin page behandelt.

Zudem kann ein Sicherheits-Scan der eigenen Nextcloud-Instanz sinnvoll sein. Dazu https://scan.nextcloud.com/ aufrufen und die Domain eingeben.

OCC-Kommando

  • Das OCC-Kommando (“ownCloud Console”) ist ein Kommandozeilen-Interface. Damit können viele Server-Operationen ausgeführt werden.
  • Das OCC-Kommando muss bei einer Snap-Installation mit sudo ausgeführt werden:
    sudo nextcloud.occ
  • Die Konfiguration des Nextcloud-Servers erfolgt über das Config-Kommando. Eine Auflistung der aktuellen Konfiguration erhält man durch:
    sudo nextcloud.occ config:list
  • Das Logging-Verhalten kann mit dem Log-Kommando eingestellt werden. Der Log-Level bestimmt, was alles geloggt wird. Bei File-Logging kann die Größe der Log-Datei bis zur Rotation festgelegt werden.
    sudo nextcloud.occ log:manage
    sudo nextcloud.occ log:file

Quellen