Vaultwarden mit fail2ban absichern

Moin!

Im letzten Beitrag über Vaultwarden haben wir die Grundinstallation durchgeführt.
Wie auch die letzte Anleitung verwende ich nur Docker compose.
Um unseren Dienst 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 Vaultwarden 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 Syslog von Vaultwarden zum Proxy, lesen die Syslogs aus und blocken direkt am Reverse Proxy die anfragende IP.

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 zu dem Vaultwarden Container herstellen. Danach springen wir das Verzeichnis, in der die docker-compose.yml liegt.
Dort angekommen editieren wir die besagte Datei, dazu fügen wir unter „environment“ folgende Parameter hinzu.

cd /home/vaultwarden/vaultwarden/
nano docker-compose.yml
    environment:
      - LOG_FILE=/vw-data/vaultwarden.log
      - LOG_LEVEL=info

Jetzt stoppen und zerstören wir den Container. Danach erstellen wir den Container mit den neuen Parametern und starten diesen.

docker-compose down
docker-compose up -d

Nun Fail2Ban installieren und eine Filterregel für die normale Vault anlegen.

sudo apt update && apt upgrade -y
sudo apt install fail2ban
sudo nano /etc/fail2ban/filter.d/vaultwarden.conf
[INCLUDES]
before = common.conf

[Definition]
failregex = ^.*Username or password is incorrect. Try again. IP: <ADDR>. Username:.*$
ignoreregex =

Danach eine Filterregel für das Admin-Web UI erstellen.

sudo nano /etc/fail2ban/filter.d/vaultwarden-admin.conf
[INCLUDES]
before = common.conf

[Definition]
failregex = ^.*Invalid admin token. IP: <ADDR>.*$
ignoreregex =

Jetzt erstellen wir das Jail für die Vault und konfigurieren Parameter wie max. Login versuche (maxretry) oder Banzeit (bantime).

sudo nano /etc/fail2ban/jail.d/vaultwarden.local
[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden
action = iptables-allports[name=vaultwarden]
logpath = /vw-data/vaultwarden.log
maxretry = 3
bantime = 14400
findtime = 14400

Anschließend erstellen wir das Jail für die Adminoberfläche.

sudo nano /etc/fail2ban/jail.d/vaultwarden-admin.local
[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden-admin
action = iptables-allports[name=vaultwarden]
logpath = /vw-data/vaultwarden.log
maxretry = 3
bantime = 14400
findtime = 14400

Jetzt passen wir noch die Action an. Dies ist nötig, da bei Docker Containern die CHAIN nicht als Input, sondern als FORWARD gekennzeichnet sein muss.

sudo nano /etc/fail2ban/action.d/iptables-allports.conf
[Init]

blocktype = DROP
chain = FORWARD

Neustarten des Fail2Ban Dienstes und mit dem Smartphone mehrere Male mit falschen Daten auf Vaultwarden 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.

Möglichkeit zwei der Installation

Voraussetzung dafür:

Verbindung per SSH zu dem Vaultwarden Container herstellen. Danach springen wir das Verzeichnis, in der die docker-compose.yml liegt.
Dort angekommen editieren wir die besagte Datei, dazu fügen wir unter „environment“ und „loggingfolgende Parameter hinzu.
Anders als bei der Möglichkeit eins aktivieren wir das Logging über Syslog.

cd /home/vaultwarden/vaultwarden/
nano docker-compose.yml
    environment:
      - USE_SYSLOG=true
      - LOG_LEVEL=info
    logging:
      driver: syslog
      options:
        syslog-address: "udp://ip.des.reverse.proxys:514"
        tag: "Vaultwarden"

Jetzt stoppen und zerstören wir den Container. Danach erstellen wir den Container mit den neuen Parametern und starten diesen.

docker-compose down
docker-compose up -d

Nun sind wir so weit mit der Konfiguration des Vaultwarden Containers 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
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

# Pro Logsender ein syslog-file
$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.Vaultwarden.Containers/24

Rsyslog neu starten, damit die Config übernommen wird.

sudo systemctl restart rsyslog.service

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

sudo apt install fail2ban
sudo nano /etc/fail2ban/filter.d/vaultwarden.conf
[INCLUDES]
before = common.conf

[Definition]
failregex = ^.*Username or password is incorrect. Try again. IP: <ADDR>. Username:.*$
ignoreregex =

Darauf folgt die Filterregel für das Admin-Web UI.

sudo nano /etc/fail2ban/filter.d/vaultwarden-admin.conf
[INCLUDES]
before = common.conf

[Definition]
failregex = ^.*Invalid admin token. IP: <ADDR>.*$
ignoreregex =

Danach legen wir das erste Jail an.

sudo nano /etc/fail2ban/jail.d/vaultwarden.local
[vaultwarden]
enabled = true
port = 80,443,8081
filter = vaultwarden
action = iptables-allports[name=vaultwarden]
logpath = /var/log/syslog-Vaultwarden.log
maxretry = 3
bantime = 14400
findtime = 14400

Jetzt das Jail für die Adminoberfläche.

sudo nano /etc/fail2ban/jail.d/vaultwarden-admin.local
[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden-admin
action = iptables-allports[name=vaultwarden]
logpath = /var/log/syslog-Vaultwarden.log
maxretry = 3
bantime = 14400
findtime = 14400

Nun passen wir noch die Action an. Dies ist nötig, da bei Docker Containern die CHAIN nicht als INPUT, sondern als FORWARD gekennzeichnet sein muss.

sudo nano /etc/fail2ban/action.d/iptables-allports.conf
[Init]

blocktype = DROP
chain = FORWARD

Neustarten des Fail2Ban Dienstes und mit dem Smartphone mehrere Male mit falschen Daten auf Vaultwarden 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.

Entbannen eines Client / IP-Adresse

Ein Entbannen einer IP bzw. eines Clients ist relativ einfach möglich. Dazu suchen wir uns aus dem Log einfach die entsprechende IP raus und entsperren diese mit dem folgenden Befehl.

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

Grüße gehen aus dem Archiv!

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