Nextcloud mit Fail2Ban absichern

Moin!

Im letzten Beitrag über Nextcloud haben wir eine erweitertere Grundinstallation durchgeführt.
Um unsere Cloud vor Brute-Force Attacken von Unbekannten zu schützen installieren wir nun Fail2Ban.

Fail2Ban ist in der Lage, Logs mit konfigurierbaren Filtern nach bestimmten Begriffen bzw. Zeilen zu durchsuchen. Wird ein zutreffender Begriff gefunden, löst eine Action aus, die die anfragende IP für eine frei wählbare Zeit ins Jail steckt.
So sind wir in der Lage bei mehreren falschen Loginversuchen die anfragende IP zu blocken.

tl;dr:

Wir schützen unseren Dienst vor Scriptkiddies und Trolls.

Ich stelle euch 2 Möglichkeiten vor Fail2Ban zu installieren:

  1. Möglichkeit: Wir installieren Fail2Ban in dem Nextcloud Container, lesen die Logdatei aus und blocken dort die anfragende IP.
  2. Möglichkeit: Wir installieren einen Rsyslog Server und Fail2Ban auf dem Reverse Proxy. Danach übertragen wir die Logs von Nextcloud zum Proxy, lesen die Logs aus und blocken direkt am Reverse Proxy die anfragende IP. Wir nutzen allerdings nicht die native Syslogfunktion von Nextcloud, da wir sonst kein normales Logfile mehr hätten, welches sich über die WebUI auslesen lässt.

Nr. 1 eignet sich gut für Lösungen ohne Reverse Proxy und ist einfacher.

Nr. 2 eignet sich deutlich besser für Lösungen mit Reverse Proxy. Zudem ist es möglich mit einer Fail2Ban Installation mehrere Dienste zu schützen. Leider auch aufwendiger.

Wir starten mit Nr. 1:

Voraussetzung dafür:

Verbindung per SSH auf die Nextcloud. Update, sowie Upgrade durchführen und Fail2Ban installieren. Anschließend erstellen wir eine Filterregel.

sudo apt update && apt upgrade -y
sudo apt install fail2ban
sudo nano /etc/fail2ban/filter.d/nextcloud.conf

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

Nun erstellen wir das Jail für die Cloud und konfigurieren Parameter wie max. Loginversuche (maxretry) oder Banzeit (bantime).

sudo nano /etc/fail2ban/jail.d/nextcloud.local

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

Neustarten des Fail2Ban Dienstes und mit dem Smartphone mehrere Male mit falschen Daten auf der Nextcloud einloggen. Danach prüfen wir ob die anfragende IP geblockt wurde.
Im Log taucht die Meldung „BAN IP xxx.xxx.xxx.xx“ auf.

sudo systemctl restart fail2ban.service

sudo cat /var/log/fail2ban.log

So sollte es aussehen wenn die IP erfolgreich gebannt wurde.

Ein entbannen der IP ist so möglich.

sudo fail2ban-client set nextcloud unbanip xxx.xxx.xxx.xxx

Nun wenden wir uns der 2. Möglichkeit zu.

Voraussetzung dafür:

Verbindung per SSH auf die Nextcloud. Auf der Maschine angekommen passen wir die Nextcloud Config an.

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

  'trusted_proxies' => 
  array (
    0 => 'IP.des.Reverse.Proxys',
  ),

Anschließend installieren und konfigurieren wir Rsyslog.

sudo apt update && sudo apt upgrade -y
sudo apt install rsyslog -y
nano /etc/rsyslog.conf

#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
#module(load="imklog")   # provides kernel logging support
#module(load="immark")  # provides --MARK-- message capability

###########################
#### GLOBAL DIRECTIVES ####
###########################

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#

#
# Default Template welches deativiert werden muss.
#
#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

#
# Angepasstes Template, damit Timestamps und Logtags aus dem Log entfernt sind und das Regex von Fail2ban nicht stören
#
$template noTimestampFormat,"%msg%\n"
$ActionFileDefaultTemplate noTimestampFormat

###############
#### RULES ####
###############

# First some standard log files.  Log by facility.

auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
daemon.*                        -/var/log/daemon.log
kern.*                          -/var/log/kern.log
lpr.*                           -/var/log/lpr.log
mail.*                          -/var/log/mail.log
user.*                          -/var/log/user.log

# Loggen einer custom Log file
$ModLoad imfile
$InputFilePollInterval 1
$InputFileName /var/log/nextcloud/nextcloud.log
$InputFileTag
$InputFileStateFile
$InputFileFacility local7
$InputRunFileMonitor

# Filtert den Log nach einem Textfeld, bei Fund wird der Eintrag in eine seperate Logfile eingetragen und per Syslog weiter gereicht
:msg, contains, "Login failed:" {
        local7.* /var/log/nextcloud/failed-login.log
        local7.* @192.168.2.31:514
}

Im Namen des Webserverusers www-data eine Logdatei anlegen in der die fehlgeschlagenden Loginversuche dokumentiert werden.

sudo -u www-data /var/log/nextcloud/failed-login.log 

Rsyslog Dienst neustarten.

sudo systemctl restart rsyslog.service

Nun sind wir soweit mit der Konfiguration der Nextcloud fertig.
Wir bauen eine SSH Verbindung zum Reverse Proxy auf, installieren und konfigurieren dort den Syslog Server.

sudo apt update && sudo apt upgrade -y
sudo apt install rsyslog
sudo nano /etc/rsyslog.conf

#################
#### MODULES ####
#################

module(load="imuxsock") # provides support for local system logging
#module(load="imklog")   # provides kernel logging support
#module(load="immark")  # provides --MARK-- message capability

# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")

###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
daemon.*                        -/var/log/daemon.log
kern.*                          -/var/log/kern.log
lpr.*                           -/var/log/lpr.log
mail.*                          -/var/log/mail.log
user.*                          -/var/log/user.log

#
# Default Template für alle eingehende Syslogs, jeder Host erhält seinen eigendes Logfile
#
$template DynaFile,"/var/log/syslog-%HOSTNAME%.log"
*.* -?DynaFile

#
# IP's die Syslogs zum Server senden dürfen
#
$AllowedSender UDP, 127.0.0.1, IP.des.Nextcloud.Containers/24

Rsyslog neustarten, damit die Konfig übernommen wird.

sudo systemctl restart rsyslog.service

Anschließend installieren wir Fail2Ban und erstellen die Filterregel für die Cloud.

sudo apt install fail2ban
sudo nano /etc/fail2ban/filter.d/nextcloud.conf

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

Danach legen wir das Jail an.

sudo nano /etc/fail2ban/jail.d/nextcloud.local

[nextcloud]
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
action = iptables-allports-nextcloud[name=nextcloud]
logpath = /var/log/syslog-Nextcloud.log
maxretry = 3
bantime = 14400
findtime = 14400

Wir kopieren eine Standart Action und editieren diese damit sie mit unserem Setup funktioniert. Aus INPUT wird FOWARD.

sudo cp /etc/fail2ban/action.d/iptables-allports.conf /etc/fail2ban/action.de/iptables-allports-nextcloud.conf
sudo nano /etc/fail2ban/action.de/iptables-allports-nextcloud.conf

[Init]

blocktype = DROP
chain = FORWARD

Neustarten des Fail2Ban Dienstes und mit dem Smartphone mehrere Male mit falschen Daten auf der Cloud einloggen. Danach prüfen wir ob die anfragende IP geblockt wurde.
Im Log taucht die Meldung „BAN IP xxx.xxx.xxx.xx“ auf.

sudo systemctl restart fail2ban.service

sudo cat /var/log/fail2ban.log

So sollte es aussehen wenn die IP erfolgreich gebannt wurde.

Ein entbannen der IP ist so möglich.

sudo fail2ban-client set nextcloud unbanip xxx.xxx.xxx.xxx

Grüße gehen aus dem Archiv!

Kommentar verfassen

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