Fail2Ban Logo

Tutorial: Wie Ihr Eure Nextcloud-Installation mit Fail2Ban absichern könnt

Linux bringt von Haus aus prima Möglichkeiten mit, mit Bordmitteln das Thema Sicherheit out-of-the-box entsprechend genau zu betrachten. Eins meiner Lieblings-Tools dafür ist Fail2Ban: Das kleine, aber feine Programm prüft diverse Logfiles auf erfolglose Anmeldeversuche oder Ausdrücke und sperrt dann die jeweiligen IP-Adressen nach einer gewissen Anzahl Versuchen für eine entsprechende Zeitspanne.

Bisher habe ich Fail2Ban dafür genutzt, unliebsame Loginversuche per Secure Shell (SSH) zu unterbinden, das Ganze läßt sich dann aber auch auf Webserver oder alle anderen Dienste – oder Anwendungen – erweitern. Als überzeugter Nextcloud-Nutzer wollte ich auch meine private Cloud gerne besser absichern: Zwar gibt es hier den Bruteforce-Schutz, aber die stetigen Anmeldungen, die versuchen, ihre IP als vertrauten “trusted” Host in meiner Installation zu platzieren, nerven in Summe doch schon ein wenig:

Nextcloud Trusted Host Warning

Zwar nutze ich auch für das Administrator-Konto der Nextcloud die Zwei-Wege-Authentifizierung, störend sind die ewigen Versuche aber doch allemal. Die Lösung hier: Das Durchsuchen der Nextcloud-Logdatei auf erfolglose Anmeldeversuche und das entsprechende Aussperren per Fail2Ban respektive iptables. Wie das geht, möchte ich nachfolgend nun zeigen!

Am Anfang steht die Installation des Fail2Ban-Paketes – unter meinem Debian-System geht das über den folgenden Befehl:

Sofern iptables noch nicht installiert ist, kann man hier durch ein

auch dieses Paket nachinstallieren und hat dann erst einmal die Grundvoraussetzungen aus programmtechnischer Sicht geschaffen. Nun gilt es, die vorhandene Konfigurationsdatei jail.conf im Verzeichnis /etc/fail2ban – diese solltet Ihr nicht bearbeiten, da sie durch (Distributions-) Updates gegebenenfalls überschrieben wird – in Eure individuelle Konfigurationsdatei zu kopieren.

Schickt also die Befehlszeile

hinterher und Ihr habt Eure eigene, jederzeit ohne Probleme anzupassende Konfigurationsdatei jail.local erstellt, die im Nachgang mit dem Editor Eurer Wahl (hier: vi) direkt angepaßt werden kann.

Standardmässig ist der SSH-Dienst schon für die Sperrung konfiguriert und die Sperrzeit (“jailtime”) ist hier auf 3600 Sekunden vorkonfiguriert. In meinem Beispiel wird diese Zeit auf 24 Stunden (86400 Sekunden) erhöht und die Anzahl der Versuche, nach denen geblockt werden soll, wird auf drei verringert. Die “findtime” definiert wiederum die Anzahl der Sekunden, nach denen der Zähler für den “maxretry”-Wert zurückgesetzt wird. Die Konfigurationsdatei enthält noch viele weitere Parameter, diese sollten hier aber erst einmal im Fokus stehen. Vergeßt dabei nicht, dass Ihr Euch gegebenenfalls auch selbst aussperren könnt – am Anfang sollte man also lieber mit kleineren Werten arbeiten und am Ende dann ein wenig justieren.

Nextcloud Fail2Ban Parameter

Schauen wir uns nun den weiteren Verlauf den Abschnitt “# JAILS” an, finden wir unter anderem schon den SSH-Dienst. Direkt darunter fügen wir nun eine neue Definition ein und definieren hier die Parameter des Nextcloud-“Jails”, darunter auch das Logfile.

Nextcloud Fail2Ban Nextcloud-Jail

Wir differenzieren hier an dieser Stelle einfach und erstellen zwei Definitionen – für fehlgeschlagene Logins und für die Versuche, die jeweilige IP-Adresse der Nextcloud-Instanz als “Trusted Domain” zu konfigurieren: Beides wollen wir natürlich nicht!

Das kann nun erst einmal so übernommen und gespeichert werden. Nun gilt es, den Filter an sich zu definieren, sprich: Auf was soll Fail2Ban ansprechen? Dazu legen wir im Verzeichnis /etc/fail2ban/filter.d einen neuen Filter an, der sinnigerweise “nextcloud_trusted.conf” heißt und den folgenden Inhalt hat:

Ein zweiter Filter in Form einer weiteren Datei heisst dann “nextcloud_logins.conf” und soll sich um das Aussperren fehlerhafter Login-Versuche kümmern:

Wir filtern also in der Tat nach dem Passus “Trusted domain error.”, der ja bereits oben im Administrations-Bereich unserer Nextcloud-Instanz negativ aufgefallen ist. Auch die hin und wieder erschienenen Login-Fehlversuche, als “Login failed:” geloggt, haben wir erfolgreich definiert.

Bevor wir nun Fail2Ban durch Eingabe von

neu starten und die neue Konfiguration laden lassen, müssen wir uns noch um das Logfile kümmern, das Nextcloud auch schreiben soll.

Dieses Logfile selbst respektive das Log-Level definieren wir in der config.php unserer Nextcloud-Installation. Bei mir liegt diese unter /var/www/nextcloud/config. Fügt hier nun irgendwo in der Konfiguration die folgenden beiden Parameter ein, die – je nach Konfiguration Eures Systems und Euren Wünschen – auch entsprechend unterscheiden können:

In meinem Fall liegt die von Fail2Ban auszuwertende Log-Datei von Nextcloud in meinem Datenverzeichnis, was auf einer separaten Partition platziert wurde und dessen Mount-Punkt in /var/nextcloud_data eingehangen ist. Abspeichern, fertig!

Sind diese Änderungen nun alle getätigt, kann der Fail2Ban-Dienst neu gestartet werden und sollte auch ohne Fehlermeldung wieder hochfahren. Der Befehl

sollte dann ein paar interessante Informationen und den Beweis liefern, dass der Dienst ordnungsgemäß läuft.

Nextcloud Fail2Ban Status

Um nun zu sehen, ob der neue Filter respektive die neue Jail-Regel unter Fail2Ban für unsere Nextcloud auch funktioniert, können wir das Kommando

beziehungsweise

nutzen. Die Ausgabe sieht dann – je nach Dienst – wie folgt aus:

Nextcloud Fail2Ban Nextcloud-Filter-Status

Wir sehen also, dass der Filter aktiv ist, welches Logfile er bedient und welche Aktionen aktuell aktiv sind respektive waren – gesperrter IP-Adressen inklusive. Damit ist die Aufgabenstellung erfolgreich gemeistert und wir haben Fail2Ban erfolgreich dafür genutzt, unsere private Cloud mit Nextcloud noch ein wenig sicherer zu machen.

Das ist aber für Fail2Ban an sich nur der Anfang – wer mehr über das Tool wissen möchte, findet auf der offiziellen Homepage auch viele interessante HOWTOs. Unter anderem lässt sich das Ganze auch noch durch E-Mail-Benachrichtigungen oder eben das Überwachen weiterer Dienste weiter ausbauen.

Viel Spaß!

 

 

Ein Kommentar

  1. THX for source 🙂
    Debian 9 to 14 by philip.meyer@twistermax.de 26.11.2018

    sources:
    https://stackoverflow.com/questions/11621053/redirect-http-to-https-on-default-virtual-host-without-servername
    https://www.modius-techblog.de/linux/nextcloud-https-mit-self-signed-zertifikat-einrichten/?cookie-state-change=1543222540896
    https://ollis.blog/tutorial-wie-ihr-eure-nextcloud-installation-mit-fail2ban-absichern-koennt/
    https://www.howtoforge.com/tutorial/install-nextcloud-server-and-client-on-debian-9/
    https://nextclouders.de/nextcloud-in-weniger-als-20-minuten/

    1.) apt update
    2.) apt upgrade
    3.) reboot
    4.) apt install mc open-vm-tools –> open-vm-tools nur bei ESXi oder Workstation
    5.) reboot
    ——————————————————————————–
    6.) apt-get install apache2 mariadb-server
    7.) systemctl start apache2
    8.) systemctl enable apache2
    9.) systemctl start mysql
    10.) systemctl enable mariadb
    11.) apt install libapache2-mod-php php7.0 php7.0-xml php7.0-cgi php7.0-cli php7.0-gd php7.0-curl php7.0-zip php7.0-mysql php7.0-mbstring wget unzip
    ——————————————————————————-
    12.) mysql_secure_installation
    13.) every question until “change root password” to answer yes
    14.) mysql -u root -p
    15.) CREATE DATABASE nextclouddb;
    16.) CREATE USER ‘nextcloud’@’localhost’ IDENTIFIED BY ‘mypassword’;
    17.) GRANT ALL PRIVILEGES ON nextclouddb.* TO ‘nextcloud’@’localhost’;
    18.) FLUSH PRIVILEGES;
    19.) \q
    20.) mysql -u nextcloud -p
    21.) use nextcloud
    22.) \q
    ——————————————————————————-
    23.) wget https://download.nextcloud.com/server/releases/latest.zip
    24.) unzip latest.zip
    25.) mv nextcloud /var/www/html/
    26.) chown -R www-data:www-data /var/www/html/nextcloud
    27.) nano /etc/apache2/sites-available/nextcloud.conf
    27a.)
    ServerAdmin admin@example.com
    DocumentRoot “/var/www/html/nextcloud”
    ServerName 192.168.0.187

    Options MultiViews FollowSymlinks

    AllowOverride All
    Order allow,deny
    Allow from all

    TransferLog /var/log/apache2/nextcloud_access.log
    ErrorLog /var/log/apache2/nextcloud_error.log

    28.) a2dissite 000
    29.) a2ensite nextcloud
    30.) systemctl restart apache2
    ———————Firewall————————————————–
    31.) apt install ufw
    32.) ufw enable
    33.) ufw allow 22
    34.) ufw allow 80
    35.) ufw allow 443
    ——————————————————————————
    36.) configure on your ip-address http://XXX.XXX.XXX.XXX with a bowser
    37.) admin-name,admin-password, db-connection usw.
    ————————-secure ssh——————————————-
    38.) i’ve you got another user (not root), you can go to the next step, otherwise:
    useradd -g users -d /home/(newuser) -s /bin/bash (newuser)
    passwd (newuser)
    mkdir /home/(newuser)
    chown (newuser):users /home/(newuser)/
    39.) nano /etc/ssh/sshd_config
    40.) edit in sshd_config “PermitRootLogin yes” to “PermitRootLogin no”
    41.) /etc/init.d/ssh reload
    ————————-fail2ban———————————————
    42.) apt install fail2ban
    43.) cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    44.) nano /etc/fail2ban/jail.local
    –> [DEFAULT] bantime = 86400
    –> [DEFAULT] findtime = 600
    –> [DEFAULT] maxretry = 3
    45.) in jail.local section [jail] add:
    [nextcloud_logins]
    enabled = true
    logpath = /var/www/html/nextcloud/data/nextcloud.log
    port = http,https
    46.) in jail.local section [jail] add:
    [nextcloud_logins]
    enabled = true
    logpath = /var/www/html/nextcloud/data/nextcloud.log
    port = http,https
    47.) nano /etc/fail2ban/filter.d/nextcloud_trusted.conf
    line 1:[Definition]
    line 2:failregex = ^.*\”remoteAddr\”:\”\”.*Trusted domain error.*$
    48.) nano /etc/fail2ban/filter.d/nextcloud_logins.conf
    line 1:[Definition]
    line 2:failregex = ^.*\”remoteAddr\”:\”\”.*Login failed:.*$
    49.) systemctl restart fail2ban
    50.) nano /var/www/html/nextcloud/config/config.php
    add the following lines:
    ‘logfile’ => ‘/var/nextcloud_data/nextcloud.log’,
    ‘loglevel’ => 2,
    51.) service fail2ban restart
    ————————–activate ssl——————————————
    52.) a2enmod ssl
    53.) systemctl restart apache2
    54.) openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/nextcloud.key -out /etc/apache2/ssl/nextcloud.crt
    55.) nano /etc/apache/sites-avaiable/nextcloud-ssl.conf
    add:

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/nextcloud
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/nextcloud.crt
    SSLCertificateKeyFile /etc/apache2/ssl/nextcloud.key

    56.) a2ensite nextcloud-ssl.conf
    57.) systemctl restart apache2
    ——————————Redirect Port 80——————————–
    58.) nano /etc/apache2/sites-available/nextcloud.conf change to this:

    ServerName yourdomain
    RedirectPermanent / https://yourdomain/

Kommentar hinterlassen

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

*