最近iOS端知名网络软件Surge的作者Liuyachen在Twitter上吐槽1Password,并且表示正在开发新的密码管理软件。说到这个,作为一个网龄十几年的人,当然注册过不知多少的网站。账号一多就容易出现安全问题,尤其是对于大多数人来说,几乎都在使用弱强度的密码并多账户同时使用。之前看过Spirit的密码管理的文章,正好最近一个朋友向我推荐了Bitwarden这个开源的密码管理工具,我在试用一段时间后感觉不错,顺便也来讲讲我的密码管理历史。

我的密码进化史

阶段一 单一简单密码

其实感觉大家都差不多啦,一开始就是很简单的单一密码,无非是自己的个人信息的排列组合,如自己的姓名、生日、家里电话号码的排列组合,有时再加上一些随机数李额,如123等等。我最开始的时候有自己的账号是QQ号吧,用的就是上面的简单排列组合,而且连大小写的区分都没有。当然和Spirit不一样,我很幸运,并没有被人盗过号,而且这种简单密码的使用时间也很短暂。

阶段二 单一复杂密码

小学的时候有很多同学被盗号,我比较幸运没有被盗过,但是前车之鉴后车之师,为了避免我的账号也重蹈覆辙,我决定设计一个复杂的密码。于是基于一些个人信息加上一些随机字母数字排列的一个长达20位的密码诞生了。这个密码我曾经长期使用超过10年,并且曾经用于很多账号,以至于在大多数时间我只要尝试去登录一个我曾经注册过的网站,我就会去用自己的ID和密码去尝试。当然这也是错误的。因为即便是再复杂的密码一旦重复使用也会有较大泄露的风险,因为你永远也不知道网站资深的安全措施做的究竟如何,是否明文存储你的密码,当你所有的账号均使用同一个密码的时候,就会面临被人撞库导致所有账户都暴露在危险下。网上曾经有很多关于设置密码的指南,如腾讯的QQ安全中心推荐过这样一种方法,使用「基础密码 + 网站名称 + 一套密码变化规则」,但是事实上这样做一旦碰到数据库泄露一样会有风险。

阶段三 多个密码分等级使用,并配合两步认证

前几年,月光博客曾经推荐过这样的设置密码的方案,将网站分为大网站、小网站和重要网站并分级设置不同的密码,并启用重要账户的两步认证(主要是TOTP)从而最大程度的降低密码泄露带来的损失。这样的方案我用了很久很久直到上个月,并且我将大部分密码都保存在了Chrome和Apple的iCloud钥匙串中,方便使用。这样的方案主要有几个问题,第一就是TOTP需要专门的密码客户端每次登录都非常麻烦,有时候因为验证码到期还需要重复操作。第二是安全问题,Chrome存储密码是调用Windows API函数CryptProtectData来加密的,该API只允许用于加密密码的Windows用户账户去解密已加密的数据。这意味着,只有用加密时使用的登陆证书,密码才能被恢复。而这根本不是问题,恶意软件通常就是在用户登陆环境下执行的。你可以轻松的从Chrome导入到Firefox中而无需验证你的管理员密码。(当然将数据库拷贝到另外一台电脑上是无法打开的)。当然实际上你存储密码的电脑应该是你可以信任的机器,而不安全的机器上不应当存储你的数据库。实际上在Chrome密码管理器中需要PIN码查看密码。但是这依旧给我一种不踏实感,毕竟离开时忘记锁定电脑,则别人随手打开你的浏览器就可以查看你网页的密码(F12把Password改成text就会看到你的账户和密码)而不需要再次验证任何密码。至于iCloud钥匙串最大的问题就是跨平台表现不好,只能用在Apple的硬件体系上,而我需要使用Windows电脑,可能日后需要使用Android手机等等,因此并不能保证统一的跨平台体验,导入导出数据库也显得十分麻烦。

阶段四 密码管理软件

由于上述方法都存在种种不足,我需要一款可以保证数据安全的同时可以帮助我们管理TOTP以及检测重复密码的工具。当然你们可以选择1Password,Lastpass或者Keepass。在这里我无意比较他们,因为前面几个我都没有使用过,我在这里推荐一下BitWarden,作为一款开源的软件可以很方便的导入导出数据,同时可以帮助生成随机密码,保存TOTP信息等等。这就是我现在的密码保管方法,即将所有网站的密码都修改为随机密码并对可以启用两步认证的账号启用TOTP。需要注意的是,由于手机的易失性和伪基站攻击的不可预防性(关于伪基站攻击),短信验证码是一个并不够安全的功能,只要可以启用TOTP就不要使用短信验证码功能。

Bitwarden

Bitwarden简介

rss

Bitwarden 是一款全新的开源且免费的密码管理器,现代密码学中有一个很重要的柯克霍夫原则(Kerckhoffs's principle):即使密码系统的任何细节已为人悉知,只要密钥 Key 未泄漏,它也应是安全的。在这一密码学原则上诞生了透明式安全(security through transparency),即:即使我的全部加密算法是原理上公开的,只要你不知道密钥,你也无法破解我的密码;而公开的算法则更容易让所有人都参与进行漏洞的寻找以及算法的完善。
Bitwarden除了提供网页版外,还有iOS、Android等多平台的客户端,扩展支持主流浏览器,如 Firefox、Chrome、Opera 等,支持一键登录。Bitwarden 使用常见的AES-256进行本地加密,然后再传输到云端方便同步,使用 PBKDF2 加密主密码,支持两步验证登录,安全方面有第三方白皮书的认证,可以说十分可靠了。并且作为一款开源工具,如果你不信任他的服务器,也可以自行搭建。
官网:https://bitwarden.com/
Github:https://github.com/bitwarden/
下文将提到一个第三方实现的Bitwarden服务端,可以免费使用Bitwarden的全部核心功能(包括TOTP等付费功能)。如果你懒得自建,或者没有合适的服务器进行部署,也可以直接使用Bitwarden官方的服务器,免费版也可以使用大部分功能,如果需要使用TOTP或者上传文件则需要付费,但是价格也相较于1Password等便宜许多,一年10美元。
Bitwarden官方价格

Bitwarden_rs

由于Bitwarden官方提供的自建方案对服务器资源消耗过大,考虑到成本问题,我搭建时使用的是Bitwarden_rs。这个项目是有人用 Rust 实现了的Bitwarden 服务器,并且提供了 Docker 镜像。这个实现更进一步降低了对机器配置的要求,并且 Docker 镜像体积很小,部署非常方便。此外,官方服务器中需要付费订阅的一些功能,在这个实现中是免费的。
下面来讲讲怎么部署Bitwarden_rs。

准备工作

因为我们使用Docker进行部署,因此我们需要准备一台具有Dokcer环境的VPS,当然一台实体服务器也可以,比如家中的群晖等等,群晖部署方式见https://zhuanlan.zhihu.com/p/67797569
关于Docker的部署,我们使用的是Docker CE。Docker官方提供了安装的一键脚本。

curl -sSL https://get.docker.com/ | sh

跑一个hello world确认一下安装正确

sudo docker run hello-world

更多细节可见该指南
安装Docker-Compose

sudo pip install docker-compose

除此之外我们还需要准备一个域名,关于域名如何申请,大家可以到DNSPod,万网或者国外的Godaddy,Namecheap等去申请,具体不再赘述。

Docker部署

我们使用Docker-compose进行部署,Docker-Compose的介绍和详细使用指南可以参考这里.
准备如下的 docker-compose.yml

version: "3"

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

需要注意的项目在注释中均有说明,最近的更新中加入了注册邮箱验证的选项,但是由于我们搭建该平台是为了自用,就不需要使用该选项了。
将该YML文件保存至任意文件夹,通过SSH进入该目录下,并运行

docker-compose up -d

同时为了初始化我们的账户,只需要在一开始将SIGHUP权限打开,注册自己的账户后就将注册权限关闭,并重新运行上述命令即可。
即,

docker-compose down

关闭Bitwarden,并将yml文件中SIGHUPS_ALLOWED选项改为FALSE,重新运行

docker-compose up -d

即可。
同时需要注意的是我们的网站需要配置HTTPS,即准备一个证书。由于我比较懒使用的是Cloudflare提供的证书,而且使用的宝塔面板进行配置的。
操作方法很简单,
1. 在Cloudflare中添加你之前设置好的域名,设置好解析(无论你是用的NS解析还是CNAME解析),打开SSL/TLS选项,将OVERVIEW设置为 Full(strict),然后切换到 Origin Server选项卡,选择 Create Certificate,然后让Cloudflare生成一个private key和CSR,选择你的域名,证书有效期选择15年即可,点击NEXT,Cloudflare就会为你生成一个Key和Certificate,一定要保存好。
cloudflare-SSL
2. 在宝塔面板中添加一个静态网站,并将域名指向前面你准备好的域名。
3. 在SSL设置中导入你在cloudflare上申请的 Origin Certificates 的证书和密钥分别复制到宝塔面板中的指定位置(如图所示),并打开右上角的强制HTTPS。
宝塔面板添加证书
4. 配置反向代理,在静态网站的配置页中找到反向代理,配置如图所示。
反向代理设置
此时基本的设置已经配置好了。如果你没有使用宝塔面板的话,也可以通过NGINX进行配置,具体可见Cloudflare的官网说明

如果你想使用Let's Encrypt的证书的话,可以参考官网的wiki给出的YML文件进行操作。
个人推荐使用Cloudflare对你的网站进行保护,这样可以避免源站IP泄露同时降低被人攻击的风险。

基础设置

打开我们之前设置好的域名,首先先初始化账户,点击创建账户,按要求输入你的电子邮箱地址、姓名、主密码以及主密码提示。需要注意的是,这里的邮箱一定要是绝对可靠设置好安全措施的邮箱,同时主密码一定要高强度且唯一用于你的Bitwarden。该主密码是你的所有密码的安全保障,建议足够长且不要与你的个人信息有关以防止被社工。一定要保证该密码的安全!一定要保证该密码的安全!一定要保证该密码的安全!
Bitwarden网页版

rss

注册完成后即可登录网页版的账户。如果你之前使用的是浏览器保存密码或者是Lastpass,1Password等软件,可以导出后通过工具-导入数据进行导入,否则就只能将自己的账号密码手动输入到Bitwarden内了。我个人是花了整整两天的时间将所有的账户密码都改成了随机密码,Bitwarden也提供了随机密码生成器,因此也比较方便。
Bitwarden

使用体验

Bitwarden在跨平台的配置上非常好,从官网提供的APP来看支持Mac OS,Windows,Linux等桌面平台和Android,iOS等移动平台,我目前使用的是Windows笔记本和iPhone手机,我也尝试了在iPad上的使用体验,其实和iPhone上的体验是一模一样的。我尝试了Windows的客户端,实际上和网页上的功能相差无几,相比之下在电脑上浏览器的拓展会更加实用,因此这部分只分享网页端、电脑端的Chrome拓展以及iOS平台的使用体验了。

网页端

网页端的登陆方式如 基础设置 中所述即可。登录后可以看到整个主界面,主要分为三部分,密码库、工具和设置。
Bitwarden网页端界面
密码库顾名思义就是存储你的密码的地方,通过图片我们可以发现Bitwarden是可以设置TOTP的。严格来讲不光是密码,还有卡片、身份和安全笔记。卡片可以用来保存你的银行卡信息,身份可以用来保存你的个人信息、住址、护照号码等等。点击 添加 即可按步骤保存自己的信息。

rss
rss

工具中提供了前面所说的导入数据与导出数据功能,需要注意导出数据功能导出的是未加密文件,仅用于软件间迁移时临时使用,切不可用于备份。关于备份的问题我们后面再谈。除了这些基础功能外,Bitwarden在网页端还提供了公开密码报告、重复使用的密码报告、弱密码报告、不安全的网站报告、未激活双重身份验证以及数据泄露报告, 我们可以通过这些工具来确认自己密码的安全性。如前文所述,强烈建议大家不要在不同的网站使用相同的密码。这些工具只在网页端提供,这就是为什么前面不建议关闭网页登录选项的原因。
Bitwarden工具
设置中的内容就不多赘述了,值得一提的是Bitwarden的两步登录功能我并没有开启,因为不想在手机上额外安装一个App。
Bitwarden设置
总体来说网页端更像是一个查询器和安全检查的工具,日常使用是用不到网页端的。

Chrome拓展

Bitwarden官网提供了Chrome拓展的安装程序,安装完成后主界面如图所示,和网页端不同,我们首先要点击左上角的设置按钮设置一下服务器URL为前面咱们自己搭建的地址。然后再使用邮箱和密码登录。

rss
rss

整体功能大同小异,当你打开一个你保存过密码的网站时在标签页选项卡会提供该网页下你曾经保存过的账号。如密码库、生成器等都与网页版大同小异。密码生成器可以根据你设定的密码位数,字母大小写、数字、特殊字符来自动生成密码。
设置选项卡下有几个需要调整的设置,默认设置的锁定选项是重启浏览器时,你可以根据自己的情况选择时长。默认情况下你每次重启浏览器都需要重新输入你的主密码才能使用Bitwarden,这就是它比Chrome相对安全的地方之一,防止他人使用你的电脑时可以随意登录你的账号,当然当他人借用你的电脑时,正确的做法是给他提供一个单独的计算机账户进行使用。现在我们打开网页还需要手动打开Bitwarden的拓展界面再点击,显得过于麻烦了。进入选项中,打开Auto-fill功能,即可实现类似于Chrome的自动填充功能,在解除Bitwarden的锁定状态后,打开网页可以看到用户名和密码会自动填充到输入框内。体验还是非常不错的。
rss

目前体验下来比较不好的体验就是,很多网站(可能因为收录较少的原因)你在注册的时候Bitwarden并不能像Chrome一样弹出自动保存的选项,因此推荐在注册之前先在Bitwarden中创建相关信息,再在该网站上注册/登录使用。其他方面暂时没有遇到什么问题,Bitwarden在网页上右键可以看到如下选项,在生成密码时会十分方便。
Chrome右键菜单
值得称道的是,当你绑定了账户的TOTP功能时,在自动填充用户名和密码后,会自动将TOTP的验证码放置于剪贴板中,你只需要直接粘贴即可,这个真的是非常非常实用的功能,大幅度降低了TOTP登录的繁琐程度。

iOS客户端

基础设置和Chrome拓展大同小异,打开手机的App后先在左上角的设置中设置你的Bitwarden网址,然后登录即可。

rss
rss

iOS端的Bitwarden可以提供如iCloud钥匙串一样的使用体验,只需要在设置中做如下两个设置,就会在相关的App和网页中获得和iCloud钥匙串一样的填充体验,即,打开网页或APP后,键盘上侧会弹出你的账户,点击后验证你的Touch ID/Face ID即可自动填充。其他的功能和电脑端的Chrome拓展大同小异,这里就不再赘述了。
rss
rss
rss

autofill
Android端应该也是类似的体验,不过我目前没有Android设备,大家可以参考官网的介绍。

备份

由于是自建服务器,并不需要使用Bitwarden的导出功能,只需要定期备份数据库即可。数据库的地址就在你存放docker-compose.yml的文件夹下的bw-data文件夹内,只需要将整个文件夹定期备份即可,可以使用宝塔自带的备份脚本或者其他备份脚本。如需要迁徙服务器也是一样,将数据库放置于同样的目录下直接重新建立Docker就可继续使用。

总结

Bitwarden实际上并不完美,但是它基本可以满足我的所有需求,最重要的是,自建并不需要付费,1Password虽好,价格实在是不便宜。你甚至可以在家中的电脑实现Bitwarden的部署,然后每天回家的时候再同步密码。毕竟密码数据库还是保存在自己的设备上才是更让人心安的。而关于安全问题,Bitwarden毕竟是开源软件,感觉就是如果有安全漏洞也是实现的问题,而不是作者故意留后门。在这个时代,社工大行其道,大数据分析共享又严重,因此使用更安全的密码方案是迫在眉睫的事情。使用随机密码就需要一款好用的密码管理软件,如果你也在寻找,不妨来试试Bitwarden。

参考资料

Bitwarden官网:https://bitwarden.com/
Bitwarden_rs Github:https://github.com/dani-garcia/bitwarden_rs
Bitwarden_rs wiki:https://github.com/dani-garcia/bitwarden_rs/wiki
Docker——从入门到实践:https://yeasy.gitbooks.io/docker_practice/
免费密码管理器 bitwarden 的实际使用体验如何?——知乎:https://www.zhihu.com/question/58299407/answer/405724439
【群晖】用Docker部署Bitwarden密码仓库 – 第三方镜像:https://zhuanlan.zhihu.com/p/67797569