NAS 自建密码库:Vaultwarden 部署与安全配置
Vaultwarden 是什么
Vaultwarden 是 Bitwarden 服务端的一个第三方开源实现,用 Rust 重写。它完全兼容官方 Bitwarden 客户端——你用官方的浏览器扩展、手机 App、桌面端,都能连接自托管的 Vaultwarden 服务。
与官方 Bitwarden 自托管版的区别:
| 对比项 | Vaultwarden | 官方 Bitwarden |
|---|---|---|
| 资源占用 | 极低(几十 MB 内存) | 高(Java + .NET + MSSQL,几 GB) |
| 部署难度 | 一个容器搞定 | 需要多个容器和数据库 |
| 功能完整度 | 覆盖付费功能(部分需配置) | 官方完整 |
| 官方支持 | 社区维护 | 官方 |
对个人和家庭来说,Vaultwarden 是明显更务实的选择。 官方自托管版的资源需求对家用 NAS 来说过于沉重,而 Vaultwarden 用极小的代价提供了几乎相同的功能。
需要注意的是它是社区项目,不是官方产品。安全敏感的用户应该评估这一点——但它的代码是开源的,社区活跃度也很高。
部署
单个容器即可运行:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- DOMAIN=https://vault.example.com
- SIGNUPS_ALLOWED=true # 注册账号后要改成 false
volumes:
- ./vw-data:/data
ports:
- 3012:80
几个关键配置:
/data 目录必须持久化。 所有数据(数据库、附件、密钥)都在这个目录里。容器重建时目录丢了,密码库就没了。
DOMAIN 要填实际访问地址。 这个变量会影响部分功能的链接生成,填错会导致客户端登录异常。
端口:容器内监听 80,通常映射到宿主机的 3012 或其他非冲突端口,再通过反代暴露。
必须上 HTTPS
这是硬性要求,不是建议。 Bitwarden 客户端在连接非 HTTPS 的服务端时会直接拒绝工作(部分客户端甚至不给你提示,只是连不上)。
原因很直接:密码库是最高敏感度的数据,明文 HTTP 传输等于把主密码和所有密码送给中间人。
配置 HTTPS 的方式:
- 反向代理 + Let’s Encrypt(Caddy 或 Nginx Proxy Manager)——最常用
- Tailscale——如果不打算公网访问,用 Tailscale 组网后在局域网内通过 HTTPS 访问也行,但同样要配置证书
- 自签证书——客户端通常不认,不推荐
部署后必须做的三件事
一、关闭公开注册
这是最重要的一步。 容器启动后先注册你自己的账号,然后立刻把 SIGNUPS_ALLOWED 改成 false 并重启容器。
原因:Vaultwarden 默认允许任何人注册。如果你的服务暴露在公网上而没关注册,互联网上的扫描器会找到它,然后任何人都能在上面开账号——虽然他们看不到你的数据,但你的 NAS 变成了一个免费的公开服务,还可能被滥用。
SIGNUPS_ALLOWED=false
日后需要新增账号(家人)时,可以临时改成 true,注册完再关掉。
二、配置管理员面板
Vaultwarden 有一个管理后台(访问 /admin),可以查看用户、删除账号、配置 SMTP 等。它默认不启用,需要一个 token:
# 生成一个 argon2 哈希作为 ADMIN_TOKEN
# 可以用容器自带的 hash 命令,或在线工具
docker exec -it vaultwarden /vaultwarden hash
把生成的哈希设为 ADMIN_TOKEN 环境变量。不要使用明文密码作为 token——管理面板的入口防护依赖这个值的强度。
三、配置 SMTP
密码库涉及账号安全,邮件通知(新设备登录提醒、邮箱验证、紧急联系人)需要 SMTP。
- SMTP_HOST=smtp.example.com
- SMTP_PORT=587
- SMTP_SECURITY=starttls
- SMTP_USERNAME=your@email.com
- SMTP_PASSWORD=app_password
- SMTP_FROM=noreply@example.com
注意用邮件服务商的应用专用密码,不要用邮箱登录密码。
备份:该备什么
Vaultwarden 的数据全在 /data 目录里,关键文件:
| 文件 | 内容 |
|---|---|
db.sqlite3 |
主数据库(密码条目、用户信息) |
attachments/ |
附件(如果你存了文件) |
sends/ |
Send 功能的文件 |
rsa_key.* |
密钥对 |
config.json |
管理面板配置 |
简单的备份方式是把整个 /data 目录打包。它体积通常不大(几十 MB 到几 GB,取决于附件数量)。
更稳妥的做法是用官方推荐的数据库导出:Vaultwarden 支持通过 sqlite3 的备份命令或管理面板导出,能在数据库处于使用状态时获得一致性快照。
备份频率与存放:
- 建议每周至少一次
- 备份要加密,因为里面全是密码
- 至少一份异地(云盘、另一台设备)
- 定期验证恢复流程——备份不能恢复等于没备份
一个重要的补充:密码库的备份不是唯一的安全网。强烈建议定期导出一份 Bitwarden 的明文/JSON 备份,加密后离线保存(比如 U 盘)。万一 Vaultwarden 实例彻底损坏而你又忘了主密码,这份导出是最后的救命稻草。
安全加固清单
按重要性排序:
1. 关闭公开注册 — 必做 2. 启用 HTTPS — 必做 3. 设置强主密码 — 主密码的强度决定一切,建议 20 位以上 4. 开启双因素认证 — 支持 TOTP,在账号设置里开启 5. 不要公网裸奔 — 优先用 Tailscale,其次反代 + 认证,最次才是直接暴露 6. 配置失败登录限制 — 可以设置 LOGIN_RATELIMIT_* 参数防止爆破 7. 定期更新镜像 — 安全补丁在社区项目里同样重要 8. 监控日志 — 留意异常的登录尝试
一个现实的风险提示
自建密码库最大的风险不是被黑,而是你自己把服务搞挂了或备份失效了。
商业密码管理器(1Password、Bitwarden 官方)卖的核心价值不是加密技术,而是”永远能访问你的密码”这个可用性承诺。自建意味着你要自己承担可用性——NAS 硬盘坏了、容器起不来、证书过期、忘记续费域名,任何一种情况都会让你在需要密码时打不开密码库。
降低这个风险的办法:
- 保证有一份离线的、加密的密码导出文件
- 关键账号(邮箱、域名注册商、NAS 本身)的密码不要只存在密码库里,用纸质或其他方式另行保存
- 定期检查服务是否正常工作,不要等到需要时才打开
自建密码库适合有运维习惯的人。如果你连 NAS 都很少维护,用商业服务可能是更负责任的选择。
