背景
——需要记的密码太多了!
虽然Chrome可以帮忙记录大部分网站密码,但在上周经历过近几个月第三次重置某平台密码后,终于还是忍无可忍自己搞了个VaultWarden,用来保存我那个个网站都不一样,且都是密码生成器直接生成的密码们。
选型
支持Self-host的密码管理工具不多,选型也很简单。略过中间过程,最终因为内存占用低(好像只占十几或者几十MB?我那台云服务器配置不大行)选择了VaultWarden。
部署VaultWarden
首先要有一台云服务器和域名。
如果你既没有云服务器,也懒得备案域名,可以:
- 买一台中国香港 or 国外地区的云服务器。
- 到阿里云或Cloudflare买个域名。
- 把域名解析到上面服务器的公网地址。
香港和国外的云服务器绑定域名解析是不需要备案的。
VaultWarden支持docker-compose。创建docker-compose.yml:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
environment:
DOMAIN: "https://your.domain"
SIGNUPS_ALLOWED: "true"
SHOW_PASSWORD_HINT: "false"
volumes:
- /path/to/mount/data:/data
ports:
- 12345:80
这里修改下域名、用于存放数据的挂载目录、端口即可。随后使用docker compose up -d启动。
不建议将端口(上面的12345)直接暴露在公网。我使用了nginx进行代理:
server {
server_name your.domain;
location / {
proxy_pass http://127.0.0.1:12345;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
随后使用certbot --nginx配置好https。
这样就可以在https://your.domain 访问VaultWarden了。
在注册完用户后,如果是个人使用,建议修改docker-compose.yml关闭注册。他们官方文档写得还挺好,可以直接参考。
自动备份
目前VaultWarden已经可以正常使用了。
不进行额外配置的话,默认使用的是sqlite3进行存储,且没有自动备份功能。但建议用作正式使用之前,哪怕是个人用户,只要是里面存的账号不是丢了也无所谓的,最好还是做下自动备份。
我的自动备份路子比较野,是这么想的:
- 本地使用crontab每天将数据备份、打成tar.gz,文件名称是当天的day_of_month,例如22号就最终产出22.tar.gz。
- 使用rclone将tar.gz上传到我腾讯云对象存储(COS)的特定目录下,如果已有文件就覆盖。当然这里是有什么用什么,发送到另一台机器也可以。一般情况下,哪有那么脸黑两台机器一起坏哦(如果你两台都是自己的物理机且硬盘是同一批次的,只能说太会了)。
这样就相当于保存了一个月的备份,对我来说够用了。
那么首先需要安装和配置rclone,官方文档亦非常详细,此处略过,只是有两个注意点:
- 配置时有一步选择storage class,如果你跟我一样买的是低频存储,记得选择低频存储的storage class。低频存储真便宜啊。
- access_key_id和secret_access_key建议使用一个只有对应COS写权限的子账号。
实际上,我不觉得有人会闲得蛋疼黑掉我这台服务器。又没什么商业价值。用子账号更多的是熟悉一下这套流程,别无他用。
最终配置文件/root/.config/rclone/rclone.conf长这样:
[name]
type = s3
provider = TencentCOS
access_key_id = 账号
secret_access_key = 密码
endpoint = 接入点,买COS的时候会选
acl = default
storage_class = STANDARD_IA
随后用rclone随便上传一个文件到COS上,看看配置是否正常。这里推荐使用rclone sync而非rclone copy,因为它会保证远程文件跟本地文件一致,且只会修改远程文件,很合适用来备份。
确认rclone sync执行没问题后,在上面挂载的/path/to/mount/data目录同级新建backup.sh(我知道写的很丑,但我真的不会写shell脚本 anyway it works):
cd /path/to/mount
# 新建一个同级的to_upload用来存储要备份的文件
rm -rf to_upload
mkdir -p to_upload/data
# 要备份哪些文件,参考https://github.com/dani-garcia/vaultwarden/wiki/Backing-up-your-vault
current_dir=$(pwd)
sqlite3 data/db.sqlite3 ".backup '${current_dir}/to_upload/data/db.sqlite3'"
cp -r data/attachments to_upload/data/
cp -r data/sends to_upload/data/
cp data/config.json to_upload/data/ || true # config.json不一定存在,这行依然会导致报错,但不会终止脚本执行,不想看到报错可以> /dev/null
cp data/rsa* to_upload/data/
cp -r data/icon_cache to_upload/data/
# 把to_upload/data目录打包成day_of_month.tar.gz
cd to_upload
day_of_month=$(date +%d)
tar_filename="${day_of_month}.tar.gz"
tar -czf "$tar_filename" data
# 上传
rclone sync "$tar_filename" name:path
手动执行下看看是否有问题。没问题的话添加对应crontab任务。使用crontab -e,添加一个比如每天凌晨5点执行的任务:
0 5 * * * /path/to/mount/backup.sh
That's it,虽然很草台班子,但这套流程可以正常使用。这样就有了一个自己托管的密码存储,且数据定时备份,不用担心云服务器出幺蛾子。
康康我的:

以及它提供了一个很有意思的工具,就是上图的Send。这玩意其实就是个加密剪贴板,可以用来给别人分享私密信息:

随后将生成的链接发送给对方:

芜湖,没有卵用但是很有趣的功能。真的会有人觉得这玩意浪漫吗?
建议和Tips
首先,我不是安全方面的专家,所以这些建议仅供参考。
- 密码强度自身要合格,可以使用密码生成器来生成高强度的密码。VaultWarden自带了一个密码生成工具,在页面上就可以看到。
- 不要在多个账号之间复用密码。
- 如非必要不在公共环境登录,必须登录的情况下及时退出登录。
- 关于密码的操作要保证安全,例如遵循服务器账号密码/密钥、VaultWarden的最佳实践等。
- 非常关键的账密,建议开启2FA,例如使用手机进行TOTP认证。
此外一些可能有用的Tips:
- VaultWarden兼容BitWarden的客户端,例如手机端的BitWarden应用可以直连VaultWarden。
- VaultWarden同BitWarden一样,支持自动给浏览器填充账密,但我没有使用这个功能。我只是用它来做Chrome里密码管理器的备份,以及保存一些不是用于网站的密码。
- VaultWarden默认的中文翻译有很多迷惑的地方,摸不着头脑的时候可以切成英文。