Nextcloud mit Fail2Ban absichern

Moin!

Im letzten Beitrag über Nextcloud haben wir eine erweiterte 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 Login versuchen 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 Web UI 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.

Möglichkeit eins der Installation

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. Login versuche (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

Möglichkeit zwei der Installation

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. Im unterstem Segment müsst Ihr die IP des Nginx Proxy Managers eintragen.

sudo apt update && sudo apt upgrade -y && sudo apt install rsyslog -y
nano /etc/rsyslog.conf
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html


#################
#### 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")


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

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

#
# Set the default permissions for all log files.
#
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022

#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog

#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf

#
# 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

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info                       -/var/log/mail.info
mail.warn                       -/var/log/mail.warn
mail.err                        /var/log/mail.err

# 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.* @IP.des.Reverse.Proxys:514
}
#
# Some "catch-all" log files.
#
*.=debug;\
        auth,authpriv.none;\
        mail.none               -/var/log/debug
*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail.none               -/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg                         :omusrmsg:*

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

sudo -u www-data touch /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. Ihr ergänzt und editiert eure Config mit den hier gezeigten Parameter.

sudo apt update && sudo apt upgrade -y && sudo apt install rsyslog -y
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")

###########################
#### 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

#
# 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.d/iptables-allports-nextcloud.conf
sudo nano /etc/fail2ban/action.d/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!

Abonnieren
Benachrichtige mich bei
guest
9 Kommentare
Älteste
Neuste Meist Bewerteste
Inline Feedbacks
Zeige alle Kommentare
9
0
Bitte lasse uns an deinen Gedanken teilhaben und kommentier den Beitrag.x
Cookie Consent mit Real Cookie Banner