从部署到安全加固:我的 Vaultwarden 私有密码库搭建终极指南
序言:为何你需要一个私有的密码管理器?
在当今的数字世界,我们每个人都拥有数十甚至上百个网络账户。如何安全、高效地管理这些密码,成了一个难题。虽然市面上有许多优秀的商业密码管理器,但将我们最核心的数字资产——密码,完全托管在第三方服务器上,总会让人心存一丝顾虑。
自托管(Self-Hosted) 给了我们一个两全其美的选择。Vaultwarden,作为一个与 Bitwarden API 兼容的、用 Rust 编写的轻量级开源项目,让我们可以在自己的服务器上搭建功能完整的私有密码库。
这篇文章,是我在部署和深度配置 Vaultwarden 过程中的全纪录。它不仅包含了从零开始的部署步骤,更涵盖了安全加固、邮件通知、后台禁用等一系列进阶的最佳实践。无论你是新手还是老玩家,相信都能从中有所收获。
准备工作
- 一台云服务器 (VPS),已安装 Docker 和 Docker Compose。
- 一个域名,用于配置 HTTPS 安全访问。
- 一个支持 SMTP 的邮箱,用于密码重置和通知。
第一章:基础部署 - Docker Compose
我们采用 Docker Compose 进行部署,它能让我们用一个 YAML 文件清晰地管理所有配置。
-
创建项目目录
Terminal window mkdir -p /data/docker/vaultwardencd /data/docker/vaultwarden -
创建
.env文件管理敏感信息 使用.env文件可以有效隔离密码等敏感信息,让docker-compose.yml保持干净。Terminal window
nano .env
```
在 .env 文件中,我们先定义好管理员后台的令牌。
**注意:** 为了安全,`ADMIN_TOKEN` 必须使用 Argon2 哈希值。
**如何生成哈希值?**
我们可以使用 `argon2` 命令行工具来生成安全的哈希值。如果你的系统没有安装,可以执行 `sudo apt install argon2` (Debian/Ubuntu) 来安装。
* **执行以下命令生成哈希**:
```bash echo -n "MySecretPassword" | argon2 "$(openssl rand -base64 32)" -e -id -k 65540 -t 3 -p 4 ```
* 请将命令中的 `MySecretPassword` 替换为你自己想设置的、足够复杂的**原始密码**。
* 执行后,复制终端输出的那一长串以 `$argon2id$...` 开头的哈希字符串。
将生成的哈希值写入 `.env` 文件:```env# .env 文件内容ADMIN_TOKEN='这里粘贴你生成的$argon2id$哈希字符串'```3. 编写 docker-compose.yml 文件
```bashnano docker-compose.yml
```
粘贴以下配置。这份配置经过优化,将端口绑定在 127.0.0.1,强制只能通过反向代理访问,更加安全。
```yamlversion: '3.7'
services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped volumes: - ./vw-data:/data ports: - "127.0.0.1:5555:80" environment: DOMAIN: "https://你的域名" WEBSOCKET_ENABLED: "true" SIGNUPS_ALLOWED: "true" ADMIN_TOKEN: ${ADMIN_TOKEN}```**注意:*** `ports`: `- "127.0.0.1:5555:80"` 中的 `5555` 是宿主机端口,你可以换成任何未被占用的端口。* `ADMIN_TOKEN: ${ADMIN_TOKEN}`: 这行代码会从 `.env` 文件中读取我们刚才设置的令牌。4. 启动容器
bash docker-compose up -d
第二章:安全接入 - Nginx 反向代理与 HTTPS
密码库绝对不能通过 HTTP 暴露在公网上。我们必须配置反向代理和 SSL 证书。
-
解析域名:将你的域名(如
key.yourdomain.com)A 记录解析到你的 VPS IP。 -
配置反向代理(以宝塔面板为例):
-
新建一个网站,域名填写
key.yourdomain.com。 -
申请 Let’s Encrypt 证书,并开启强制 HTTPS。
-
在“反向代理”中,添加代理,目标 URL 填写
http://127.0.0.1:5555(端口与yml中保持一致)。 -
关键一步:配置文件示例
location / {# 代理到你的 vaultwarden 容器所监听的 本机IP:端口proxy_pass http://127.0.0.1:5555;# --- WebSocket 支持 (关键!) ---# 允许协议从 HTTP 升级到 WebSocketproxy_set_header Upgrade $http_upgrade;# 设置 Connection 头,完成 WebSocket 握手proxy_set_header Connection "upgrade";# --- 传递真实信息给后端 ---# 传递真实的 Host 头,让后端应用知道用户访问的是哪个域名proxy_set_header Host $host;# 传递用户的真实 IP 地址proxy_set_header X-Real-IP $remote_addr;# 传递完整的代理链 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 传递协议信息 (http or https)proxy_set_header X-Forwarded-Proto $scheme;}
-
配置完成后,你就可以通过 https://key.yourdomain.com 安全地访问你的 Vaultwarden 了。
第三章:功能完善 - 配置 SMTP 邮件服务
配置邮件服务,可以让你在忘记主密码时进行账户恢复,或接收重要通知。
- 登录管理员后台:访问
https://key.yourdomain.com/admin。 - 输入原始密码:在登录框里,输入你生成哈希时使用的那个原始明文密码。
- 填写 SMTP 信息:
- 进入
Settings->SMTP Email Settings。 - 根据你的邮箱服务商提供的信息,依次填写
Host,Port,Username,Password等。 - 注意:
Secure SMTP选项,465 端口通常对应force_tls,587 端口对应starttls。
- 进入
- 保存与测试:填写完毕后,滚动到页面底部点击
Save,然后再回到顶部点击Test SMTP发送测试邮件。
第四章:终极安全 - 按需开关管理员后台
管理员后台功能强大,但也增加了攻击面。在日常使用中,我们应该将其禁用,只在需要时临时开启。
禁用后台:
-
停止服务:首先,停止 Vaultwarden 容器,确保数据文件不会被占用。
docker-compose down -
注释环境变量:编辑 docker-compose.yml 文件,在 ADMIN_TOKEN: ${ADMIN_TOKEN} 这一行行首加上 # 将其注释掉。
-
移除持久化令牌:编辑数据目录中的 config.json 文件 (./vw-data/config.json),找到并完全删除 “admin_token”: ”…” 这一整行(别忘了处理上一行末尾的逗号)。
-
重新启动服务:
docker-compose up -d -
现在访问
/admin页面,会明确提示“后台已禁用”。
启用后台:
- 编辑
docker-compose.yml文件。 - 去掉
ADMIN_TOKEN: ${ADMIN_TOKEN}这一行前面的#注释。 - 执行
docker-compose up -d --force-recreate重建容器。 - 后台入口恢复访问。
这个简单的“注释/取消注释”操作,就像是给你的保险库上了一道额外的“金库大门开关”,平时关闭,需要时再打开。
结语
通过以上步骤,你不仅拥有了一个功能强大的私有密码库,还掌握了如何通过反向代理、环境变量和精细化配置来全方位地保障它的安全。现在,你可以安心地将你的数字钥匙,存放在这个完全由你掌控的家中了。
希望这篇指南能帮助你顺利完成部署。享受自托管的乐趣吧!