前言
原来我好多两步验证服务都是托管在微软的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/admin,admin_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
