现代人在互联网上拥有上百个账号,如果每个网站都用同样的“用户名 + Abc123456”的弱密码组合,一旦某个小平台库被黑客撞库脱裤(俗称“社工库泄漏”),你极其重要的大邮箱、甚至金融支付平台都会被黑客扫荡一空。
正确的方法是:每一个网站,都使用完全随机的、长达 20 位的乱码字母组合极强密码。这就非常需要你使用现代的“密码管理器”软件(如 1Password、LastPass)来代劳。
但 1Password 每个月要交非常高昂的订阅费;LastPass 曾经更是爆出严重的被黑客成功拖去云端密码库的丑闻。
作为一台有着服务器的极客,终极之选是:自己部署开源大名鼎鼎的 Bitwarden,把包含着自己一生心血的超级密码金库完全握在自己手里的硬盘中。
为什么是 Vaultwarden?
官方的 Bitwarden 服务端是由 C# 编写的微服务巨兽架构。要在自己的 VPS 上搭建原版 Bitwarden 极其吃内存(空载直接吃掉 2G),小几十块钱的垃圾 VPS 完全带不动。
开源社区的神人使用高性能的 Rust 语言,从零重写完全兼容官方客户端的轻量化开源服务端 —— Vaultwarden。
- 极度轻量:启动后内存占用通常只有十多兆(15MB 左右)!
- 免费白嫖高级功能:官方 Bitwarden 许多对于高级账单的高级功能(如:TOTP 验证器二步验证集成、附件上传存放安全文档),如果自己买要付年费。而在 Vaultwarden 中直接全部永久免费解锁。
- 全平台原生兼容:你的手机(不论 iOS 或 Android)里的 Bitwarden 原版 APP 和浏览器官方扩展包,只需要在登录前把服务器的网址输入为你自己搭建的域名,就能秒无缝丝滑连入。
Docker Compose 极速搭建
如果你已经有了一台装有 Docker 和配置了反向代理(比如前两篇文章提到的 Traefik 或 Caddy 或 Cloudflare Tunnel)的服务器,搭建极其简单。
我们在任意目录下新建一个 docker-compose.yml 文件:
version: '3'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
environment:
# 非常重要:只有设为你自己的安全秘钥并设为 false,别人才不能注册你的服务器抢密码库空间!
- SIGNUPS_ALLOWED=false # 后续如果你要拉家人注册可以暂时改成 true
# 这是给网页加 HTTPS 加密必备项(即便是在内网,Bitwarden前端代码也强制要求 HTTPS)
- WEBSOCKET_ENABLED=true
volumes:
- ./vw-data:/data
ports:
- "8080:80" # 本地暴露 8080 端口,交给外部的 Caddy/Nginx 去反代加上 HTTPS
使用命令拉起它:
docker-compose up -d
搞定!核心服务已经完全在跑了。
面板登录与后续
我们强烈假设你在服务器上的 Nginx 或 Cloudflare Tunnel 已经把 https://pwd.yourdomain.com 准确反向代理到了这台机器本地的 8080 端口上。
打开浏览器访问你的专属域名,你会看到极度清爽且高级的原版 Bitwarden Web 页面。
- 由于之前关闭了注册,第一件事你必须先把
SIGNUPS_ALLOWED=true,然后使用docker-compose restart重启。 - 进去页面,注册你唯一的超级主控账号(使用绝不会忘的一个强且长的“主密码”:Master Password)。整个金库都由这个极其复杂的主密码生成最终秘钥锁死(零知识验证)。所以万一忘记主密码,你自己也无法找回任何数据,神仙难救。
- 注册成功后,重新将
SIGNUPS_ALLOWED=false并重启 Docker,彻底关上大门。
数据备份方案(极其重要的末日准备)
把命根子交给了你的服务器,万一这台便宜的 VPS 某天突然跑路或者硬盘烧了怎么办?
Vaultwarden 极其省事的一点是:所有的密码和安全秘钥都存放在你刚刚挂载出来的一个名叫 vw-data/ 的小文件夹里的那个小数据库文件 db.sqlite3 里面。
你只需要定期写一个 Cron 定时脚本程序,每隔两天把这个 vw-data 这个十几兆甚至几兆的小文件夹打包备份并丢向你的坚果云或者各大网盘。
即便服务器在物理上被炸毁粉碎,你只需在别的机器重新用 docker 跑一遍,把文件夹往底下一放。你的成百上千个密码就像从未发生过中断一样安全到家。
在这个世界上,数据无价,掌控数据的完全主宰权更是无价。这就是我们折腾 HomeLab 的原初意义。