自搭建私有密码库Vaultwarden


前言

随着注册的网站数量不断增加,我们面临的一个主要挑战是如何安全地管理众多的用户名和密码。传统的密码管理方法,如使用相同的密码或将密码写在纸上,不仅效率低下,而且存在严重的安全隐患。为了解决这些问题,密码管理器应运而生,它们提供了一种集中存储和自动填充密码的解决方案,大大提高了用户在线账户的安全性。

在这样的背景下,Vaultwarden应运而生。它是一个开源的Bitwarden密码管理器的替代品,为用户提供了一个安全、可靠且易于使用的密码管理解决方案。Vaultwarden不仅允许用户在多个设备之间同步密码,还支持高级加密功能,确保用户数据的隐私和安全。

项目介绍

Vaultwarden 是一个使用 Rust 编写的开源项目,它是 Bitwarden 服务器 API 的替代实现,与官方 Bitwarden 客户端兼容。这意味着你可以使用 Vaultwarden 自托管你的密码管理服务,而不是依赖 Bitwarden 的官方服务器。Vaultwarden 特别适合那些希望减少对官方服务的依赖、提高数据控制力和隐私保护的用户。
项目特点:
1. 轻量化:相比官方 Bitwarden 服务器,Vaultwarden 资源占用更少,运行更高效。
2. 安全性:实现了 Bitwarden 的大部分安全特性,包括端到端加密。
3. 兼容性:支持官方 Bitwarden 客户端,包括桌面端、移动端和浏览器扩展。
4. 自托管:允许用户在自己的服务器上部署和管理密码库。
5. 多平台支持:支持 Windows、macOS、Linux、iOS 和 Android。
6. 免费使用:作为一个开源项目,Vaultwarden 可以免费使用。

功能:

  • 支持组织功能。
  • 支持附件和发送功能。
  • 提供保管库界面的静态文件。
  • 支持网站图标 API。
  • 支持身份验证器和 U2F。
  • 支持 YubiKey 和 Duo。
  • 支持紧急访问。

安装和使用:
Vaultwarden 通常通过 Docker 容器部署,用户可以通过简单的命令拉取镜像并运行容器。部署后,用户需要配置反向代理和 SSL 证书以启用 HTTPS 访问,这是出于现代浏览器对 Web Crypto API 的安全要求。主密码无法通过任何方式恢复,如果忘记密码最多只能通过邮件获取你预先设置的密码提示,如果依然无法想起主密码,就会失去所有数据。

备份方案:
Vaultwarden 的备份方案包括定期备份数据库和其他重要文件。用户可以使用 Docker 的备份工具或手动备份来保护他们的密码库。

社区和支持:
Vaultwarden 有一个活跃的社区,用户可以通过 GitHub 讨论、论坛或 Matrix 聊天室获得帮助和支持。
如果你对密码管理有更高的需求,希望有更多的控制权和隐私保护,Vaultwarden 是一个不错的选择。

安装部署

Docker Compose部署

创建安装目录

1
2
3
4
5
6
7
8
sudo -i

mkdir -p /root/docker/vaultwarden

cd /root/docker/vaultwarden

vim docker-compose.yml

英文输入法下,按 i

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: '3'

services:
vaultwarden:
container_name: vaultwarden
image: vaultwarden/server:latest
restart: unless-stopped
volumes:
- ./data/:/data/
ports:
- 8080:80
environment:
- DOMAIN=https://subdomain.yourdomain.com # 这是您希望与您的Vaultwarden实例关联的域名。
- LOGIN_RATELIMIT_MAX_BURST=10 # 允许在一阵登录/两步验证尝试中的最大请求次数。
- LOGIN_RATELIMIT_SECONDS=60 # 这是来自同一IP的登录请求之间的平均秒数,在Vaultwarden限制登录次数之前。
- ADMIN_RATELIMIT_MAX_BURST=10 # 这与LOGIN_RATELIMIT_MAX_BURST相同,只争对admin面板。
- ADMIN_RATELIMIT_SECONDS=60 # 这与LOGIN_RATELIMIT_SECONDS相同
- ADMIN_SESSION_LIFETIME=20 # 会话持续时间
- ADMIN_TOKEN=YourReallyStrongAdminTokenHere # 此值是Vaultwarden管理员面板的令牌(一种密码)。为了安全起见,这应该是一个长的随机字符串。如果未设置此值,则管理员面板将被禁用。建议openssl rand -base64 48 生成ADMIN_TOKEN确保安全
- SENDS_ALLOWED=true # 此设置决定是否允许用户创建Bitwarden发送 - 一种凭证共享形式。
- EMERGENCY_ACCESS_ALLOWED=true # 此设置控制用户是否可以启用紧急访问其账户的权限。例如,这样做可以在用户去世后,配偶可以访问密码库以获取账户凭证。可能的值:true / false。
- WEB_VAULT_ENABLED=true # 此设置决定了网络保险库是否可访问。一旦您配置了您的账户和客户端,停止您的容器,然后将此值切换为false并重启Vaultwarden,可以用来防止未授权访问。可能的值:true/false。
- SIGNUPS_ALLOWED=true # 此设置控制新用户是否可以在没有邀请的情况下注册账户。可能的值:true / false。

切换成英文输入法,修改好之后,按一下 esc,然后 :wq 保存退出。

命令行输入

1
docker-compose up -d

Docker部署

仅需一条命令即可方便的部署在 Vaultwarden

1
2
3
4
5
6
7
8
9
docker run -d \
--name=vaultwarden \
-e WEBSOCKET_ENABLED=true \
-e LOG_FILE=/log/bitwarden.log \
-e ADMIN_TOKEN='主管理密码' \
-p 'docker映射本机端口':80 -p 'docker映射本机端口':4567 \
-v 'docker映射本机目录地址':/data/ \
--restart=always \
vaultwarden/server:latest

需要注意的是:

  • --name 设置 docker 中显示的名字,docker 项目多时方便管理
  • ADMIN_TOKEN 设置 Vaultwarden 管理后台密码(这个不是主密码,待会可以改)
  • -p 映射端口,如果服务器上有其他网页服务,建议映射到其他端口反代,不要直接使用 80 端口
  • -v 目录映射非常重要,映射到本机的目录即为后面需要备份的目录,是重要安全保障
  • --restart 使 Vaultwarden 可以自动重启

宝塔部署

好消息是宝塔面板的软件商店已经有了 Vaultwarden 快捷安装了,同样是使用 docker 容器部署,直接搜索即可。

按说明设置端口

域名解析&反代

将域名解析到服务器地址,开启 https,然后把刚刚设置的 'docker映射本机端口':80 反代

管理后台

访问 your.domain/admin,登录 Vault­war­den 管理后台,登陆密码为刚刚设置的 ADMIN_TOKEN

在这里可以根据情况对 Vault­war­den 进行一些可选设置,不了解的项目建议保持默认

需要注意这几项:

Gen­eral Set­tings

  • Domain URL:设置你的网站域名,记得带上 https,如 https://your.domain
  • Allow new signups:是否允许用户注册,如果密码库仅仅用于自用,建议在自己注册后关闭此选项
  • Admin page token:在这里更改 Vaultwarden 管理后台的密码
  • Invitation organization name:设置你的网站名字,将出现在自动发送的电子邮件中

SMTP Email Set­tings

  • 设置 SMTP 服务,用来发送系统邮件(建议开启)
  • 根据你的 SMTP 服务提供方填写相关信息即可
    • 设置保存后,运行一次 Test SMTP 确保邮件可以正常发送

Read-Only Con­fig

  • 这里可以查看所有只读选项,可以停止 docker 容器后通过编辑 'docker映射本机目录地址':/data/ 目录中的 config.json 修改

开始使用

设置完成后,访问 your.domain 创建你的密码管理账户

在这里设置 主密码,同时可以选择设置一条主密码提示,当你忘记主密码时,可通过邮件获取主密码提示

备份与恢复

备份说明

Vaultwarden的官方文档:
https://github.com/dani-garcia/vaultwarden/wiki/Backing-up-your-vault

docker 部署的 Vaultwarden 备份很简单

只需要备份映射的 ‘docker映射本机目录地址’:/data/ 目录中的全部文件即可

详细来说,它的目录结构是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
data
├── attachments # 用户上传的每个附件都存储为此目录下的单独文件.
│ └── <uuid> # (如果没有创建附件,附件目录将不存在.)
│ └── <random_id>
├── config.json # 存储 Vaultwarden 管理后台配置.
├── db.sqlite3 # 主 SQLite 数据库文件.
├── db.sqlite3-shm # SQLite 共享内存文件(可能存在).
├── db.sqlite3-wal # SQLite 预写日志文件(可能存在).
├── icon_cache # 站点图标(favicons)缓存在此目录下.
│ ├── <domain>.png
│ ├── example.com.png
│ ├── example.net.png
│ └── example.org.png
├── rsa_key.der # `rsa_key.*` 文件用于签署认证令牌.
├── rsa_key.pem
├── rsa_key.pub.der
└── sends # 用户上传的每个 Send 附件都存储为此目录下的单独文件.
└── <uuid> # (如果未创建 Send 附件,则发送目录将不存在.)
└── <random_id>

其中

SQLite 数据库文件
非常重要,需要备份

除了上传的附件单独存储在 at­tach­ments 目录下外,SQLite 数据库文件存储了几乎所有重要的用户密码信息,是最重要的数据文件。

attachments 目录
重要,需要备份

attachments 目录存放密码条目中上传的附件文件

sends 目录
可选备份

sends 目录存放 Send 附件,考虑到 Send 附件往往只用作暂时分享,如果你没有长期存储的 Send 文件,可排除备份此文件夹以减小备份体积

config.json 文件
建议备份

config.json 文件明文存储 Vault­war­den 管理后台配置,如果没有备份此文件,恢复备份后可能需要重新设置相关配置

rsa_key 文件*
建议备份

该文件存储当前登录用户的身份令牌,删除此文件后,所有登陆的用户将被注销,迫使他们重新登录

icon_cache 目录
可选备份

存放密码网站图标,这些图标会在缺少是自动生成,如非必要可以不备份

备份

以宝塔面板为例
点击计划任务 - 添加任务 ,任务类型选备份目录

恢复

回滚恢复

先暂停 docker 容器

1
docker stop <name>

将备份的文件替换当前 data 目录,然后重新启动 docker 容器

1
docker start <name>

如果发生错误,可尝试删除容器重新部署 docker

全新恢复

删除现有 docker 容器

1
2
docker stop <name>
docker rm <name>

将备份的文件替换当前 data 目录,然后重新部署 docker 容器

1
2
3
4
5
6
7
8
9
docker run -d \
--name=vaultwarden \
-e WEBSOCKET_ENABLED=true \
-e LOG_FILE=/log/bitwarden.log \
-e ADMIN_TOKEN='主管理密码' \
-p 'docker映射本机端口':80 -p 'docker映射本机端口':4567 \
-v 'docker映射本机目录地址':/data/ \
--restart=always \
vaultwarden/server:latest

升级

在更新开始前,建议先备份一下

docker 升级:

首先暂停并删除当前容器

1
2
docker stop <name>
docker rm <name>

拉取最新镜像

1
docker pull vaultwarden/server:latest

从新镜像部署容器(注意映射关系要保持一致

1
2
3
4
5
6
7
8
9
docker run -d \
--name=vaultwarden \
-e WEBSOCKET_ENABLED=true \
-e LOG_FILE=/log/bitwarden.log \
-e ADMIN_TOKEN='主管理密码' \
-p 'docker映射本机端口':80 -p 'docker映射本机端口':4567 \
-v 'docker映射本机目录地址':/data/ \
--restart=always \
vaultwarden/server:latest

建议部署容器成功后,进行测试,确定没有问题后再删除镜像
如果发生了错误,可用未删除的老版本镜像重新部署,然后等待社区更新

==docker-compose 升级:==

1
2
3
4
5
6
7
cd /root/docker/vaultwarden

docker-compose pull

docker-compose up -d

docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

1
2
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入 y 确认