Nextcloud in DMZ (Demilitarisierte Zone)

In diesem Artikel wird beschrieben, wie wir eine Nextcloud in eigenem Netz aufsetzen, und zwar in DMZ Bereich. Der Server sollte vom Internet aus als auch von lokalem Netz erreichbar sein. Auf dem unterstehenden Schema sind 2 Firewalls zu sehen. Wir können das selbstverständlich auch mit einer Firewall und verschiedenen vLans konfigurieren.
Die Einstellungen auf den Firewalls müssen so eingestellt werden, dass der Server in DMZ vom lokalen Netz erreichbar ist. Von außen sollte der Server per Port 443 erreichbar sein und die Internetadresse nextcloud.<yourdomain.xx> muss in DNS eingetragen sein.

In DMZ Bereich installieren wir auf einer VM Linux Debian. Der Server ist von dem lokalen Netz erreichbar und von DMZ zu lokalem Netz sind alle Port geschlossen.
Den Server installieren und konfigurieren wir in DMZ von lokalem Netz.
Damit die Zugriffe funktionieren, müssen wir bestimmte Regel in den Firewalls eintragen.

IP-Adressen der externen Firewall
WAN: feste IP vom Provider (https://nextcloud.<youdomain.xx>)
LAN-DMZ-Seite: 192.168.2.1


Ausgangsinformationen des Nextcloud Servers:

Betriebssystem: Debian 12
Servername: d-ncloud
Domäne: meineschule.de
IP-Adresse: 192.168.2.170
Maske: 255.255.255.0
DNS: 192.168.2.1
Gateway: 192.168.2.1

IP-Adressen der internen Firewall
LAN-DMZ-Seite:
192.168.2.2
LAN-Lokales-Netz-Seite: 172.16.0.1

Lokales Netzwerk
Netz: 172.16.0.0/22
Gateway: 172.16.0.1/22
DNS: 192.168.2.1 oder andere DNS

Punkt
Eine VM in DMZ wird erstellt. Entsprechend viel RAM und entsprechende große Festplatte bzw. Festplatten sollten wir definieren. Es wird Debian 12 Standard Installation durchgeführt. Die IP wie z.B. oben wird definiert. Weitere Installation der Pakete als root wird durchgeführt.

 

Punkt
Den Server müssen wir für Nextcloud vorbereiten. Zuerst wird Apache, MySQL und PHP installiert. Bevor wir das machen, sollten wir noch die Liste der Repositorys ergänzen.
Im ersten Schritt werden die Pakete curl und lsb-release installiert. Danach wird ein PHP-Repository für das Debian-System hinzuzufügen. Am Ende müssen wir noch die GPG-Schlüssel in das Verzeichnis
/etc/apt/trusted.gpg.d herunterladen.

d-ncloud:~# apt-get install curl lsb-release

 

d-ncloud:~# echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list

 

d-ncloud:~# curl -o /etc/apt/trusted.gpg.d/sury-php8.gpg https://packages.sury.org/php/apt.gpg
d-ncloud:~# apt update

 

Punkt
Apache2 installieren und die Module ssl rewrite headers mit a2enmod aktivieren

d-ncloud:~# apt-get install apache2
d-ncloud:~# systemctl is-enabled apache2
d-ncloud:~# systemctl status apache2
d-ncloud:~# a2enmod ssl rewrite headers
d-ncloud:~# systemctl restart apache2
Punkt
Wir überprüfen, ob die aktivierte Apache-Module aktiv sind und starten Apache neu.

 

d-ncloud:~# apachectl -M | egrep "ssl|rewrite|headers"
d-ncloud:~# systemctl restart apache2

 

Die Ausgabe sollte so ähnlich aussehen.

headers_module (shared)
rewrite_module (shared)
ssl_module (shared)
Punkt
PHP Apache-Module werden installiert.

 

d-ncloud:~# apt install -y php php-curl php-cli php-mysql php-gd php-common php-xml php-json php-intl php-pear php-imagick php-dev php-common php-mbstring php-zip php-soap php-bz2 php-bcmath php-gmp php-apcu php-fpm

 

Punkt
Es wird noch zusätzlich ein Paket installiert. Dieses Paket enthielt Header-Dateien und statische Bibliotheken, die zum Kompilieren von Programmen mit MagickCore erforderlich sind.

d-ncloud:~# apt-get install -y libmagickcore-dev

 

Punkt
Die PHP Einstellungen müssen angepasst werden. Mit php -v können wir zuerst herausfinden, welche PHP-Version installiert wurde. Danach wechseln wir den Ordner und editieren die php.ini Datei. Die 8.x muss durch die richtige Version ersetzt werden. In der Debian-12.0.0 ist das die Version 8.2.

 

d-ncloud:~# cd /etc/php/8.x/apache2
Punkt
Mit nano können wir die php.ini Datei bearbeiten. Für die Nextcloud Version 26 können wir die folgenden Werte einsetzen, meistens auskommentieren.

 

file_uploads = On
allow_url_fopen = On
memory_limit = 512M
upload_max_filesize = 500M
post_max_size = 600M
max_execution_time = 300
display_errors = Off
date.timezone = Europe/Amsterdam
output_buffering = Off
Punkt
In der gleichen /etc/php/8.x/apache2/php.ini Datei müssen wir noch einiger Zeilen auskommentieren.

 

zend_extension=opcache

; in Sektion [opcache]

opcache.enable = 1
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.memory_consumption = 128
opcache.save_comments = 1
opcache.revalidate_freq = 1
Punkt
Die Datei /etc/php/8.x/cli/conf.d/20-apcu.ini wird geöffnet und am Ende der Datei wird die folgende Zeile eingefügt.

 

apc.enable_cli = 1
Punkt
Der Apache Dienst wird neu gestartet um die geänderte Werte aufzunehmen.

 

d-ncloud:~# systemctl restart apache2.service

Installieren und Konfigurieren von MariaDB

Es wird mariadb installiert. Nach der Installation und Konfiguration werden noch die Datenbank für Nextcloud und ein Benutzer mit Passwort für den Zugriff auf die Datenbank angelegt.

Punkt
Wir beginnen mit der Installation und Konfiguration der mariadb. Die Pakete mariadb-server mariadb-client werden installiert. Nach der Installtion überprüfen wir den Status der Datenbank

d-ncloud:~# apt install mariadb-server mariadb-client
d-ncloud:~# systemctl is-enabled mariadb
d-ncloud:~# systemctl status mariadb

 

Punkt
Die Datenbank sollte man noch absichern z.B. Passwort vergeben und einige Einstellungen anpassen. Wir verwenden am besten den Befehl mysql_secure_installation. Das Passwort wird definiert und sonnst nehmen wir die vorgeschlagene Option. Die ist immer als Großbuchstabe angezeigt.

 

d-ncloud:~# mysql_secure_installation

Datenbank und Benutzer für Nextcloud anlegen

Punkt
In einem shell Fenster melden wir uns mir dem unterstehenden mysql-Befehl in der mariadb-Shell an. Das Passwort was wir definiert haben, muss man eingeben. Sollten wir als root eingeloggt sein, reicht es wir nur mysql -u root eingeben. Danach sind wir in der maradb-Shell. Das erkennen wir Anhang des Prompt-Zeichen
MariaDB [(none)]>

 

d-ncloud:~# mysql -u root -p
Punkt
Die Datenbank und der Benutzer mit Passwort wird angelegt. Das Wort secret+- ist das Passwort von dem Benutzer. Ersetze das Passwort so wie es für dich am besten passt.

 

MariaDB [(none)]> CREATE DATABASE nextcloud_db;
MariaDB [(none)]> CREATE USER nextclouduser@localhost IDENTIFIED BY 'secret+-';

 

Punkt
Dem Benutzer nextclouduser wird erlaubt, auf die Datenbank nextcloud_db zuzugreifen.

 

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud_db.* TO nextclouduser@localhost;

 

Punkt
Die Tabellenberechtigungen werden neu geladen. Danach verlassen wir mit exit; mariadb-Shell.

 

MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;

Nextcloud-Quellcode herunterladen

Punkt
Nextcloud wird heruntergeladen, in unserem Fall die neuste Version. Wenn wir eine ältere Version brauchen, dann können wir uns alle verfügbaren Version in Browser mit dem Link https://download.nextcloud.com/server/releases anschauen.

 

d-ncloud:~# cd /var/www/
d-ncloud:~# curl -o nextcloud.zip https://download.nextcloud.com/server/releases/latest.zip

 

Punkt
Wir installieren noch das unzip Paket.

 

d-ncloud:~# apt install unzip
Punkt
Nextcloud wird entpackt und Berechtigungen des Verzeichnisses werden angepasst.

 

d-ncloud:~# unzip nextcloud.zip
d-ncloud:~# chown -R www-data:www-data nextcloud

Für sicherne SSL-Zugriff generieren wir ein Letsencrypt Zertifikat

Punkt
Es wird certbot Paket installiert. Mit diesem Tool können wir ein Let’s Encrypt Zertifikat generieren

 

d-ncloud:~# apt install certbot

 

Punkt
Nach der Installation erstellen wir mit den folgenden Befehlen einen neuen Ordner für die Let's Encrypt Autorisierung.

 

d-ncloud:~# mkdir -p /var/lib/letsencrypt/.well-known
d-ncloud:~# chgrp www-data /var/lib/letsencrypt
d-ncloud:~# chmod g+s /var/lib/letsencrypt
Punkt
Wir wechseln in den Ordner /etc/apache2/conf-available/ und erstelle z.B. mit nano eine neue Konfigurationsdatei letsencryptcert.conf

 

d-ncloud:~# cd /etc/apache2/conf-available/
d-ncloud:~# nano letsencryptcert.conf

 

Der Inhalt der Datei /etc/apache2/conf-available/letsencryptcert.conf

Alias /.well-known/acme-challenge/ "/var/lib/letsencrypt/.well-known/acme-challenge/"
<Directory "/var/lib/letsencrypt/">
   AllowOverride None
   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
   Require method GET POST OPTIONS
</Directory>
Punkt
Mit folgendem Befehl wird ein Link erstellt.

 

d-ncloud:~# ln -s /etc/apache2/conf-available/letsencryptcert.conf /etc/apache2/conf-enabled/

 

Punkt
Die Apache Konfiguration wird überprüft und danach, wenn alles Ok ist, der Apache-Dienst neu gestartet.

 

d-ncloud:~# apachectl configtest
d-ncloud:~# systemctl restart apache2.service

 

Vorausetzungen für das abholen des Let's Entcrypt Zertifikates.

Um ein Zertifikat für unsere Subdomain nextcloud.<youdomain.xx> von Let's Entcrypt zu holen, muss man bestimme Voraussetzungen erfühlen.

  • Der Apache-Dienst muss man richtig konfigurieren. Das haben wir schon gemacht.
  • Unsere Internetadresse (unsere Server) muss aus dem Internet erreichbar sein. Kurz gesagt, die Subdomain-Adresse muss in einem öffentlichen DNS eingetragen sein. In unserem Fall befindet sich der Server in DMZ und besitzt eine private IP-Adresse, deshalb müssen wir folgendes tun.
    • In öffentlichen DNS wird die öffentliche IP-Adresse des externen Routers/Firewall eingetragen.
    • Eine Firewallregel wird definiert. Alle Anfragen an Port 443 werden an unsere Server (IP-Adresse, private Adresse) weitergeleitet.
    • Sollten wir keine feste IP-Adresse besitzen, können wir auch den DynDNS Service nutzen.

Wenn die Voraussetzungen erfüllt sind, können wir unser Zertifikat abholen.

Punkt
Wir holen uns das Zertifikat für unsere Subdomain  nextcloud.<youdomain.xx>.

 

d-ncloud:~# certbot certonly --agree-tos --email info@youdomain.xx --webroot -w /var/lib/letsencrypt/ -d nextcloud.youdomain.xx

 

Die Ausgabe sollte ungefähr so aussehen.

Apache Virtual Host für Nextcloud einrichten

Punkt
Wir gehen in den Ordner /etc/apache2/sites-available/ und erstelle z.B. mit nano eine neue Konfiguration nextcloud.conf

 

d-ncloud:~# cd /etc/apache2/sites-available/
d-ncloud:~# nano nextcloud.conf

 

Der Inhalt der Datei

 

<VirtualHost *:443>
      ServerName nextcloud.youdomain.xx
      DocumentRoot /var/www/nextcloud/
      Protocols h2 http/1.1
      # log files
      ErrorLog /var/log/apache2/nextcloud.youdomain.xx-error.log
      CustomLog /var/log/apache2/nextcloud.youdomain.xx-access.log combined
      SSLEngine On
      SSLCertificateFile /etc/letsencrypt/live/nextcloud.youdomain.xx/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/nextcloud.youdomain.xx/privkey.pem

      # HSTS
      <IfModule mod_headers.c>
            Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
      </IfModule>
      <Directory /var/www/nextcloud/>
            Options +FollowSymlinks
            AllowOverride All
            <IfModule mod_dav.c>
                  Dav off
            </IfModule>
            SetEnv HOME /var/www/nextcloud
            SetEnv HTTP_HOME /var/www/nextcloud
       </Directory>
</VirtualHost>
Punkt
Die Konfiguration nextcloud.conf wird aktiviert und neu geladen.

 

d-ncloud:~# a2ensite nextcloud.conf
d-ncloud:~# systemctl reload apache2.service

Nextcloud-Installation fortfahren

Punkt
Die Installation von Nextcloud wird fortgefahren. Im Browser wird die definierte URL angegeben https://nextcloud.youdomain.xx
Es wird selbstverständlich die richtige URL eingegeben. Hier kann man den Administrator definieren und die Eingaben zu der Datenbank machen.

 

Punkt
Im Hintergrund werden Tabellen in der Datenbank erstellt und der Administrator Benutzer angelegt. Im nächsten Schritt hat man die Möglichkeit die Standardapps zu installieren, das dauert eine Weile. Es kann man auch diesen Schritt überspringen und die Apps später zu installieren. Ich installiere die immer.

 

Nach Abschluss der Installation kann man sich einloggen und Nextcloud verwalten.

Punkt
Nextcloud muss in regelmäßigen Abständen bestimme Aufgabe ausführen, deshalb müssen wir ein Cronjob erstellen. Den Cronjob sollte der Benutzer: www-data ausführen.

 

d-ncloud:~# crontab -u www-data -e
Punkt
Die Ausführung sollte alle 5 Minuten stattfinden. Die folgende Zeile wird am Ende der Datei eingefügt.

 

*/5 * * * * php -f /var/www/nextcloud/cron.php
Punkt
Das Letsencrypt Zertifikat ist nur 3 Monate gültig, deshalb müssen wir in regelmäßigen Abständen, kleiner als 3 Monate, das Zertifikat erneuern. Das Zertifikat kann man erst erneuern, wenn die Gültigkeit des Zertifikates nicht länger als 30 Tage ist. Per Cronjob kann man die Erneuerung steuern. In der Datei /etc/crontab kann die folgenden Zeilen einfügen. Jeden Sonntag um 3:00 Uhr wird dieser cronjob ausgeführt. Es wird versucht das Zertifikat zu erneuern und Apache wird neu geladen.

0 3 * * 0 root letsencrypt renew >> /var/log/letsencrypt-renew.log && /etc/init.d/apache2 reload > /dev/null 2>&1

Nextcloud Performance Verbesserung

Wir können noch mit bestimmten Einstellungen in der /var/www/nextcloud/config/config.php die Nextcloud Performance verbessern. Zwei Caching-Programme APCU und Redis, die sich in der Vergangenheit bewährt haben und gut mit der Nextcloud zusammenarbeiten, können wir installieren und konfigurieren. Danach müssen wir die entsprechen Einstellungen in der config.php Datei vornehmen.

Punkt
Das PHP Modul php-apcu haben wir schon installiert. Jetzt müssen wir in der Datei
/var/www/nextcloud/config/config.php eine Zeile einfügen.

'memcache.local' => '\OC\Memcache\APCu',
Punkt
Redis Caching wird installiert.

 

d-ncloud:~# apt install redis-server php-redis

 

Punkt
Die Datei /etc/redis/redis.conf wird von uns ein bisschen angepasst. Die folgenden Zeilen sollte man auskommentieren.

port 6379
unixsocket /run/redis/redis-server.sock
unixsocketperm 770
Punkt
Der Benutzer redis wird zu der Gruppe www-data zugefügt.

 

d-ncloud:~# usermod -a -G redis www-data

 

Punkt
In der Nextcloud Config-Datei /var/www/nextcloud/config/config.php werden die redis Einstellungen definiert. Die Datei wird z.B. mit nano geöffnet und bearbeitet.

 

   'memcache.local' => '\OC\Memcache\APCu',
   'memcache.distributed' => '\OC\Memcache\Redis',
   'memcache.locking' => '\OC\Memcache\Redis',
   'redis' => [
     'host' => 'localhost',
     'port' => 6379,
     'dbindex' => 0,
     'timeout' => 1.5,
   ],
Punkt
Die Redis und Apache2 Dienste werden neu gestartet. Danach müsste Nextcloud schneller funktionieren.

 

d-ncloud:~# systemctl restart redis-server
d-ncloud:~# systemctl restart apache2