自搭建全平台私有密码库 bitwarden & Vaultwarden

密码管理之痛

相信大家都有一个困扰,就是各种软件、网站的密码管理问题。很多人都是全靠大脑记忆,估计下面列举的痛点或多或少都有一些。

  • 全都用相同的密码,感觉不够安全
  • 全都用不同的密码,记忆难度过大
  • 各平台的密码长度、复杂度要求不一样
  • 有些账号需要定期重置密码,加重记忆负担

那么就需要一定的密码管理策略来解决这些痛点。针对这个问题,我也找到了这么几种方案:

方案可靠度安全性便利性成本
脑子记可靠度很低,除非过目不忘安全性极高,基本不会泄露便利性极高,不依赖任何外部介质0
纸质介质记录可靠度极高,一般不会凭空消失安全性较低,有被偷看的风险便利性较低,不便于随身携带、随时查看5块钱买个本
本地文档记录可靠度较低,须做好多端备份安全性一般,明文记录便利性较低,不便于多平台随时查看0
云文档记录可靠度较高,建议选靠谱的云服务(但不排除服务调整或突然终止安全性较低,明文记录且上云便利性很高,多平台同步0
密码管理软件(纯本地)可靠度较低,须做好多端备份安全性较高,专业加密算法便利性较低,不便于多平台随时查看一般免费
密码管理软件(上云)可靠度较高,建议选靠谱的服务商(但不排除服务调整或突然终止安全性较高,专业加密算法便利性很高,一般支持多平台同步一般收费
密码管理软件(私有云)可靠度取决于你的维护(做好备份工作安全性较高,专业加密算法便利性很高,一般支持多平台同步需要私有云服务器、nas等

综合来看,首先前四种方案都有较为明显的短板,不适合作为长期使用的密码管理方案。

在后三种专业密码管理软件中,首先安全性都能够得到不错的保证,差别主要体现在可靠度、便利性和成本之间的取舍。

  • 选择纯本地,相当于为低成本舍弃可靠度和便利性
  • 选择上云,相当于以高成本换取最佳体验
  • 而选择私有云,在有云服务器或 nas 的情况下,则可以 0 成本获得最佳体验

本文介绍的私有化密码管理方案将基于开源项目 bit­war­den/​Vault­war­den

bitwarden/Vaultwarden 项目介绍

bit­war­den 是开源的专业密码管理软件,是目前最为常用的密码管理软件之一,主要特点有:

  • Windows、Mac、Linux、Android、iOS 全平台覆盖
  • 支持 Chrome、Edge、Safari、Firefox 等主流浏览器插件
  • 支持 密码文本信息表 甚至 附件 的加密保管
  • 支持自动填写网页、app 账号密码
  • 支持文件加密分享,方便地通过 bitwarden send 分享隐私文件、照片等
  • 支持生成两步验证器,为每个密码设置 TOTP 动态口令
  • 支持团队密码库,可在团队成员中共享团队密码
  • 支持密码检测报告,检测密码库中的重复密码、弱密码、已被泄露的密码等
  • 代码开源,支持自搭建,将数据全部掌握在自己手中
  • … …

在安全性方面,bit­war­den 的原理是使用一个足够复杂的 主密码 来管理其他所有的密码,采用 AES-256 位加密、加盐哈希和 PBKDF2 SHA-256 来保证所有信息的安全。安全性可以这么说,只要你自己不主动把主密码泄露,目前地球上没有能暴力破解的计算机。bitwarden 官网有比较详细的介绍,它会定期进行第三方安全审计,通过了 GDPR、SOC 2、HIPAA、Pri­vacy Shield 和 CCPA 等认证。

主密码无法通过任何方式恢复,如果忘记密码最多只能通过邮件获取你预先设置的密码提示,如果依然无法想起主密码,就会失去所有数据。

bit­war­den 官方也提供了云服务,定价如图

自搭建全平台私有密码库 bitwarden & Vaultwarden

不过 bit­war­den 最为吸引人的当然还是它的开源属性。一方面,开源 + 庞大的用户量保证了开源社区能够不断维护 bit­war­den 的算法,保证其安全性。另一方面,开源使得用户可以方便地自行搭建 bit­war­den 服务。自搭建 bit­war­den 的优势在于:

  • 和官方服务拥有相同的安全性
  • 数据完全掌握在自己手中,不用担心官方服务故障或跑路
  • 完全免费,免费使用官方付费版的全部功能

bit­war­den 官方提供了 GitHubDockerHub 开源仓库,不过 bit­war­den 官方服务对服务器系统占用较高,一般建议使用同源项目 Vaultwarden 进行自搭建。Vault­war­den 原名 Bit­war­den_RS,是用 Rust 语言实现的 bit­war­den api,实现了 bit­war­den api 的完整功能,同时支持使用 Docker 方便地进行部署。

安装部署

Docker 镜像部署

我们使用 Docker,仅需一个命令便可以方便地部署 Vault­war­den

docker run -d \

–name=vaultwarden \

-e WEBSOCKET_ENABLED=true \

-e LOG_FILE=/log/bitwarden.log \

-e ADMIN_TOKEN=’主管理密码’ \

-p ‘docker映射本机端口’:80 -p ‘docker映射本机端口’:3012 \

-v ‘docker映射本机目录地址’:/data/ \

–restart=always \

vaultwarden/server:latest

需要注意的是:

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

域名 dns 解析 / HTTPS / 服务器反代

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

以宝塔面板为例,这里我的 docker映射本机端口 为 1234

自搭建全平台私有密码库 bitwarden & Vaultwarden

Vaultwarden 管理后台

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

自搭建全平台私有密码库 bitwarden & Vaultwarden

在这里可以根据情况对 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 修改
  • Backup Data­base
    • 这里提供了一个简易的数据库备份功能,不过我们稍后会介绍全面的备份流程

开始使用

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

自搭建全平台私有密码库 bitwarden & Vaultwarden

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

注意:千万不要设置与主密码关联性太强的主密码提示,因为当你的邮箱账户被盗用时,所有人都可以获得你的主密码提示!

备份/恢复/升级

Vault­war­den 官方文档:https://github.com/dani-garcia/vaultwarden/wiki/Backing-up-your-vault

使用 docker-ault­war­den 部署的 bit­war­den 备份非常简单,只需要备份映射的 'docker映射本机目录地址':/data/ 目录中的全部文件即可

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

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 管理后台配置,如果没有备份此文件,恢复备份后可能需要重新设置相关配置

需要注意的是,config.json 文件明文存储信息,这意味着将包括你的 Vaultwarden 管理后台密码邮箱 SMTP 设置,虽然说这并不会对你的主密码和密码库安全有任何影响,但如果你担心会泄露这两者,可在备份此文件时采用一定的加密措施

我的建议是,保证 Vault­war­den 管理后台密码不和主密码以及任何常用密码相同,然后采用专用的业务邮箱来配置 SMTP 信息,这样即使发生泄露,一般也不会产生实质的危害

rsa_key* 文件

建议备份

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

icon_cache 目录

可选备份

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


备份操作

实际备份操作可根据以上说明进行

对我而言,我的网站只供我和朋友使用,平时也不常用附件和 Send 功能,数据量很小,所以直接对整个目录进行备份

我的备份策略是每天凌晨 1:30 将目录打包备份至服务器,并上传一份到 OneDrive,始终保存最新的 10 个版本(基于宝塔

自搭建全平台私有密码库 bitwarden &amp; Vaultwarden

恢复操作

  1. 回滚恢复

先暂停 docker 容器

docker stop <name>

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

docker start <name>

如果发生错误,可尝试删除容器重新部署 docker(参考 2. 全新回复

  1. 全新恢复

删除现有 docker 容器(如有)

docker stop <name>

docker rm <name>

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

docker run -d \

–name=vaultwarden \

-e WEBSOCKET_ENABLED=true \

-e LOG_FILE=/log/bitwarden.log \

-e ADMIN_TOKEN=’主管理密码’ \

-p ‘docker映射本机端口’:80 -p ‘docker映射本机端口’:3012 \

-v ‘docker映射本机目录地址’:/data/ \

–restart=always \

vaultwarden/server:latest


升级操作

当 im­age 镜像更新,可根据需要对镜像进行升级

在升级前务必阅读官方更新日志,关注升级过程中有没有兼容性问题,以及如何迁移数据(如果需要

正常的版本更新,可通过以下步骤进行

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

首先暂停并删除当前容器

docker stop <name>

docker rm <name>

然后拉取最新镜像

docker pull vaultwarden/server:latest

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

docker run -d \

–name=vaultwarden \

-e WEBSOCKET_ENABLED=true \

-e LOG_FILE=/log/bitwarden.log \

-e ADMIN_TOKEN=’主管理密码’ \

-p ‘docker映射本机端口’:80 -p ‘docker映射本机端口’:3012 \

-v ‘docker映射本机目录地址’:/data/ \

–restart=always \

vaultwarden/server:latest

建议部署容器成功后,进行测试,确定没有问题后再删除镜像

如果发生了错误,可用未删除的老版本镜像重新部署,然后等待社区更新

确认无误后,删除原镜像,先查看镜像列表

docker images

# REPOSITORY TAG IMAGE ID CREATED SIZE

# vaultwarden/server latest 28e916391e7a 2 months ago 193MB

# vaultwarden/server <none> 8af25c1e7832 2 months ago 193MB

比如上面例子中,TAG 为 <none> 的便是老版本镜像,删除它

docker rmi 8af25c1e7832

给TA打赏
共{{data.count}}人
人已打赏
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索