自建密码管理器——Vaultwarden

自建 Vaultwarden 已有 1 年多了,体验很不错。最近更新下 Vaultwarden 版本,顺便写篇搭建教程(目前网上的教程有些过时了,特别是 Nginx 反代)。

为什么使用密码管理器

我相信绝大多数人管理密码的方式就是「一招鲜,吃遍天」,但这种方式显然是不安全的。不说大型网站泄露密码这种较小概率事件,且说你有时候需要在一些小型网站注册,而你不能保证这些小型网站的密码不是明文存储或者会被盗用。

而在这种情况下,一旦出现密码泄露,攻击者再进行撞库,那后果是很惨的。事实上,针对 Microsoft 账户的撞库事件我在网上论坛已经看见很多次了(撞库攻击来替换你的紧急邮箱,如果你没有注意到微软给你发的替换紧急邮箱信息,那么 30 天后,你的账户不再是你自己的了)。

而进阶一点,你会想到设置一个「主密码」,然后注册各大网站时,针对各大网站的特点(例如在主密码基础上增添网站 Host),并针对网站的密码强度要求二次修改主密码。这其实也不是一个很好的选择,因为这仍然会有一定的记忆负担,而且一段时间后,你可能就会忘记网站的密码强度要求。更抽象的是,一些网站密码要求特殊字符,但并不把 _ 视为特殊字符(来源于我的个人经历 :))

所以密码管理器的需求出现了,出名的有 Microsoft Authenticator, Google Authenticator, Bitwarden, 1Password 等。其实各大浏览器也有一定的密码管理器功能,但受制于多端同步问题,且不推荐。前两者是各大厂的产品,后两者是在这领域比较出名,且功能比较完善的产品。

如果你没有在 VPS 上自建服务的能力(或者说没有条件),那么你可以试试 Bitwarden 提供的官方免费服务,尝试下 1Password 的家庭车。以下将讲述自建 Bitwarden Server——Vaultwarden。

搭建 Vaultwarden

Vaultwarden 是非官方版本的服务端的一个开源项目,且是与官方提供的客户端所兼容的和在维护中的。

以下采取 Docker 搭建,并使用 Nginx 进行反代(如果要自建 Server,请确保你使用 HTTPS 连接)。

创建容器

为了方便更新和维护,使用 docker-compose 来进行具体的部署,创建一个文件夹 vaultwarden 来存放部署相关文件。在其下创建 compose.yml.envupdate.sh 文件。

compose.yml 文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
ports:
- "127.0.0.1:10888:80"
volumes:
- /home/user/vw-data/:/data/
restart: unless-stopped
env_file:
- .env

注意修改挂载路径和映射端口。

.env 文件内容如下:

1
2
domain='YOUR_DOMAIN'
admin_token='YOUR_TOKEN'

其中 domain 添加需要有协议,一个示例:https://xxx_vaultwarden_xxx.lllei.top

其中 admin_token 生成使用 Argon2id PHC 字符串(你不用清楚这几个名词含义,你只要知道这是一个现代安全的哈希方式得到的字符串)。

生成方式如下:

  1. 首先使用 openssl rand -base64 48 生成随机的明文 token(之后在 admin 页面填写 token 是填写该 token)。
  2. 然后使用 docker run --rm -it vaultwarden/server /vaultwarden hash --preset owasp 来散列该 token。
  3. .env 文件中填入散列后得到的字符串。

update.sh 文件内容如下:

1
2
docker compose pull
docker compose up -d

然后使用 chmod +x update.sh,之后即可使用该脚本更新。

最后启动容器:docker compose up -d

反向代理

官方所给的 Nginx 参考配置:

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
# The `upstream` directives ensure that you have a http/1.1 connection
# This enables the keepalive option and better performance
#
# Define the server IP and ports here.
upstream vaultwarden-default {
zone vaultwarden-default 64k;
server 127.0.0.1:8080;
keepalive 2;
}

# Needed to support websocket connections
# See: https://nginx.org/en/docs/http/websocket.html
# Instead of "close" as stated in the above link we send an empty value.
# Else all keepalive connections will not work.
map $http_upgrade $connection_upgrade {
default upgrade;
'' "";
}

# Redirect HTTP to HTTPS
server {
listen 80;
listen [::]:80;
server_name vaultwarden.example.tld;

return 301 https://$host$request_uri;
}

server {
# For older versions of nginx appended http2 to the listen line after ssl and remove `http2 on`
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name vaultwarden.example.tld;

# Specify SSL Config when needed
#ssl_certificate /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/fullchain.pem;
#ssl_certificate_key /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/privkey.pem;
#ssl_trusted_certificate /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/fullchain.pem;
#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;
}
}

官方 WIKI 所给的示例

最后

使用方法

Goole 商店有安卓客户端,名字是 Bitwarden,苹果商店有苹果客户端。

电脑就是用 浏览器插件 即可。

请参考官方指示

设置

当你输入你的域名进入之后,注册一个用户,请牢记主密码

{host}/admin 路径下可以进入管理界面进行二次设置。特别是当你是自用需求时,可以关闭用户注册。

以上所有都只是起到一个入门作用,且满足绝大多数人的需求,如果想要进一步了解,请参考 官方 WIKI

比如说可以增加客户端 push,增加邮箱设置(个人使用几乎用不到),增加客户端实验性功能(ssh)。


自建密码管理器——Vaultwarden
https://lllei.top/2025/01/26/自建密码管理器——Vaultwarden/
作者
Lei
发布于
2025年1月26日
许可协议