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

Wir starten mit Nr. 1:

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

- 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 Admininterface erstellen.

sudo nano /etc/fail2ban/filter.d/vaultwarden-admin.conf

[INCLUDES]
before = common.conf

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

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

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

[vaultwarden]
enabled = true
port = 80,443,8081
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

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.

Ein entbannen der IP ist so möglich.

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

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

Vorraussetzung 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.
Anders als bei der Möglichkeit 1 aktivieren wir das logging über Syslog.

cd /home/vaultwarden/vaultwarden/
nano docker-compose.yml

- USE_SYSLOG=true
- 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 sind wir soweit mit der Konfiguration des Vaultwarden Containers 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

# 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 neustarten, damit die Konfig ü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 Admininterface.

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.

Ein entbannen der IP ist so möglich.

sudo fail2ban-client set vaultwarden 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.