​​开源密码管理新选择:自建 Bitwarden(Vault)密码托管,跨平台同步 + MFA 多因素认证

本文最后更新于 2025年7月28日 凌晨

为了安全,在不同网站使用不同的强密码确实很麻烦。但如果在自己的服务器上部署Bitwarden密码管理器,整个过程就能变得丝滑: 自动生成并存储强密码,多设备同步,还能一键填充。更爽的是,它甚至支持 MFA(Multi-Factor Authentication) 多因素认证,安全性直接拉满。

Bitwarden

Bitwarden 其实就是一个密码管理器,和 Apple 自带的密码管理工具差不多,提供了密码托管、强密码生成功能。不同的是,Apple 自带的密码管理器,只能在它生态内使用,在 Android 和 Windows 上就很尴尬了,但是 Bitwarden 提供跨平台支持。

其实更多的人应该更了解它的同类产品: 1Password,它也是跨平台支持,但是它价格有一点贵(虽然家庭版本性价比非常高)……

1Password vs Bitwarden

不同的是,Bitwarden 是开源的,而 1Password 是闭源的。同时,Bitwarden 可以自己部署服务端,意味着你可以掌控数据,而不是把数据交给第三方。

你可以搭建了自己的密码管理器,取代浏览器的密码管理器。

Vaultwarden

Bitwarden 本身是开源的,在不订阅的情况下,不论是订阅官方还是利用官方的服务端自建,功能都是受限的。比如: 不提供 MFA(这个挺关键的)、支持的用户有限(其实个人用无所谓)。

我们可以使用第三方开源机构维护的 Bitwarden 服务端:

  • Vaultwarden: 基于 Rust 开发的 Bitwarden 服务端,支持 MFA、支持多用户、支持多设备同步。

Vaultwarden 以前叫 bitwarden_rs,后来改名为 vaultwarden。

Vaultwarden 有以下优势:

  • 服务器性能要求低: Rust 语言的天然优势,加上社区的贡献,它对服务器的性能要求比官方的版本低很多。
  • 支持 MFA: 官方只有订阅版本才支持 MFA,而 Vaultwarden 支持 MFA。
flowchart LR
    A[Bitwarden<br/>客户端] --> B{服务端选择}
    
    B -->|Bitwarden官方| C[连接服务器<br/>SaaS OR Self-Host]
    C --> D{订阅状态检查}
    D -->|高级订阅| E[全功能解锁<br/>MFA/策略管理等]
    D -->|免费版| F[基础功能<br/>用户/设备限制]
    
    B -->|Vaultwarden社区版| G[连接自建服务器]
    G --> H[全功能默认解锁<br/>无订阅限制]
    H --> I[需手动维护更新]
    
    E & F & H --> J[密码库同步]
    
    style A fill:#6c8ebf,stroke:#333
    style C fill:#6c8ebf,stroke:#333
    style G fill:#d6b656,stroke:#333
    style E fill:#82b366,stroke:#333
    style H fill:#82b366,stroke:#333
    style F fill:#d6b656,stroke:#333
    style I fill:#ff9999,stroke:#333 

当然,Vaultwarden 也有缺点:

  • 不支持自动更新: 官方版本支持自动更新(非自部署版本),而 Vaultwarden 需要手动更新。
  • 依靠社区支持: Vaultwarden 依靠社区支持,更新速度可能没有官方那么快。

Vaultwarden 更新计划,可以看 GitHub 的 issuediscussions。尤其是这个 issue:

使用体验

就我目前而言,我使用 Bitwarden 的主要原因是:

  1. 跨平台同步: 不止于 macOS 和 iOS,还支持 Android、浏览器插件和 Linux 等平台上同步;尤其是浏览器插件,利用快捷键一键填充密码,非常方便。
  2. MFA 多因素认证: 以往的 MFA 都是第三方服务,比如 Google Authenticator,切换到 Bitwarden 后,配合多设备同步, MFA 登录终于不同找手机了。

MFA

尤其是浏览器插件,一键填充密码,非常方便:

一键填充密码

还有一个扩展功能: Send。 这个功能可以让你把文件或者文本,在 Bitwarden 中创建一个链接并设置有效期,然后发送给其他人,对方就可以通过链接下载文件或者查看文本。当文件或者文本过期后,内容和链接都会失效。

上传文件到 Send

就是大小有限制,目前是最大 500MB,也没有看到可以写改的地方🤔。但是 500MB,其实基本满足了。

支持创作

制作教程不易,如果热心的小伙伴,想支持创作,可以加入我们的电圈(还可以解锁远程协助、好友位😃):

WebChart Recognise

志同道合的小伙伴也是知音难觅。

  • 开发者爱好群: 👉 如果你对云服务器、CDN、云数据库和Linux等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习(目前可能就我一个人?🤔,毕竟才刚刚创建~)。
QQ_Group Recognise

当然,也欢迎在B站、YouTube或微信公众号上关注我们:

MintimateBlog Recognise

更多:

前置操作条件

部署 Vaultwarden 服务端,其实非常简单,硬件和软件分别需要:

  • Linux 服务器: 推荐使用 1CPU 1GB 内存以上的 Ubuntu 或者 Debian 发行版本服务器。
  • 域名: 一个域名,Vaultwarden 需要 HTTPS 才能使用,所以需要一个域名。如果你是本地使用,可以使用 hosts 去实现。
  • Docker: Vaultwarden 服务端使用 Docker 部署,所以我们需要 Docker 环境。

本文就使用腾讯云的轻量应用服务器配合 Debian 镜像,来部署 Vaultwarden 服务端。

如果你也想使用腾讯云的轻量应用服务器部署 Memos;那么你可以使用博客的专属链接购买体验:

本次使用的服务器配置(主要是内存需要 2G):

本次使用的服务器硬件配置

Docker Compose

Docker Compose 是 Docker 官方提供的工具,可以让我们通过一个配置文件来定义和运行多个 Docker 容器。使用 Docker Compose 可以简化 Docker 容器的部署和管理。

而且,毕竟 Compose 有一个文件用于定义和编排容器,所以后续的版本升级和配置修改,相比直接使用 docker run 命令,清晰了很多。

flowchart LR
    A[Docker 容器管理] --> B[docker run<br/>单容器管理]
    A --> C[docker compose<br/>多容器编排]
    
    B --> D1["🔧 手动配置参数<br/>📝 命令行操作<br/>🎯 适合快速测试"]
    B --> D2["示例:<br/>docker run -d --name web<br/>-p 80:80 nginx"]
    
    C --> E1["📋 YAML 文件配置<br/>🔄 自动化管理<br/>🏗️ 微服务架构"]
    C --> E2["示例:<br/>services:<br/>  web:<br/>    image: nginx<br/>    ports: ['80:80']"]
    
    style A fill:#4a90e2,stroke:#333,stroke-width:2px,color:#fff
    style B fill:#f5a623,stroke:#333,stroke-width:2px,color:#fff
    style C fill:#7ed321,stroke:#333,stroke-width:2px,color:#fff
    style D1 fill:#fff2cc,stroke:#d6b656
    style D2 fill:#f8cecc,stroke:#b85450
    style E1 fill:#d5e8d4,stroke:#82b366
    style E2 fill:#dae8fc,stroke:#6c8ebf

安装 Docker

虽然软件包管理器里面自带 docker,但是那个版本比较低,毕竟 Debian 官方的软件包管理器,都是比较保守的;所以我们一般都使用 Docker CE 版本的 Docker。你可以按照 Docker 官方文档,安装 Docker CE 版本的 Docker。

或者你用的是云厂商的服务器,那么你可以用云厂商的 Docker CE 版本镜像源,比如腾讯云的:

安装好后的效果:

1
2
docker --version
docker compose --version

安装 Docker 后的效果

部署 Vaultwarden

前置准备已经完成了。现在我们开始部署 Vaultwarden 服务端(客户端直接使用 Bitwarden 官方客户端即可)。

根据 Vaultwarden Docker Compose 的说明,我们只需要拉取镜像,然后使用 Docker Compose 启动即可。

至于 HTTPS,我个人喜欢在宿主机上部署 Nginx,然后使用 Nginx 代理到 Docker 容器,这样比较方便。

创建 Compose 文件

我的习惯是在根目录创建一个文件夹专门用于存储 Docker 相关的文件:

1
2
# 创建文件夹
mkdir -p /dockerData/vaultwarden

之后,我们进入该文件夹,创建 docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入文件夹
cd /dockerData/vaultwarden
# 创建 docker-compose.yml
cat <<'EOF' > docker-compose.yml
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
- DOMAIN=https://vw_demo.example.com
- SIGNUPS_ALLOWED=true
volumes:
- /dockerData/vaultwarden/vw-data:/data
ports:
- "1880:80"
EOF

docker-compose.yml

解释一下上面的配置文件:

  • DMAIN=https://vw_demo.example.com: 域名,这里我使用的是 https://vw_demo.example.com,你需要换成你自己的域名。后续我们使用 Nginx 代理到该域名。
  • SIGNUPS_ALLOWED=true: 允许注册,我们可以第一次启动后,注册一个账号,然后关闭该配置,这样就可以禁止注册来实现私有化。
  • volumes: - /dockerData/vaultwarden/vw-data:/data: 挂载数据卷,这样数据就不会丢失。
  • ports: - "1880:80": 端口映射,把容器内的 80 端口映射到宿主机的 1880 端口。

启动程序

之后,我们就可以启动程序了:

1
2
3
4
# 拉取镜像
docker compose pull
# 启动
docker compose up -d

启动程序

之后,我们在防火墙放行对应的端口就可以访问页面,但是无法进入 登录页面,因为没有 HTTPS:

没有 HTTPS 而报错

Nginx 反代

上文说到,Vaultwarden 需要 HTTPS 才能使用,所以我们需要一个 HTTPS 的域名。这里我们使用 Nginx 反代,实现 HTTPS。

如果你是在内网使用,那么你可以自签发一个证书,然后使用 Nginx 反代并在使用的客户端安装证书。否则,就需要申请一个 SSL 证书。

你可以参考我之前的文章 使用acme.sh给Web网站自动安装免费的SSL证书并自动更新,轻松实现HTTPS

我们在 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
 server {
listen 80;
listen 443 ssl;
http2 on;
server_name vw_demo.mintimate.cn;

# SSL 配置 注意这里需要替换成自己的证书
ssl_certificate /dockerData/vaultwarden/vw_demo.example.cn.crt;
ssl_certificate_key /dockerData/vaultwarden/vw_demo.example.cn.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# WebSocket
proxy_http_version 1.1; # 必需HTTP/1.1
proxy_set_header Upgrade $http_upgrade; # 传递升级头
proxy_set_header Connection "upgrade"; # 设置连接为升级模式

proxy_pass http://localhost:1880; # 确保端口与Docker服务匹配
}
}

当然,你也可以像我一样,使用 EdgeOne 这样的 CDN 实现 HTTPS:

EdgeOne设置 SSL

之后,浏览器访问 HTTPS,即可看到登录页面:

登录页面

注册账号后,即可看到主页:

主页

Vaultwarden 配置

接下来,我们可以配置一下 Vaultwarden。

禁止注册

当我们注册完毕后,我们就可以禁止注册了,这样就可以实现私有化部署了。

修改 docker-compose.yml 文件,添加 SIGNUPS_ALLOWED=false,然后重启容器:

1
2
# 重启容器(并重载配置)
docker compose down && docker compose up -d

禁止注册后,我们就可以看到注册按钮消失了。

浏览器插件

你可以在 Chrome、Edge 和 Firefox 等浏览器插件商店中搜索 Bitwarden,安装即可:

打开插件的时候,选择自托管:

浏览器插件

在弹出的界面,输入自己服务器的 URL 即可。

你还可以激活插件的自动填充,达到文章开头的效果:

浏览器自动填充

禁用Web入口

为了进一步加固安全,在注册好账户后,你可以禁用Vaultwarden 的 Web入口,只使用 Web API 来登录 Bitwarden 的浏览器插件、移动端应用等。

修改 docker-compose.yml 文件,添加 WEB_VAULT_ENABLED=false,然后重载容器的配置即可:

禁用web入口

哈哈,或者你可以像我这样,自定义一个好看的主页:

自定义一个好看的主页

END

好啦,感谢阅读,如果觉得不错,欢迎点赞、评论、转发。如果有什么问题,欢迎在评论区留言。

我使用 Vaultwarden 已经一年多了,感觉还是很稳的。目前数据库使用外置 MySQL,看了一下,才用了不到 100MB 的存储空间,还是非常省空间的。至于稳定性就更不用说了,一年没宕机过。

当然,我还是建议大家升级最新 Docker CE 或者 Vaultwarden 镜像前,给服务器做一下快照,防止遇到什么奇葩问题需要回滚。

最后,如果你觉得本篇教程对你有帮助,欢迎加入我们的开发者交流群: 812198734 ,一起交流学习,共同进步。



​​开源密码管理新选择:自建 Bitwarden(Vault)密码托管,跨平台同步 + MFA 多因素认证
https://www.mintimate.cn/2025/07/26/vaultwardenHost/
作者
Mintimate
发布于
2025年7月26日
许可协议