Featured image of post 自托管密码柜 - 自建vaultwarden密码管理服务

自托管密码柜 - 自建vaultwarden密码管理服务

阅读次数:

前言

原来我好多两步验证服务都是托管在微软的Authenticator上,一开始我以为这玩意带云同步功能,就算换手机了只要重新登入微软账号就能把两步验证也同步过去,但实践之后的惨痛的代价告诉我这样行不通(现在还有几个设置了两步验证的网站上不去,人工客服也爱理不理,感觉要凉),但看看同类的软件无非就是谷歌验证器之类那几个,以下是D老师做的对比:

同类软件对比

软件名称主要功能优点缺点平台支持价格模型是否开源
微软 Authenticator双因素认证 (2FA),特别集成微软账户1. 与微软生态系统无缝集成
2. 支持便捷的推送通知验证
3. 提供云备份和跨设备同步
1. 功能主要围绕微软账户优化
2. 推送验证需网络连接
3. 备份数据存储在微软云,存在隐私顾虑
iOS, Android免费
谷歌验证器 (Google Authenticator)基于TOTP/HOTP标准的2FA验证器1. 轻量、简洁、启动快
2. 完全开源,代码透明
3. 完全离线工作,无需网络
4. 支持账户导出/导入 (较新版本)
1. 功能单一,仅限2FA
2. 无官方云备份,设备丢失可能导致账户锁定
3. 用户需自行管理密钥备份
iOS, Android免费
Bitwarden综合性密码管理器,内置2FA验证器1. 开源且经过安全审计
2. 集密码管理与2FA于一体,一站式安全
3. 强大的跨平台客户端和浏览器扩展
4. 支持自托管 (需付费订阅)
1. 使用官方服务器需信任其基础设施
2. 高级功能 (如自托管、紧急访问) 需付费订阅
3. 作为密码管理器,功能比纯验证器复杂
Web, Windows, macOS, Linux, iOS, Android, 主流浏览器扩展免费版功能完整;高级功能需付费订阅
Vaultwarden (原 Bitwarden_rs)Bitwarden 密码管理服务器的自托管替代方案1. 完全掌控数据,服务器私有化部署
2. 兼容所有官方 Bitwarden 客户端,无需修改
3. 资源占用低,对硬件要求友好
4. 可免费使用 Bitwarden 付费版的大部分功能
1. 需要一定的技术能力进行部署、维护、更新和备份
2. 安全责任由用户自己承担
3. 非官方服务器,尽管社区活跃且受信任
任何可部署 Docker 或二进制文件的服务器;通过 Bitwarden 客户端访问软件免费;需自行承担服务器成本

考虑到这类软件的安全敏感性,最终还是选择自己部署Vaultwarden。

如果服务器资源充裕可以直接使用docker进行部署,而我为了节约成本选择自己编译二进制文件。

前期准备

Docker方式

一般来说使用Docker构建是最快的,直接编辑docker-compose.yml

version: '3.7'

services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
expose:
- "80"
volumes:
- ./vw-data:/data
environment:
- SIGNUPS_ALLOWED=true # 首次运行允许注册
- WEBSOCKET_ENABLED=true
- ADMIN_TOKEN=your_admin_token_here # 管理员界面访问令牌
- DOMAIN=https://your-domain.com
networks:
- nginx-reverse-proxy

networks:
nginx-reverse-proxy:
external: true

这样就会构建一个使用SQLite+Nginx的vaultwarden环境,再配置一下反代即可:

server {
listen 443 ssl;
server_name your-domain.com;

ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;

location / {
proxy_pass http://vaultwarden:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

location /notifications/hub {
proxy_pass http://vaultwarden:3012;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

必须要配置ssl才能访问。

二进制直接运行

因为我机器上已经有Postgresql+Nginx,加上docker本身会有一些开销,vaultwarden本身就是rust编译的,运行内存很小,套上docker之后优势就不存在了。

编译的过程非常痛苦,本地机器4c8g都能被干到卡死,所以干脆用Github Action编译,如果使用postgres作为数据库的可以直接用我这个项目:tamakyi/vaultwarden

新建一个文件夹把内容解压其中:

wget https://github.com/tamakyi/vaultwarden/releases/download/1.35.4/vaultwarden-1.35.4-linux.tar.gz
tar zxvf vaultwarden-1.35.4-linux.tar.gz

会获得二进制文件vaultwarden_linux和文件夹web-vault,配置文件和目录

编写初始配置文件/etc/vaultwarden.env
DATA_FOLDER=/var/lib/vaultwarden/data/
DATABASE_URL=postgresql://[数据库用户名]:[数据库密码]@127.0.0.1:5432/[数据库名]
IP_HEADER=X-Real-IP
WEB_VAULT_FOLDER=/var/lib/vaultwarden/web-vault/
WEB_VAULT_ENABLED=true
ADMIN_TOKEN=[base64码]
DOMAIN=https://vaultwarden.tama.guru

数据库需要提前创建,ADMIN_TOKEN可以通过执行:

openssl rand -base64 48

获取,这属于明文密码,官方不推荐,建议配置完关掉admin页面访问权限。

使用systemctl管理vaultwarden

新建/etc/systemd/system/vaultwarden.service并编辑内容:

[Unit]
Description=Vaultwarden Server
Documentation=https://github.com/tamakyi/vaultwarden

After=network.target postgresql.service
Requires=postgresql.service

[Service]
User=vaultwarden
Group=vaultwarden
EnvironmentFile=/etc/vaultwarden.env
ExecStart=/usr/bin/vaultwarden
LimitNOFILE=1048576
LimitNPROC=64
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=strict
WorkingDirectory=/var/lib/vaultwarden
ReadWriteDirectories=/var/lib/vaultwarden
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

然后可以尝试启动vaultwarden了:

systemctl daemon-reload
systemctl enable vaultwarden
systemctl start vaultwarden

如果提示:

Rocket has launched from http://127.0.0.1:8000

则表明服务已经正常启动了。

配置cloudflare tunnle访问

虽然可以用nginx反代,但我还是更喜欢用tunnle的方式,因为我的域名已经绑定了cloudflare,直接把我的目标域名https://vaultwarden.tama.guru引导到http://127.0.0.1:8000即可,现在就可以通过https://vaultwarden.tama.guru访问vaultwarden了。

其他

登录后新建完用户,一般来说是要把注册权限关掉的,可以登录https://vaultwarden.tama.guru/adminadmin_token即时之前我们配置的vaultwarden.env中的ADMIN_TOKEN。登录进去之后找到SIGNUPS_ALLOWED的配置项,默认是打勾的,取消掉保存即可。

然后我们需要关掉管理面板的访问,去/var/lib/vaultwarden/data/config.conf找到admin_token这一行,直接删掉整行保存,再执行systemctl restart vaultwarden即可。

因为我使用的编译环境是Ubuntu22.04,glibc版本是2.35,如果系统glibc版本低于2.35的就建议自己编译吧,不然是执行不了的。查询系统glibc版本:

$ ldd --version
ldd (GNU libc) 2.36
本博客已稳定运行
使用 Hugo 构建