自建Bitwarden之vaultwarden

​ 之前尝试过使用Bitwarden,作为跨平台密码管理来说还是可以的,虽然不如各个浏览器以及iOS自带的密码管理,但跨平台、免费使用的优势还是相当突出。最近看到vaultwarden这个开源项目,相比官方来说具有消耗资源少的优势,因此也将其部署到VPS上。

配置vaultwarden

​ 官方提供了打包好的容器镜像,因此直接拉取相应的镜像即可。我这里用的是alpine版本,对于资源的消耗更小。

1
docker pull vaultwarden/server:latest-alpine

​ 对于docker项目来说,docker compose方式更加简便,虽然只运行单个容器,但我也推荐这种方法部署。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
services:
vaultwarden:
image: vaultwarden/server:latest-alpine
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vaultwarden.xxxxxxx.xxx"
SIGNUPS_ALLOWED: "false"
ADMIN_TOKEN: “”
WEB_VAULT_ENABLED: "true"
volumes:
- ./vw-data/:/data/
ports:
- 15060:80

​ 环境变量解释:DOMAIN表示配置的域名;下面那个代表开放注册,如果是第一次使用,建议开启,等注册完账号后再关闭。ADMIN_TOKEN表示管理界面的密码,不配置表示不开启该功能,如果关闭注册,可以在管理界面里邀请用户注册;WEB_VAULT_ENABLED代表是否开启web界面,如果用app和网页插件的话,也可以关闭。

配置nginx反向代理及https访问

​ 这里一开始参考的中文wiki,然而中文wiki里面的配置竟然有括号不匹配。之后参照官方wiki的nginx进行配置,但是由于我用certbot进行自动化ssl证书管理,因此调整了部分配置。

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 'upstream' 指令确保你有一个 http/1.1 连接
# 这里启用了 keepalive 选项并拥有更好的性能
#
# 此处定义服务器的 IP 和端口。
upstream vaultwarden-default {
zone vaultwarden-default 64k;
server 127.0.0.1:15060;
keepalive 2;
}

# 要支持 websocket 连接的话才需要
# 参阅:https://nginx.org/en/docs/http/websocket.html
# 我们不发送上述链接中所说的 "close",而是发送一个空值。
# 否则所有的 keepalive 连接都将无法工作。
map $http_upgrade $connection_upgrade {
default upgrade;
'' "";
}

server {
# 对于旧版本的 nginx,在 ssl 后面的 listen 行中加入 http2,并移除 'http2 on'
listen 443 ssl http2 ipv6only=on;
listen [::]:443 ssl http2;
# http2 on;
server_name vaultwarden.xxxxxx.xxx;

ssl_certificate # managed by Certbot
ssl_certificate_key # managed by Certbot
include # managed by Certbot
ssl_dhparam # managed by Certbot
add_header Strict-Transport-Security "max-age=31536000;";

client_max_body_size 525M;

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

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 / {
proxy_pass http://vaultwarden-default;
}
}

server {
if ($host = vaultwarden.xxxxxx.xxx) {
return 301 https://$host$request_uri;
} # managed by Certbot


listen 80;
listen [::]:80;
server_name vaultwarden.xxxxxx.xxx;
return 404; # managed by Certbot
}

​ 上述配置可能存在多余项,不过实测可以正常运行了。

​ 通过上述的配置,可以将passkey存储到相应的账号密码上(一定要有账号密码,存储成功可以看到下面有passkey的提示,但无法看到具体内容),而且还能将TOTP密钥保存到账号里,这样登录账号时可以直接复制口令,但这种方法不是很安全,建议使用bitwarden authenticator来单独保存。