Vaultwarden自用的一套加强搭建方法

Cloudflare操作

初始默认设置。我是caddy仅放行了IPV6根据你自己的情况选择IPV4还是IPV6,`DNS` `记录`添加AAAA记录并当时开启小黄云。`SSL/TLS` `概述` 加密模式:完全(严格)

VPS操作
更新系统的软件包列表,升级所有已安装的软件包,清理不再需要的包,清理缓存,并通过 curl 下载并执行 Docker 的安装脚本

apt update -y && apt full-upgrade -y && apt --purge autoremove -y && apt autoclean -y && curl -fsSL https://get.docker.com | bash

创建 /etc/docker-data/vaultwarden 文件夹并进入该文件夹

sudo mkdir -p /etc/docker-data/vaultwarden && cd /etc/docker-data/vaultwarden

新建docker-compose.yaml文件

nano docker-compose.yaml

复制粘贴docker-compose.yaml文件内容,保存并退出。

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://域名/生成一个最少16位大小写字母数字随机路径"
    volumes:
      - ./vw-data:/data

  caddy:
    image: caddy:2
    container_name: caddy
    restart: unless-stopped
    ports:
      - "[::]:80:80"
      - "[::]:443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-config:/config
      - ./caddy-data:/data
    environment:
      DOMAIN: "https://域名"
      EMAIL: "邮箱"
      LOG_FILE: "/data/access.log"

创建Caddyfile文件

nano Caddyfile

复制Caddyfile文件内容,保存并退出。

:80 {
    abort
}

:443 {
    tls /data/default_server.crt /data/default_server.key {
        protocols tls1.3
    }
    abort
}

{$DOMAIN} {
    log {
        level INFO
        output file {$LOG_FILE} {
            roll_size 10MB
            roll_keep 10
        }
    }

    tls {$EMAIL} {
        protocols tls1.3
    }

    encode zstd gzip

    route {
        reverse_proxy /生成一个最少16位大小写字母数字随机路径/* vaultwarden:80 {
            header_up X-Real-IP {http.request.header.Cf-Connecting-Ip}
        }

        handle /* {
            abort
        }
    }
}

创建一个自签证书防止IP暴露域名

sudo mkdir -p /etc/docker-data/vaultwarden/caddy-data && sudo openssl req -x509 -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -keyout /etc/docker-data/vaultwarden/caddy-data/default_server.key -out /etc/docker-data/vaultwarden/caddy-data/default_server.crt -days 36500 -subj "/C=US/ST=State/L=City/O=Organization/OU=Organizational Unit/CN=Common Name"

启动容器

docker compose up -d

打开浏览器进入域名https://域名/生成一个最少16位大小写字母数字随机路径/
创建账号,导入密码,创建两步验证(建议使用第三方App,密码和2FA分离,鸡蛋不要装在一个篮子,我用的Aegis,建议分2个设备安装导入2FA,2FA数据加密导出后再套一层GPG加密存放云端U盘和电脑,有2FA新增就闲时手动多端数据同步),再验证非正确路径是否会访问不了。

新增关闭页面并禁用注册

nano docker-compose.yaml

vaultwarden environment下新增

SIGNUPS_ALLOWED: "false"
WEB_VAULT_ENABLED: "false"

格式与DOMAIN对齐,保存并退出。

重启docker

docker compose up -d && docker compose restart

再验证正确路径访问是否关闭了网页端

进入Cloudflare操作
安全性 WAF 自定义规则 编辑表达式 加入了仅自己设置的IP访问外加caddy证书续签的访问

(ip.src in {允许访问的IPV4地址,多IP的话中间空格}) or (ip.src in {允许访问的IPV6地址,多IP的话中间空格}) or (http.user_agent eq "acme.zerossl.com/v2/DV90" and ip.src eq 2a0e:ac00:231:8080::a31:803d)

采取措施 跳过 要跳过的 WAF 组件 所有其余自定义规则 放置位置 第一个

创建第二个阻止规则 编辑表达式 ,阻止域名访问,外加censys.io

(http.host eq "域名") or (ip.src in {162.142.125.0/24 167.94.138.0/24 167.94.145.0/24 167.94.146.0/24 167.248.133.0/24 199.45.154.0/24 199.45.155.0/24 206.168.34.0/24 2602:80d:1000:b0cc:e::/80 2620:96:e000:b0cc:e::/80 2602:80d:1003::/112 2602:80d:1004::/112}) or (http.user_agent eq "Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)")

采取措施 阻止
分别用设置允许的IP例如梯子去访问,和不在允许IP列表例如家宽,验证是否生效。

安装Watch­tower 自动1小时检查docker镜像容器更新,删除旧镜像。

docker run -d \
    --name watchtower \
    --restart unless-stopped \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower -c \
    --interval 3600

安装GNU Privacy Guardrclone

sudo apt-get install gnupg
curl https://rclone.org/install.sh | sudo bash

生成 GPG 密钥

gpg --full-generate-key

导出私钥,并SFTP下载到本地,Windows端推荐Gpg4win

gpg --export-secret-keys 密钥ID > /root/private_key.gpg

Google Drive API 与to­ken看这篇 Rclone挂载 Google Drive 教程

编辑 crontab 创建定时备份同步云端

crontab -e

光标移到最下方新增

0 8 * * * tar -czf - /etc/docker-data | gpg --encrypt --recipient "GPG密钥ID" -o /root/Vaultwarden.tar.gz.gpg --yes && rclone copy "/root/Vaultwarden.tar.gz.gpg" "GoogleDrive:vaultwarden_backup"

浏览器插件和app用bitwarden官方就行,主要就是密码和2FA不存放在一起,外加随机路径特定IP访问

30 个赞

感谢大佬教程

2 个赞

后排支持下
还有这个是什么

1 个赞

不清楚呢 这个图片是哪的?

1 个赞

最下面的 感觉是始皇测试新功能

1 个赞

我装了ublock看不到这个,隐私模式无插件下能看见

2 个赞

始皇弄得,banner

2 个赞

太详细 了

最近不是有bitwarden被黑了吗,密码数据安全也很重要给大家一个参考方法 :joy:

我是直接在服务器上自建。没有像老友这么复杂的搞

要啥这么麻烦,自建,反代,加两步验证。

我建了了后,一直在cloudflare的安全性 事件中,每天都有其他国家的IP访问我部署的vaultwarden域名,但被BAN了(非我允许的IP),他们访问的路径也是个错的。多重防御。

有用明儿我也加强下

这个在哪里设置。我也去设置一下

开启小黄云,添加WAF规则

自签反而降低了安全性啊:thinking:那人Bitwarden被黑是他的弱口令主密码被撞库撞到了。

自签证书吗?给ip用的 而ip直接abort

这个参数设置了有什么好处,有什么影响。无法打开web页面,只能api调用?

这个参数关闭了网页端
但不影响浏览器插件和app

1 个赞

你这个思路很好。但是我用Nginx反代,在Nginx里应该怎么映射呢?app和浏览器插件调用时是不是就增加路径。