原来我的密码风格都是网站名加固定密码的组合方式,存在一点点的安全隐患。之前就在 TESTV 节目里看到过 1PassWord 的强大功能,可惜不是睾贵的苹果用户,目前 1PassWord 也有安卓和 Windows 端,只是体验不佳,而且每年还都有白嫖活动。在去年疫情时的心血来潮想要使用密码管理器,本着能不花钱就不花钱,能用开源的就用开源的原则,就走上了这条折腾的不归路。

KeePass

首先使用的是最为老牌的 KeePass 了,一开始是迟到了知乎一篇文章的安利(一劳永逸:KeePass全网最详使用指南 - 知乎 (zhihu.com) ),正好自己是坚果云的高强度用户,密码备份有着落,就跟着教程一步一步的配置了 KeePass 的环境,并且一直使用了一年左右。

KeePass 作为老牌开源软件,其功能性是毋庸置疑的。自动混淆输入,丰富的插件支持,多种备份方式支持等等,都是非常强大而且实用的功能。同时由于其开源特性,在各平台有着各种各样的客户端,Windows 上有官方的 KeePass2,还有经典的 KeePassXC 等等,也是由于其开源社区维护的特性,这些软件的 UI 充满了复古气息,操作上也比较复杂,使用起来多有不便。

经过很长时间的磨合,在 Windows 端我依然选择的是最丑同时也是功能最全的 KeePass2,最大的需求是 Windows Hello 的支持,当然这个支持需要插件来完成,另外对于两步验证也就是 TOTP 的支持也是可以使用插件来完成的;在安卓端,一开始使用的是 KeePass2Android,这也是大多数人的选择,安卓平台也有 KeePassXc 可以选择,只是作者不愿意支持联网同步,无法满足我的需求,后来在酷安发现了一个新秀 KeePassA,也是开源的,对于指纹、TOTP的支持也是完整的,更重要的是 UI 非常的舒服,所以后来就转向了 KeePassA。

Bitwarden

其实因为 KeePass 太丑,一直想要找一个合适的替代品,在 V2EX 的密码管理器日经贴中,很多人一直在提 Bitwarden,便萌生了使用的念头,一开始使用了官方版,发现免费版本不能使用 TOTP,对自己搭建密码管理器心存芥蒂,总怕哪天服务器崩了就把所有密码一锅端了。4 月初在知乎上发现了一篇使用腾讯云托管的方法搭建 Bitwarden 的方法,便试了一下。

腾讯云托管

用了4年密码管理神器KeePass,结果一试Bitwarden就回不去了!? - 知乎 (zhihu.com),这是那篇链接,详细记录了搭建的流程。腾讯云开发首次使用送一个月的免费资源,我就开始了入坑之旅。从使用的环境上看,不是原版的 Bitwarden Docker,而实备受好评的 bitwarden-rs,占用更低,使用腾讯云的流程搭建的服务会直接获得一个 HTTPS 的链接,不需要其他操作就可以直接使用了,注册之后需要添加一个禁用注册的环境变量。就这么使用了一个月,之间大概算了一下价格,正常一个人使用情况下,一个月五六块的样子,其实一开始都准备接受这个价格一直用下去了,就在前两天突然就崩了,重新部署一直失败,就放弃了。总结一下腾讯云的最大优点就是一键部署,非常省事,可惜就是稳定性太差,他的 GitHub 仓库里也是有很多人反馈说不稳定,还有一个非常影响体验的点,腾讯云的服务器在不使用的时候会休眠,唤醒需要等待一段时间。

在使用的这一个月里,感受到 Bitwarden 使用起来确实非常方便,使用最多的是浏览器插件,对网页的识别要优于 KeePass,填充起来也更舒适,所以腾讯云崩了之后便想着自建了。

自建 bitwarden-rs

因为腾讯云崩了,一开始是想着趁腾讯云服务器的活动还没结束,花个 89 买一年的服务器自己搭建,后来想到自己在 Oracle 上白嫖的终身免费服务器理论上能保持更长的时间,所以准备直接用 Oracle 的服务器试试。之前因为端口的问题,只在服务器上跑了一些小应用,完全没用过网页服务,后来找到了解决方案,这样操作之后还是不能 ping,但是端口已经开放了,可以正常搭建网页服务,就是这么离谱。为了测试端口能否正常搭建,我一开始使用了宝塔面板,后来想想也没啥用,有机会就直接卸载了。

# 首先需要设置安全组
将默认的安全组中的 ICMP 参数改成 8,TCP 协议开放目标端口
# 关闭 Ubuntu 系统内的防火墙
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

下面记录了自建 bitwarden-rs 时的所有操作:

Docker

为了方便,使用的是 Docker compose,将容器的 data 文件夹映射到本地的 bw-data

# docker-compose.yml
version: '3'

services:
  bitwarden:
    image: bitwardenrs/server:latest
    container_name: bitwarden
    restart: always
    volumes:
      - ./bw-data:/data
    env_file:
      - config.env
    ports:
      - "2333:80" #将2333端口映射到镜像80端口
    environment:
      #WEBSOCKET_ENABLED: "true" #开启WebSocket
      SIGNUPS_ALLOWED: "false" #开启注册,自己注册后改成fale
      #WEB_VAULT_ENABLED: "true" #web客户端

Nginx 反代

因为不太会写 Nginx 的配置文件,现在使用的宝塔面板里的 Nginx 反代功能:首先去设置一个子域名解析到服务器 IP,然后在宝塔面板里新建一个空白的网站,直接设置反代即可,因为我用的是 CLoudFlare 的域名托管,所以就没申请 TTL 证书也能使用 HTTPS,如果需要申请证书,宝塔面板生成的空白网站就不太方便了。

宝塔面板有一天是要被卸载的,到时候再更新使用 Docker 部署 Nginx 的内容。

备份

使用自己搭建的服务,定时备份数据库是非常必要的,这里就使用网上找到的一个简单脚本,每周一定时备份到坚果云里。新建一个脚本如下内容,需要自行设定路径与文件夹,去坚果云里新建一个应用密码,在坚果云根目录新建一个 bitwarden 文件夹,使用 crontab 每周一零点定时执行这个脚本 0 0 * * 1 /bin/sh 脚本,并没有设置自动删除过期备份文件的功能,因为坚果云的文件不传输是不消耗流量的,而且一周备份一次的频率也不高,并不会积攒太多的文件,以后文件太多的话手动删除一部分就是了。

#!/bin/sh

set -e

filename="bitwarden-`date +%F`.tar.gz"
cd /root
tar czf "${filename}" bw-data/
curl -u "USERNAME:APP_PASSWD" -T "${filename}" "https://dav.jianguoyun.com/dav/bitwarden/"

rm "${filename}"

使用

电脑上使用的是 Bitwarden 的浏览器插件,桌面端几乎没有打开过,所以依赖桌面端的 Windows Hello 解锁就不能用了,现在设定的是每次锁定电脑时自动锁定数据库,也算是在安全性和便利性之间的一个折中。

手机端使用的是没有官方提供的不依赖谷歌框架的客户端,因为我嫌谷歌框架太耗电就禁用了。依赖于安卓本身支持密码管理器的特性,使用起来没有问题。

总结

经历一番波折,终于将密码管理从 KeePass 转换到 Bitwarden,其中走了不少偷懒的路,比如宝塔面板的 Nginx 反代,比如 CloudFlare 的 HTTPS,以后有机会继续完善。

使用密码管理器一开始确实是麻烦了一些,需要将自己原来的密码一个一个输入进去,简单的密码还需要去原网站修改密码,在这一切都设置好之后,使用起来便得心应手了,无论是安全性还是输密码的便捷性都比自己用脑子记一个密码要好。