密码管理之痛
相信大家都有一个困扰,就是各种软件、网站的密码管理问题。很多人都是全靠大脑记忆,估计下面列举的痛点或多或少都有一些。
- 全都用相同的密码,感觉不够安全
- 全都用不同的密码,记忆难度过大
- 各平台的密码长度、复杂度要求不一样
- 有些账号需要定期重置密码,加重记忆负担
那么就需要一定的密码管理策略来解决这些痛点。针对这个问题,我也找到了这么几种方案:
方案 | 可靠度 | 安全性 | 便利性 | 成本 |
---|---|---|---|---|
脑子记 | 可靠度很低,除非过目不忘 | 安全性极高,基本不会泄露 | 便利性极高,不依赖任何外部介质 | 0 |
纸质介质记录 | 可靠度极高,一般不会凭空消失 | 安全性较低,有被偷看的风险 | 便利性较低,不便于随身携带、随时查看 | 5块钱买个本 |
本地文档记录 | 可靠度较低,须做好多端备份 | 安全性一般,明文记录 | 便利性较低,不便于多平台随时查看 | 0 |
云文档记录 | 可靠度较高,建议选靠谱的云服务(但不排除服务调整或突然终止 | 安全性较低,明文记录且上云 | 便利性很高,多平台同步 | 0 |
密码管理软件(纯本地) | 可靠度较低,须做好多端备份 | 安全性较高,专业加密算法 | 便利性较低,不便于多平台随时查看 | 一般免费 |
密码管理软件(上云) | 可靠度较高,建议选靠谱的服务商(但不排除服务调整或突然终止 | 安全性较高,专业加密算法 | 便利性很高,一般支持多平台同步 | 一般收费 |
密码管理软件(私有云) | 可靠度取决于你的维护(做好备份工作 | 安全性较高,专业加密算法 | 便利性很高,一般支持多平台同步 | 需要私有云服务器、nas等 |
综合来看,首先前四种方案都有较为明显的短板,不适合作为长期使用的密码管理方案。
在后三种专业密码管理软件中,首先安全性都能够得到不错的保证,差别主要体现在可靠度、便利性和成本之间的取舍。
- 选择纯本地,相当于为低成本舍弃可靠度和便利性
- 选择上云,相当于以高成本换取最佳体验
- 而选择私有云,在有云服务器或 nas 的情况下,则可以 0 成本获得最佳体验
本文介绍的私有化密码管理方案将基于开源项目 bitwarden/Vaultwarden
bitwarden/Vaultwarden 项目介绍
bitwarden 是开源的专业密码管理软件,是目前最为常用的密码管理软件之一,主要特点有:
- Windows、Mac、Linux、Android、iOS 全平台覆盖
- 支持 Chrome、Edge、Safari、Firefox 等主流浏览器插件
- 支持
密码
、文本
、信息表
甚至附件
的加密保管 - 支持自动填写网页、app 账号密码
- 支持文件加密分享,方便地通过 bitwarden send 分享隐私文件、照片等
- 支持生成两步验证器,为每个密码设置 TOTP 动态口令
- 支持团队密码库,可在团队成员中共享团队密码
- 支持密码检测报告,检测密码库中的重复密码、弱密码、已被泄露的密码等
- 代码开源,支持自搭建,将数据全部掌握在自己手中
- ... ...
在安全性方面,bitwarden 的原理是使用一个足够复杂的 主密码
来管理其他所有的密码,采用 AES-256 位加密、加盐哈希和 PBKDF2 SHA-256 来保证所有信息的安全。安全性可以这么说,只要你自己不主动把主密码泄露,目前地球上没有能暴力破解的计算机。bitwarden 官网有比较详细的介绍,它会定期进行第三方安全审计,通过了 GDPR、SOC 2、HIPAA、Privacy Shield 和 CCPA 等认证。
主密码无法通过任何方式恢复,如果忘记密码最多只能通过邮件获取你预先设置的密码提示,如果依然无法想起主密码,就会失去所有数据。
bitwarden 官方也提供了云服务,定价如图
不过 bitwarden 最为吸引人的当然还是它的开源属性。一方面,开源 + 庞大的用户量保证了开源社区能够不断维护 bitwarden 的算法,保证其安全性。另一方面,开源使得用户可以方便地自行搭建 bitwarden 服务。自搭建 bitwarden 的优势在于:
- 和官方服务拥有相同的安全性
- 数据完全掌握在自己手中,不用担心官方服务故障或跑路
- 完全免费,免费使用官方付费版的全部功能
bitwarden 官方提供了 GitHub、DockerHub 开源仓库,不过 bitwarden 官方服务对服务器系统占用较高,一般建议使用同源项目 Vaultwarden 进行自搭建。Vaultwarden 原名 Bitwarden_RS,是用 Rust 语言实现的 bitwarden api,实现了 bitwarden api 的完整功能,同时支持使用 Docker 方便地进行部署。
安装部署
Docker 镜像部署
我们使用 Docker,仅需一个命令便可以方便地部署 Vaultwarden
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
Vaultwarden 管理后台
访问 your.domain/admin
,登录 Vaultwarden 管理后台,登陆密码为刚刚设置的 ADMIN_TOKEN
在这里可以根据情况对 Vaultwarden 进行一些可选设置,所有的设置项都可以通过鼠标悬停查看相应的说明,不了解的项目建议保持默认
这里介绍几个我认为值得关注的设置项:
- General Settings
- Domain URL:设置你的网站域名,记得带上 https,如
https://your.domain
- Allow new signups:是否允许用户注册,如果密码库仅仅用于自用,建议在自己注册后关闭此选项
- Admin page token:在这里更改 Vaultwarden 管理后台的密码
- Invitation organization name:设置你的网站名字,将出现在自动发送的电子邮件中
- Domain URL:设置你的网站域名,记得带上 https,如
- SMTP Email Settings
- 设置 SMTP 服务,用来发送系统邮件(建议开启)
- 根据你的 SMTP 服务提供方填写相关信息即可
- 设置保存后,运行一次 Test SMTP 确保邮件可以正常发送
- Read-Only Config
- 这里可以查看所有只读选项,可以停止 docker 容器后通过编辑
'docker映射本机目录地址':/data/
目录中的config.json
修改
- 这里可以查看所有只读选项,可以停止 docker 容器后通过编辑
- Backup Database
- 这里提供了一个简易的数据库备份功能,不过我们稍后会介绍全面的备份流程
开始使用
必要的设置完成后,访问 your.domain
创建你的密码管理账户
在这里设置 主密码
,同时可以选择设置一条主密码提示,当你忘记主密码时,可通过邮件获取主密码提示
注意:千万不要设置与主密码关联性太强的主密码提示,因为当你的邮箱账户被盗用时,所有人都可以获得你的主密码提示!
备份/恢复/升级
Vaultwarden 官方文档:https://github.com/dani-garcia/vaultwarden/wiki/Backing-up-your-vault
使用 docker-aultwarden 部署的 bitwarden 备份非常简单,只需要备份映射的 '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 数据库文件
非常重要,需要备份
除了上传的附件单独存储在 attachments 目录下外,SQLite 数据库文件存储了几乎所有重要的用户密码信息,是最重要的数据文件。
attachments 目录
重要,需要备份
attachments
目录存放密码条目中上传的附件文件
sends 目录
可选备份
sends
目录存放 Send 附件,考虑到 Send 附件往往只用作暂时分享,如果你没有长期存储的 Send 文件,可排除备份此文件夹以减小备份体积
config.json 文件
建议备份
config.json
文件明文存储 Vaultwarden 管理后台配置,如果没有备份此文件,恢复备份后可能需要重新设置相关配置
需要注意的是,
config.json
文件明文存储信息,这意味着将包括你的 Vaultwarden 管理后台密码和邮箱 SMTP 设置,虽然说这并不会对你的主密码和密码库安全有任何影响,但如果你担心会泄露这两者,可在备份此文件时采用一定的加密措施我的建议是,保证 Vaultwarden 管理后台密码不和主密码以及任何常用密码相同,然后采用专用的业务邮箱来配置 SMTP 信息,这样即使发生泄露,一般也不会产生实质的危害
rsa_key* 文件
建议备份
该文件存储当前登录用户的身份令牌,删除此文件后,所有登陆的用户将被注销,迫使他们重新登录
icon_cache 目录
可选备份
存放密码网站图标,这些图标会在缺少是自动生成,如非必要可以不备份
备份操作
实际备份操作可根据以上说明进行
对我而言,我的网站只供我和朋友使用,平时也不常用附件和 Send 功能,数据量很小,所以直接对整个目录进行备份
我的备份策略是每天凌晨 1:30 将目录打包备份至服务器,并上传一份到 OneDrive,始终保存最新的 10 个版本(基于宝塔
恢复操作
- 回滚恢复
先暂停 docker 容器
docker stop <name>
将备份的文件替换当前 data 目录,然后重新启动 docker 容器
docker start <name>
如果发生错误,可尝试删除容器重新部署 docker(参考 2. 全新回复
- 全新恢复
删除现有 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
升级操作
当 image 镜像更新,可根据需要对镜像进行升级
在升级前务必阅读官方更新日志,关注升级过程中有没有兼容性问题,以及如何迁移数据(如果需要
正常的版本更新,可通过以下步骤进行
在更新开始前,建议先备份一下
首先暂停并删除当前容器
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
文章评论