NextCloud auf Ubuntu 20.04 LTS mit Fail2Ban und Let’s Encrypt

1.Vorbereitungen Ubuntu 20.04 LTS

Benötigt wird ein Ubuntu 20.04 LTS auf einem Root/ vServer Eurer Wahl. Als Nächstes aktualisieren wir das System und installieren unzip:

sudo apt update && sudo upgrade -y
sudo apt install unzip

1.1. Apache 2 Webserver installieren

Für unseren Server haben wir uns für den Apache2 Webserver entschieden und installieren diesen mit folgendem Befehl und prüfen direkt im Anschluss den Status:

sudo apt install -y apache2 apache2-utils
systemctl status apache2

Die Ausgabe sollte in etwa so aussehen:

Sollte der Dienst nicht laufen, könnt Ihr diesen mit folgendem Befehl starten:

sudo systemctl start apache2

Der Dienst läuft jetzt, aber würde beim Reboot noch nicht mit starten. Damit der Apache2 auch beim nächsten Systemstart wieder mit startet:

sudo systemctl enable apache2

1.2. MariaDB Datenbank installieren

MariaDB installieren wir uns über Befehlszeile und prüfen anschließend, ähnlich wie bei dem Apache2 Webserver, die Statusausgabe:

sudo apt install mariadb-server mariadb-client
systemctl status mariadb

Die Datenbank ist installiert. Die Ausgabe des systemcrl status mariadb sieht so oder so ähnlich aus:

Sollte die Datenbank nicht gleich gestartet sein, so könnt Ihr dies mit:

sudo systemctl start mariadb

Auch hier fügen wie die Anweisung hinzu, die Datenbank wieder mit zu starten, sollten wir das System rebooten:

sudo systemctl enable mariadb

Anschließend führen wir das Post-Installations Sicherheitsskript auf.

sudo mysql_secure_installation

Da die Datenbank noch kein Passwort besitzt, können wir auf die erste Frage des Passworts einfach mit einem ENTER quitieren. Jetzt werden wir nach einem Passwort gefragt und wir antworten mit Y, um ein neues root Passwort für MariaDB zu vergeben. GUT MERKEN oder AUFSCHREIBEN!

BILD

Alle weiteren Fragen könnt Ihr mit mit ENTER durchquittieren. Hier sind keine Angaben mehr nötig.

Einloggen können wir uns nun auch über die ROOT Rechte unseres OS root Benutzers. Das geht mit folgendem Befehl:

sudo mariadb -u root
exit;

Mit exit; verlassen wir die Datenbankumgebung wieder. Wir können uns nun noch die Versionshinweise anschauen:

mariadb --version

1.3. PHP 7.4 installieren

Aktuell ist derzeit die Version 7.4:

sudo apt install php7.4 libapache2-mod-php7.4 php7.4-mysql php-common php7.4-cli php7.4-common php7.4-json php7.4-opcache php7.4-readline php7.4-fpm

Wir haben uns für die php-fpm (FastCGI Process Manager Version) entschieden und aktivieren dies wie folgt, und starten anschließend den Apache2 neu:

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php7.4-fpm
sudo systemctl restart apache2

Damit haben wir PHP auf dem Ubuntu installiert und hiermit prüfen wir die Version:

php --version

2. NextCloud Installation

2.1. Nextcloud laden und entpacken

Wir loggen uns als root in unser Ubuntu ein und laden uns das aktuelle Installationsfile auf der Nextcloud Website. Zum Zeitpunkt des Scripts ist dies die Version 20.0.4:

wget https://download.nextcloud.com/server/releases/nextcloud-20.0.4.zip

Wir entpacken nun das Installationspaket in das Verzeichnis /var/www/nextcloud/ und vergeben die Rechte für unseren Apache2:

sudo unzip nextcloud-20.0.4.zip -d /var/www/
sudo chown www-data:www-data /var/www/nextcloud/ -R

2.2 Datenbank für NextCloud anlegen

Nun legen wir eine Datenbank und einen Datenbankbenutzer an. Diese könnt ihr frei wählen, notiert Euch diese aber gut. Die brauchen wir später ja für die Installation. In meinem Fall habe ich die Datenbank ‘nextcloud’ und den Nutzer ‘nextclouduser’ benannt. Diese könnt Ihr aber frei wählen, ersetzt diese dann in den folgenden Zeilen durch Eure Werte. Ebenso das ‘yourpasswd’:

sudo mysql

create database nextcloud;

create user nextclouduser@localhost identified by 'yourpasswd';

grant all privileges on nextcloud.* to nextclouduser@localhost identified by 'yourpasswd';

flush privivleges;

exit;

2.3. Virtuellen Host im Apache2 anlegen

In unseren Beispiel hier legen wir einen virtuelle Host an. Evtl. habt Ihr noch andere Websiten, die Ihr hier hosten wollt.
Ihr solltet jetzt eine Domain auf Euren Server konfiguriert haben. Ich habe in meinem Fall die cloud.meine-domain.com gewählt. Also eine Subdomain. Legt dafür in Eurer DNS Verwaltung der Domain einen A Record an:
cloud.deinedomain.com sollte auf die Server IP verweisen.

sudo nano /etc/apache2/sites-available/nextcloud.conf

In diese Datei kommt folgender Inhalt, Ihr denkt aber daran, die cloud.meine-domain.com gegen Eure zu ersetzen.

<VirtualHost *:80>
        DocumentRoot "/var/www/nextcloud"
        ServerName cloud.meine-domain.com
        ErrorLog ${APACHE_LOG_DIR}/nextcloud.error
        CustomLog ${APACHE_LOG_DIR}/nextcloud.access combined
        <Directory /var/www/nextcloud/>
            Require all granted
            Options FollowSymlinks MultiViews
            AllowOverride All
           <IfModule mod_dav.c>
               Dav off
           </IfModule>
        SetEnv HOME /var/www/nextcloud
        SetEnv HTTP_HOME /var/www/nextcloud
        Satisfy Any
       </Directory>
</VirtualHost>

Jetzt bereiten wir den Apache auf den virtuelle Host vor uns aktivieren Apache Module:

sudo a2ensite nextcloud.conf
sudo a2enmod rewrite headers env dir mime setenvif ssl

Die Konfiguration können wir testen:

sudo apache2ctl -t

Anschließend starten wir den Apache neu.

sudo systemctl restart apache2

In meinem Fall zeigte der Aufruf der cloud.meine-domain.com noch den Standard Startbildschirm des Ubuntu Apache2. Wir müssen hier noch den default-virtual Host deaktivieren:

sudo a2dissite 000-default

Nun installieren wir noch benötigte PHP Module nach:

sudo apt install php-imagick php7.4-common php7.4-mysql php7.4-fpm php7.4-gd php7.4-json php7.4-curl  php7.4-zip php7.4-xml php7.4-mbstring php7.4-bz2 php7.4-intl php7.4-bcmath php7.4-gmp

sudo systemctl reload apache2

Damit konnte ich schon auf die Nextcloud über IP/ Domainnamen im Browser zugreifen.

2.4. Let’s Encrypt

Sicher ist sicher, auch hier ist die Vergabe eines Zertifikates sinnvoll und wichtig. Unsere Cloud soll sicher sein! Dazu installieren wir uns den Certbot:

sudo apt install certbot python3-certbot-apache

Als nächstes führen wir folgenden Befehl aus, um ein kostenloses Let’s Encrypt Zertifikat zu erhalten. Ersetzt die E-Mail und die Domain wieder auf Eure Werte.

sudo certbot --apache --agree-tos --redirect --staple-ocsp --email email@meine-domain.com -d cloud.meine-domain.com

Wir aktivieren noch den HSTS Header in der nextcloud-le-ssl.conf:

sudo nano /etc/apache2/sites-enabled/nextcloud-le-ssl.conf

Hier fügen wir über der Zeile </VirtualHost> folgender Zeile ein:

Header always set Strict-Transport-Security "max-age=31536000"

Wir lassen Apache2 die Konfiguration noch einmal prüfen, bevor wir den Dienst neu starten:

sudo apache2ctl -t
sudo systemctl reload apache2

2.5. Datenverzeichnis festlegen und Installation abschließen

Ich möchte die Daten nicht im Unterverzeichnis /var/www/nextcloud liegen haben sondern parallel dazu im /var/www/cloud-data. Ihr könnt den Speicherort auch anders wählen, ersetzt dann einfach den Pfad durch Euren!:

sudo mkdir /var/www/cloud-data
sudo chown www-data:www-data /var/www/cloud-data -R

Viel Vorbereitung war bis jetzt zu leisten, nun geht es in den Browser und wir stoßen die eigentliche Installation an:

https://cloud.meine-domain.com

Wir sehen nun den klassisch blauen NextCloud Screen und können einen ADMIN Account anlegen. Ich empfehle hier nicht den klassischen Admin oder Root, sondern wählt was eigenes aus. Passwort auswählen und eintragen.

Unter dem Feld Data Folder wird nun unser Datenverzeichnis eingetragen:

/var/www/cloud-data/

Dann fügen wir noch die Datenbank Daten ein.

Nextcloud führt nun die Installation durch und wir können uns anschließend mit dem Admin Konto einloggen und Benutzer anlegen.

Solltet Ihr mal Euren Root Zugang vergessen, so könnt Ihr Euch über die Konsole zum Server verbinden und das Passwort zurücksetzen mit:

sudo -u www-data php /var/www/nextcloud/occ user:resetpassword nextcloud_username

2.6. NextCloud optimieren

2.6.1. Memory Limit

The PHP memory limit is below the recommended value of 512MB.

Nach der Installation werdet Ihr im Admin Panel eine Meldung erhalten, dass Euer PHP Memory Limit zu niedrig ist. Hierzu einfach die entsprechenden PHP.INI Dateien abändern. FPM oder Apache2, je nachdem ob Ihr auch den FPM Mode gewählt habt:

nano /etc/php/7.4/apache2/phpi.ini
nano /etc/php/7.4/fpm/php.ini
Ich habe hier 1GB Speicher gewählt, da meine NextCloud auf einem größzügigen Host läuft. Gefordert sind 512MB.

2.6.2. Cron einrichten

Nextcloud empfiehl für produktive und größere Umgebungen die Einrichtung des Cron Dienstes:

Dazu führt Ihr in der Konsole einfach folgendes ein:

crontab -u www-data -e

Am Ende der Datei fügt Ihr dann folgende Zeile ein:

*/5  *  *  *  * php -f /var/www/nextcloud/cron.php

Kontrollieren solltet Ihr den korrekten Eintrag mit:

crontab -u www-data -l
Prima, der Cron ist eingerichtet.

2.6.3. Cache einrichten

Wir entscheiden uns hier beim Cache für die schnelle aPCU Version. Dafür installieren wir das Paket:

apt install php-apcu

Anschließend müssen wir das unserer Nextcloud noch mitteilen, dass der aPCU Cache zu nutzen ist:

nano /var/www/nextcloud/config/config.php

Dort ergänzen wir folgende Zeige:

'memcache.local' => '\OC\Memcache\APCu',

2.6.4. Fehlende Indexe ergänzen

cd /var/www/nextcloud/
sudo -u www-data php occ db:add-missing-indices

2.6.5. Reports

So ist alles prima! So sollte es nun bei Euch auch aussehen.
Nextcloud Sicherheitsscanner ist auch zufrieden: Rating A+!

3. fail2ban

fail2ban können wir nicht nur auf E-Mail oder SSH Zugänge anwenden, sondern auch unsere NextCloud gegen Zugriffe fremder dahingehend schützen, dass nach einer vordefinierten Anzahl Fehlversuche der Zugang für den Nutzer gesperrt wird.

Dafür laden wir uns das fail2ban Paket:

apt install fail2ban

Anschließend legen wir uns eine Log-Datei an, in der die Fehlversuche gespeichert werden und die von fail2ban ausgelesen wird. Diese muss für den Webserver noch mit den passenden Rechten versehen werden.

Da wir jetzt ein Log File haben, können wir der NextCloud mitteilen, dass Fehlversuche protokoliert werden sollen, in eben genau dieser Datei. Dafür müssen wir in folgender Datei Änderungen vornehmen. Dazu rufen wir unseren Nano mit der Datei auf:

nano /var/www/nextcloud/config/config.php

Wir müssen nun folgenden Block in die Datei einfügen:

'log_type' => 'file',
'logtimezone' => 'Europe/Berlin',
'logfile' => '/var/log/nextcloud.log',
'loglevel' => 2,

Anschließend legen wir uns einen Filter für die NextCloud an. Das tun wir, indem wir folgende Datei erstellen:

nano /etc/fail2ban/filter.d/nextcloud.conf

In diese schreiben wir dann den Inhalt wie folgt:

[Definition]
_groupsre = (?:(?:,?\s"\w+":(?:"[^"]+"|\w+)))
 failregex = ^{%(_groupsre)s,?\s"remoteAddr":""%(_groupsre)s,?\s"message":"Login failed:
             ^{%(_groupsre)s,?\s"remoteAddr":""%(_groupsre)s,?\s"message":"Trusted domain error.
 datepattern = ,?\s"time"\s:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"

Jetzt erstellen wir für fail2ban ein neues Jail. Dazu rufen wir wieder unseren Editor mit folgender Datei auf:

nano /etc/fail2ban/jail.conf

Am Ende der Datei kommt dann folgender Block als Ergänzung hinzu:

[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /var/log/nextcloud.log

Die Zeile action = sendet eine E-Mail an den Admin. Sollte dies nicht gewünscht sein, so könnt Ihr diese auch weglassen. Wir starten den Dienst neu:

service fail2ban restart

Nun können wir den Filter auch testen:

fail2ban-client status

Nach einem Versuch, mich einzuloggen und ein falsches Passwort zu nutzen, konnte man den fehlgeschlagenen Versuch direkt erkennen.

Hier noch ein genauerer Blick auf den Filter:

fail2ban-regex /var/log/nextcloud.log /etc/fail2ban/filter.d/nextcloud.conf

Damit haben wir auch das Aussperren Fremder absolviert.

Sicherheitscheck bei https://www.ssllabs.com/ssltest/analyze.html

Ich hoffe das Tutorial war verständlich, Ihr seid gut durchgekommen. Bei Fragen schreibt in die Kommentare oder schickt mir eine E-Mail.

Grüße
Sascha

Quellen:

https://www.linuxbabe.com/ubuntu/install-nextcloud-ubuntu-20-04-apache-lamp-stack

https://www.linuxbabe.com/ubuntu/install-lamp-stack-ubuntu-20-04-server-desktop

https://askubuntu.com/questions/1010300/apache-virtual-host-not-working

https://docs.nextcloud.com/server/19/admin_manual/installation/harden_server.html#setup-a-filter-and-a-jail-for-nextcloud

https://docs.nextcloud.com/server/20/admin_manual/configuration_server/caching_configuration.html#id1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.