vaultwarden(bitwarden rust版) (非 Docker) 搭建记录

几个月前听说 Chrome 在 Windows 上记录的密码可以被随意读取,Windows 下, Chrome 把密码加密后存入 sqlite 中,但是把加密密钥明文存入本地,这样任何一个在你账户下执行的软件,都有权限获得解密密钥,从而解密,获得明文密码。https://ohyicong.medium.com/how-to-hack-chrome-password-with-python-1bedc167be3d

这并不是说 Chrome 保存密码不安全,因为正常软件都不会这样做(正常软件,但是某些软件在后台偷偷查看用户隐私的事情常有发生),恶意软件想查看你保存的明文密码,首先要攻破 Windows,而一旦你的 Windows 被黑,就不仅仅是泄露密码那么简单了。

用密码管理器也不安全,前几天有个叫 LastPass 的上了新闻,有些人说因为密码器泄露导致比特币被盗。

这几天元旦事情不多,打算搭建一个 bitwarden,体验一下,记录一下过程


#vaultwarden

Bitwarden 有免费,付费服务,同时可以自行搭建。看了一下,我选择了据说轻量的 Rust 版本,曾用名 bitwarden_rs,后来改名为 vaultwarden

不幸的是,vaultwarden 的 github 只有 docker 版……但是有一些第三方编译的版本,比如 Arch 就有 comminity 的预编译版,直接 pacman 就可以安装。另外,可以从 docker 中提取出 vaultwarden 二进制文件:https://github.com/dani-garcia/vaultwarden/wiki/Pre-built-binaries

按照上面的方法提取出 vaulewarden 和 web-vault, 放到一个新建的文件夹了,然后把 Docker 的遗迹清除干净。

先设置好数据库,Vaultwarden 支持多种数据库,包括SQLite, MySQL,PostgreSQL。因为熟悉我继续选择 Postgresql,关于 Postgresql 的基础操作见这篇博客,虽然我没试验过,但是理论上 MySQL 都可以被 MariaDB 直接替换,所以想用 MariaDB(MySQL) 的同学请参考这篇博客

Vaultwarden 可以用 json 文件配置,但是官方建议使用 .env 来配置,我不理解都是文件,为什么有先后顺序。 https://github.com/dani-garcia/vaultwarden/blob/main/.env.template

在保存 vaultwarden 的文件夹下,新建一个叫 .env 的文本文件,贴上上面的配置,修改成自己想要的。

通常情况下,需要修改的有

DATABASE_URL: 数据库连接 URL,如果密码中有特殊符号可能影响连接,要手动编码,例如如果密码中有@,替换成%40

WEBSOCKET_ENABLED: 是否开启 WebSocket 通知

DOMAIN: 你的域名,一些功能依赖域名

以及所有的端口号,尽力避免被攻击。

如果想用邮件服务,还要修改 SMTP 信息。

所有被注释的项都是默认值,无需修改,因此这个配置模板看起来长,其实 10 行以内。

因为下一步我用 Caddy 反代,因此没有在 vaultwarden 中配置 Rocket tls, Rocket 是用 Rust 写的一个网站服务,类似 Caddy。

#Caddy

用 Caddy 反代的原因有 2 个,一是我对 Caddy 的配置很熟悉了,写起来很快,二是 Caddy 自动申请并更新 tls 证书,很方便。关乎 Caddy,见这篇博客

直接上配置文件,Caddy 的配置简单易懂:Caddy 处理所有入站流量,验证 tls,然后转发到相应的端口。 Caddy 配置文件保存: /etc/caddy/Caddyfile

vault.acytoo.com {
	log {
		level INFO
		output file /var/log/caddy/vault.log {
			roll_size 10MB
			roll_keep 10
		}
	}
	tls {
		dns cloudflare <cloudflare_api> # delete this tls part if you don't use cloudflare's CDN
	}

	# This setting may have compatibility issues with some browsers
	encode gzip

	# Notifications redirected to the websockets server
	reverse_proxy /notifications/hub localhost:3012

	# Proxy everything else to Rocket
	reverse_proxy localhost:8000 {
		header_up X-Real-IP {remote_host}
	}
}

因为我们使用 Caddy 反代,不需要手动申请 tls 证书,同时防火墙只需要开启 80 和 443 端口,其他端口通过 Caddy 转发,因此不需要对外开放,很安全。

#启动

上面介绍了配置文件,在启动前,还需要在执行 vaultwarden 的文件目录下新建一个叫 data 的文件夹,最终的文件目录结构如下

如果开启了防火墙,可以使用 ufw 管理防火墙

sudo ufw allow 80 # HTTP
sudo ufw allow 443 # HTPPS

启动 Caddy

sudo systemctl restart caddy

启动 vaultwarden 直接套在 screen 里执行

screen -S vault -dm ./vaultwarden

然后浏览器打开网页,注册使用吧。