前言

因Github强制启用2FA,不得不开始考虑使用管理2FA的软件。但纯2FA软件(Ageis这类无联网同步)感觉会被我弄丢(刷机的时候忘记取消而丢失),联想到自建Bitwarden,应该是符合我的需求。

本人无v4公网,v6似乎因主路由防火墙问题并不能正确映射至外网,相当于无法映射至公网的情况,也符合大部分人的环境。故组建一个纯内网环境的Bitwarden,内网下同步外网下离线,也无安全性问题。

开搞

文中操作无法避免的产生穿插,会出现将后续操作才能产生的内容提前,还请先通篇阅读,在实际操作时联系上下文

  • 自签名证书

    由于Bitwarden要求连接到的服务器必须为https,所以首先需要为内网IP申请一个SSL自签名证书。OPENSSL是较为常用的SSL工具,被默认安装于Linux系统中,但命令行复杂,本文推荐使用mkcert

    mkcert可以在服务端运行,若不方便SSH操作也可以在电脑上命令行运行。本文选择在服务端(NAS)创建证书

    前往release页根据所运行机器架构及系统下载最新程序

    1_mkcert_vd9un4.avif

    使用SSH工具连接到NAS,依次输入以下命令(请注意修改 NAS设备IP实际IP

    wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
    chmod +x mkcert
    ./mkcert --cert-file bitwarden.pem --key-file bitwardenkey.pem NAS设备IP
    ./mkcert -install
    mv /root/.local/share/mkcert/rootCA.pem

    1_cmd.avif

    以上操作会生成 bitwarden.pem , bitwardenkey.pemrootCA.pem 三个文件,前两个为服务端所需SSL证书及密钥,后者为客户端所需根证书

  • 反代设置

    此步非必需但推荐搭建,若不想搭建的请跳过本节

    反代需求将使用Caddy2方式实现

    • Caddy2

      使用Caddy2可以监听80/443端口,访问反代服务时不再需要端口号,但后续教程不会对这里特殊说明,请注意更改IP与端口,这里使用 **192.168.31.31 做演示

      • Unraid

        可以直接在应用中搜caddyv2,已有模板可以使用

        2_caddy_ksloze.avif

        模板使用 Bridge 网络模式,将网络修改为 Custom:br0 ,并设置为 192.168.31.31

      • docker-compose

        这里套用官方模板,并将网络修改为macvlan

        version: "3.7"
        
        services:
          caddy:
            image: caddy:alpine
            restart: unless-stopped
            networks:
              mymacvlan:
                ipv4_address: 192.168.31.31
            volumes:
              - $PWD/Caddyfile:/etc/caddy/Caddyfile
              - $PWD/site:/srv
              - caddy_data:/data
              - caddy_config:/config
        
        volumes:
          caddy_data:
            external: true
          caddy_config:
        networks:
          mymacvlan:
            driver: macvlan
            driver_opts:
              parent: eth0
              mode: bridge
      • 配置文件

        /config 对应映射的文件路径下创建一个名为 Caddyfile 的配置文件,并将下一步生成 local.pemlocalkey.pem 放入 /data 对应映射的文件路径下

        :443 {
          tls /data/local.pem /data/localkey.pem
          reverse_proxy http://192.168.31.13:4743
        }

        之后启动 caddy ,但服务端并未搭建,所以访问是空白的

  • Vaultwarden服务端

    • Unraid

      可以直接在应用中搜vaultwarden,已有模板可以使用

      3_unraid_ypumuu.avif

      点击安装后,会跳转至配置界面

      3_unraid2_yolxyl.avif

      是否使用网页反代的选项有所不同,若未使用网页反代的则有以下步骤:

      1. /mnt/user/appdata/ 下新建 vaultwarden 文件夹,并将生成的 bitwarden.pembitwardenkey.pem 移动到该文件夹下
      2. 点击 添加另一个路径、端口、变量、标签或设备
      3. 如图设置,并在值内填写 {certs="/data/bitwarden.pem",key="/data/bitwardenkey.pem"},而后保存

        3_unraid3_wqio71.avif

      点击应用即可启动

    • 群晖

      点击 Container Manager - 容器 - 新增 - 映像 - 添加映像- 导入 - 从URL添加

      输入 https://hub.docker.com/r/vaultwarden/server

      3_synology_ozbzhb.avif

      点击新增后进入配置向导,请注意以下两个配置,其他保持默认即可

    • Docker-compose

      version: '3'
      
      services:
        vaultwarden:
          image: vaultwarden/server:latest
          container_name: vaultwarden
          restart: always
          environment:
            SIGNUPS_ALLOWED: "true"
            WEBSOCKET_ENABLED: "true"  # 启用 WebSocket 通知
            ADMIN_TOKEN: setastrongpassword # 设置 Admin (后台)密码
          volumes:
            - ./vw-data:/data
          ports:
            - 8443:80
    • 配置

      访问 https://192.168.31.13:8443/admin 即可访问服务端后台,可以进行管理用户之类的操作,非高级操作一般用不到

  • 证书导入

    需要将先前生成的 rootCA.pem 改名为 rootCA.crt 导入需要安装的设备中,避免客户端在连接服务端时提示证书不安全

    • Windows

      rootCA.crt 下载到电脑,双击该证书

      安装证书 > 当前用户 > 将所有的证书都放入下列存储 > 浏览 > 受信任的根证书颁布机构 > 确定

      4_win_j9zbwk.avif

    • MacOS

      由于笔者无MacOS环境,从搜索引擎找到了相关方法供参考

      Finder > 应用程序 > 其他 > 钥匙串访问 > 将rootCA.pem证书拖入窗口内安装

    • iOS

      使用Safari下载并打开rootCA.pem,而后在

      设置 > 通用 > VN、DNS与设备管理 > 找到mkcert证书并点击信任 > 返回 > 关于本机 > 证书新人设置 > 打开mkcert证书开关*

      4_ios_x8iwfc.avif

    • Android

      rootCA.pem 传输至Android设备

      设置 > 安全 > 加密与凭据 > 安装证书 > CA证书 > 仍然安装 > 选择 rootCA.pem

      4_android_wnsevt.avif

  • 创建账户和导入密码

    先前账号密码都存储于Chrome浏览器中,相对明文的保存方式并不安全。故将密码从Chrome迁移至Vaultwarden内

    设置 - 自动填充及密码 - 密码 - 导出密码

    5_export_icpe7h.avif

    访问 http://192.168.31.13:8443 ,创建账户。

    点击 工具 - 导入数据 - 选择格式:Chrome(CSV) ,导入刚才从Chrome导出的csv文件

    5_import_k5kp15.avif

    即可将Chrome内保存的密码迁移到Vaultwarden

  • Bitwarden客户端

    全平台客户端请点此下载,这里使用浏览器插件演示登录

    打开Bitwarden插件,区域:自托管 ,填写服务器URL为 http://192.168.31.13:8443 ,其他留空而后保存

    6_crx_cdmkr4.avif

    登录先前创建的账户,就可以正常使用了

    还需要开启自动填充功能,可以参考这个教程

抛砖引玉

针对无公网情况,还可以使用Tailscale在外网使用或内网穿透、Cloudflare Tunnel等方式穿透至公网进行服务(穿透至公网的服务请注意安全),但本文篇幅已经很长,且着重于纯内网使用,故不再进行展开,有需要的可以研究

这里让ChatGPT写了一个自动打包备份 Vaultwarden 配置的脚本,配合crontab实现数据备份

#!/bin/bash

# 源文件夹路径
source_folder="/path/to/source/folder"

# 目标文件夹路径
destination_folder="/path/to/destination/folder"

# 获取当前日期(格式:年月日)
current_date=$(date +%Y%m%d)

# 打包文件名,添加日期作为前缀
archive_name="${current_date}_archive.tar.gz"

# 切换到源文件夹所在目录
cd "$(dirname "$source_folder")" || exit

# 创建打包文件
tar -czvf "$archive_name" "$(basename "$source_folder")"

# 移动打包文件到目标文件夹
mv "$archive_name" "$destination_folder"

感谢