前几天写了一篇Vaultwarden部署的文章(PC 安卓 苹果全平台密码管理工具BitWarden本地部署教程1Panel+Dcoker+反代 (wanpeng.life)),但是如果Vaultwarden直接暴露在公网上还是挺危险的,极大可能被人暴力破解,那么有什么方法进行防护呢?今天就跟大家分享一下,利用Fail2ban进行对爆破者IP的自动封禁。
Fail2Ban 是一个用 Python 编写的安全软件框架,它能够防止基于暴力破解的攻击。它通过监控日志文件(如 /var/log/auth.log, /var/log/apache/access.log 等)来检测多个失败的登录尝试,然后通过更新防火墙规则(如 iptables)来临时禁止可疑的 IP 地址。
一、先决条件
开启 Bitwarden 日志记录
首先要开启 Bitwarden 的日志记录功能,fail2ban 需要通过读取日志中的登录错误日志,来累计失败次数,执行封禁动作。
docker run -d --name vaultwarden \
...
-e LOG_FILE=/data/vaultwarden.log \
-e TZ=Asia/Shanghai \
...
# 验证
cat vaultwarden.log
此步骤为重新编辑 Bitwarden 容器的启动命令,新增环境变量 LOG_FILE=/data/vaultwarden.log ,用于把日志持久化到本地。(容器不支持修改,只能删除重建,新增环境变量步骤会删除原容器,如原容器有数据,并且没有持久化到本地,请谨慎操作。)
二、配置步骤
1. 创建持久化存储
创建持久化存储,将 fail2ban 的配置文件持久化到本地,防止重建容器时被删除。
mkdir -p /opt/1panel/apps/fail2ban/action.d
mkdir -p /opt/1panel/apps/fail2ban/filter.d
mkdir -p /opt/1panel/apps/fail2ban/jail.d
路径自定义,跟下面的步骤都有关联,灵活定义、修改。
2. 把 REJECT 类型替换为 DROP
将 iptables 的策略规则有拒绝改成直接丢弃。
# vim /opt/1panel/apps/fail2ban/action.d/iptables.local
[Init]
blocktype = DROP
[Init?family=inet6]
blocktype = DROP
3. 创建 Dockerfile 文件
创建 fail2ban 容器的 Dockerfile 文件,用来启动容器;
时区国内请使用 “TZ=Asia/Shanghai”
注意 volumes 块的编写,确定要要存放的路径,我这里都放在了 /opt/1panel/apps/fail2ban 下
# vim /opt/1panel/apps/fail2ban/docker-compose.yml
version: '3'
services:
fail2ban:
container_name: fail2ban
restart: always
image: crazymax/fail2ban:latest
environment:
- TZ=Asia/Shanghai
- F2B_DB_PURGE_AGE=30d
- F2B_LOG_TARGET=/data/fail2ban.log
- F2B_LOG_LEVEL=INFO
- F2B_IPTABLES_CHAIN=INPUT
volumes:
- /opt/1panel/apps/fail2ban:/data
- /opt/1panel/apps/fail2ban/vaultwarden:/vaultwarden:ro
- /opt/1panel/apps/bitwarden/bitwarden/data/vaultwarden.log:/vaultwarden.log
network_mode: "host"
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
坑点:
Github 的部署手册没有/opt/1panel/apps/bitwarden/bitwarden/data/vaultwarden.log:/vaultwarden.log 这条,就会导致在后续启动容器的时候报错找不到 vaultwarden.log 文件。
这是因为 Bitwarden 容器的日志存放在本地,fail2ban 容器并没有权限访问,所以需要把本地 Bitwarden 的日志映射到容器内,映射后,容器方可正常启动。
未映射:
容器启动失败。
映射后:
容器正常启动。
4. 使用 Dockerfile 启动容器
启动容器,找到自己定义好的容器数据持久化目录,找到 Dockerfile 文件。
cd /opt/1panel/apps/fail2ban/
docker-compose up -d
5. Filter 配置
创建过滤器,检测失败的登录尝试。
# vim /opt/1panel/apps/fail2ban/filter.d/vaultwarden.local
[INCLUDES]
before = common.conf
[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\. Username:.*$
ignoreregex =
6. Jail 配置
创建监禁规则,定义监控的端口、日志文件路径、最大重试次数、封禁时间等参数。
# vim /opt/1panel/apps/fail2ban/jail.d/vaultwarden.local
[vaultwarden]
enabled = true
port = 58843
filter = vaultwarden
banaction = %(banaction_allports)s
logpath = /vaultwarden.log
maxretry = 3
bantime = 14400
findtime = 14400
端口记得替换成自己部署时填写的端口。
7. 验证
查看封禁状态
docker exec -t fail2ban fail2ban-client status vaultwarden
解封IP地址
docker exec -t fail2ban fail2ban-client set vaultwarden unbanip XX.XX.XX.XX
Github 链接:https://github.com/dani-garcia/vaultwarden/wiki/Fail2Ban-Setup#synology-dsm
评论前必须登录!
立即登录 注册