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:
- Möglichkeit: Wir installieren Fail2Ban in dem Vaultwarden Container, lesen die Logdatei aus und blocken dort die anfragende IP.
- 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 „logging“ folgende 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!