原生部署Bitwarden_rs教程(MacOS为例)
前言
本文主要介绍开源密码管理软件Bitwarden(_rs)的部署和使用。
简介
现在各种各样的APP越来越多,很多都需要帐号才能正常使用,而网络环境又比较糟糕,各种拖库、撞库、用户信息泄露的事情屡见不鲜,所以出于安全的考虑,最好在不同的网站使用不同的帐号(用户名+密码),并且定期更换密码。但是,怎么“编造”还得记住这些密码就成了一个让人头疼的问题。
一个比较简单的解决办法就是使用密码管理软件。此类软件产品很多,比较出名的有1Password、Keepass、LastPass等。之前我一直用的是LastPass的免费帐户,体验还是挺好的,但是最新的使用政策对免费帐户做了限制,未来也不排除进一步的限制,所以想干脆自己进行密码的管理。选来选去,就选中了Bitwarden。
Bitwarden(_rs)简介
根据维基百科的介绍,“Bitwarden是一款自由且开源的密码管理服务,用户可在加密的保管库中存储敏感信息。Bitwarden平台提供有多种客户端应用程序,包括网页用户界面、桌面应用,浏览器扩展、移动应用以及命令行界面。Bitwarden提供云托管服务,并支持自行部署解决方案。”
选择Bitwarden,主要是看中了它的这几个优点:
- 开源,所以不太担心程序中“后门”的问题;
- 跨平台同步,提供PC端、移动端、网页扩展等多种形式的访问方式;
- 支持自行部署服务端,这样就可以把数据存放在自己的数据库中。
但是,Bitwarden的服务端采用.Net + MS SQL的方案,对于个人使用来说不太友好。好在,有大神采用Rust重写了Bitwarden服务端,即Bitwarden_rs,不仅降低了对配置的要求,并且实现了官方只有付费版本才具有的一些功能,当然也是开源的。
原生部署Bitwarden_rs
之所以强调“原生”,是因为Bitwarden_rs可以采用Docker或者原生两种方式,但是绝大多数的中文教程里都是直接采用Docker方式进行部署的,那么我们在这里提供从源代码开始编译、部署的方法。接下来,我将以MacOS作为基础环境完成部署,Linux系统可以参照这个过程进行部署。
此外,为了提供网页端的功能,还需要安装Bitwarden Web Vault,这个是由Bitwarden官方提供的,同样也是开源的,可以与Bitwarden_rs无缝配合。
安装依赖
Bitwarden_rs的编译、部署和运行主要会用到以下依赖:
-
编译环境,既然是Rust编写的,所以编译肯定需要用到
Rust Nightly
,推荐使用rustup安装Rustp:1
brew install rustup-init
-
数据库,Bitwarden_rs支持SQLite、PostgreSQL和MySQL,可以根据需要安装相应的数据库,此外编译时也可能用到相应的依赖。以SQLite为例:
1
brew install sqlite3
-
服务端JavaScript环境Node.js,提供Bitwarden Web Vault相关的服务功能:
1
brew install nodejs
-
密码库OpenSSL,MacOS一般自带;
-
Nginx,用来实现反向代理等功能(非必需):
1
brew install nginx
完成以上依赖的安装后,就可以正式进入Bitwarden的编译了。
注意:建议申请一个自己的域名,用作后面使用。
Bitwarden_rs及Web Vault编译
-
编译Bitwarden_rs(以SQLite为后端):
1
2
3
4
5
6
7# 将源代码复制到本地
git clone https://github.com/dani-garcia/bitwarden_rs ./bitwarden_rs
cd bitwarden_rs
# 选择最新版本
git checkout "$(git tag --sort=v:refname | tail -n1)"
# 编译SQLite后端,(编译后二进制文件位于bitwarden_rs/target/release/bitwarden_rs)
cargo build --features sqlite --release正常情况下,如果编译成功,会有如下信息:
-
编译Bitwarden Web Vault:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 复制源代码至本地
git clone --recurse-submodules https://github.com/bitwarden/web.git web-vault
cd web-vault
# 切换至最新版本
git checkout "$(git tag --sort=v:refname | tail -n1)"
# 从dani-garcia/bw_web_builds下载相应的补丁文件
# 假设Web Vault最新版本号为vX.Y.Z,则应该选择相应的补丁或者版本号小于但是最接近当前版本号的补丁
# 在web-vault内打补丁
export WEB_VERSION=vX.Y.Z
curl https://raw.githubusercontent.com/dani-garcia/bw_web_builds/master/patches/${WEB_VERSION}.patch >${WEB_VERSION}.patch
git apply ${WEB_VERSION}.patch -v
# 编译
npm install
npm run dist与Bitwarden_rs的编译相比,这一步相对麻烦而且费时费力,可以直接从网上下载:dani-garcia/bw_web_builds。实际上,我自己也没有编译而是直接用的现成的:D
配置启动Bitwarden_rs
-
我们要将编译后的文件放到合适的文件夹,假设为
/data
:1
2cp -R 当前路径/bitwarden_rs/target/release /data/bitwarden/rs
cp -R 当前路径/web-vault/build /data/bitwarden_rs/web-vault -
将bitwarden_rs 提供的环境变量模板复制到程序文件夹(此处即
/data/bitwarden_rs
中:1
cp PATH/binwarden_rs/.env.template /data/bitwarden_rs/.env
-
修改.env中的相关内容,重点包括:
- DATABASE_URL
- WEB_VAULT_ENABLED
- ROCKET_ADDRESS
- DOMAIN
其他变量,例如端口号、WebSocket等可根据需求修改
-
安装为MacOS服务(保证开机启动)
-
创建plist
1
sudo touch /Library/LaunchDaemons/bitwarden_rs.plist
-
写入以下内容,修改
UserName
、GroupName
、ProgramArguments
的相关内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<plist version="1.0">
<dict>
<key>Label</key>
<string>bitwarden_rs</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>UserName</key>
<string>用户名/string>
<key>GroupName</key>
<string>群组名</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
<key>SHELL</key>
<string>/bin/bash</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>/data/bitwarden_rs/bitwarden_rs</string>
</array>
<key>WorkingDirectory</key>
<string>/data/bitwarden_rs</string>
</dict>
</plist> -
手动加载启动
1
sudo launchctl load /Library/LauchDaemons/bitwarden_rs.plist
-
配置HTTPS访问
运行bitwarden_rs以后会发现,必须要通过https访问才能进行真正的操作,可以采用Nginx配置https。
如果在MacOS中使用了Nginx,可以进行如下配置:
1 | # 将HTTP请求重定向为HTTPS请求 |
接下来就可以用前面配置的URL访问Bitwarden了。
参考资料
- https://www.reddit.com/r/selfhosted/comments/fn1fsh/macos_tutorial_to_run_bitwarden_rs_with_optional/
- https://github.com/dinger1986/bitwardenrs_install_script/blob/master/install.sh
- https://github.com/dani-garcia/bitwarden_rs/wiki/Building-binary
- https://github.com/dani-garcia/bitwarden_rs/wiki/Enabling-HTTPS