受够了密码数据泄漏事件?用 Bitwarden 做自己的安全负责人
受够了密码数据泄漏事件?用 Bitwarden 做自己的安全负责人
千里之豪从 iPhone12mini 换到小米13已经两个月了,我也基本上适应了安卓手机作为主力机的数字生活了,但有一点是无论如何不能适应的:
安卓手机的密码自动填充,体验真的有够差,也无法生态联动,已经是无法日用的地步。
再加上近两年 Chrome 密码泄漏事件频发,这也同样导致我不得不把谷歌账号里保存的密码自动填充都删掉,好了,密码是删掉了,那我岂不是一夜回到解放前,以后所有网站都要自己手动输入密码了吗?
我咬牙坚持了一个月之后得出一个结论:不太行。
现在的社交媒体网站五花八门,我们的生活也充斥着各式各样的网站和App,如果你从现在开始关闭浏览器的 “ 记住密码 ” ,并把之前保存的密码全部删除,相信我,很多网站的密码到底是什么你可能都已经忘记了,因为网站实在是太多了!
我需要密码管理吗
我相信肯定有一些人是 “一套密码走天下” 派系的,这一派系在当代的各种奇奇怪怪的密码规则要求下,应该也活的很崩溃吧?
密码长度不能低于八位
密码必须包含大小写字母和数字
密码必须含有至少一个特殊字符
密码不能超过14位
密码不能包含用户名信息
123456?不行不行,被朋友嘲笑了一年了说什么也不能用了
密码必须……
图片来源于unsplash
即使当前你的一个密码可以满足要求,但我相信这串密码经过每年的超进化后又会变得混乱不堪。
当然了,你可能跟我一样拥有超群的记忆力(臭不要脸),也能记住自己的所有社交媒体和网站的账号,但在日复一日的密码输入后,你会有种恍如隔世的挫败感:
为什么科技如此发达的今天,我还要这样一遍一遍地重复输入我的密码,我还要痛苦多少次?
密码管理器的选择
那有需求自然有市场,眼下各家科技公司也早已帮我们准备好了应对方案。
苹果 iCloud 钥匙串
在安全上问题上,苹果的生态布局永远领先对手好几年,我长达八年的苹果设备使用经历,也在 iCloud 中留下了非常多的个人使用痕迹。
现在即使给我一个新的 Apple 设备来设置,只要让我登录一下 iCloud 账号,那剩下的 App 基本上都可以用钥匙圈来解决登陆问题,无需再亲力亲为了。
钥匙串,就是一个旦用难回(一旦使用就很难再回到未使用的状态)的功能。
它是如何工作的呢
在你使用苹果设备的过程中,任何时候进行登录行为时,苹果都会贴心地弹出一个小小的提示:密码
在输入任何内容时,键盘上方会出现一个【密码】按钮
你只需点击它,验证一下生物特征(人脸/指纹 识别),就可以选择系统推荐的账号密码信息自动填充待输入处的信息。全程使用优雅且便携。
而且这些信息是全生态同步的(全苹果生态),这也就意味着你只要在任何联网设备上输入一次信息,以后在其它设备上一样可以重复使用这次输入的信息。
使用体验满分。
它的缺点也很明显
你无法在非苹果生态上使用钥匙串,这也就意味着如果你在使用苹果设备的同时,还同样持有 Android、Windows、Linux 等设备的话……
很不幸,一夜回到解放前。
1Password
这家公司正是看到了iCloud的缺陷,所以顺势推出了一款全平台的密码管理器,涵盖 macOS、iOS(和 watchOS)、Windows、Android、Linux 和命令行 等使用场景。
但作为一家商业公司,1Password现在已经推出了订阅制服务,会员的持续订阅也能让公司更长远地走下去。
以上两款密码管理器都有一个共同的我不能容忍的点:他们仍旧在他们的服务器上存储了我的所有账号和密码。
什么是安全?
安全,是把东西牢牢握在自己手上的踏实感。
所以我开始搜寻一款支持自托管的,跨平台的密码管理工具。
在这一过程中,我找到了它——也就是今天的主角:Bitwarden 。
Bitwarden
这是一款开源的密码管理器,同样支持当前所有主流的平台。
个人用户免费,可以通过付费开通高级账户以使用 2FA (二级验证)功能来增强你的密码管理器的安全性。
更重要的是:它支持 Self-Hosting !也就是自己部署和托管 !
当然了,如果你暂时不具备 Self-Hosting 的条件,你也可以选择使用免费的官方服务,只需要注册一个官方账号就好了,使用官方也有一个好处:你不需要关心任何部署和后期维护和升级相关的事情,坐享其成(褒义)就可以了。
所以它其实就是一个免费版本的 1Password,还支持自行部署。
在 NAS 上部署 BitWarden
如果你恰巧跟我一样,希望把数据牢牢抓在自己手上,那你可算来着了。
我会把我部署和使用 Bitwarden 的过程进行介绍。
使用的设备
部署设备:群晖 DS920+
系统版本:DSM7.1.1
Docker 版本:20.10.3
你的准备
你需要至少拥有以下条件或环境
部署环境:云服务器或自建服务器,也可以用群晖、威联通等自带 Docker 环境的 NAS 设备代替,你甚至可以用树莓派,但你需要保证它里边的数据长久稳定
外网服务:你的部署环境需要具备外网环境,可以是你家庭或购买服务器自带的公网 IP,如果没有公网IP,你的使用体验将非常受限
动手能力:你需要基础的 Linux 操作能力,以应对接下来的一系列操作
测试设备:主力手机一台,可以是 iOS 或者安卓操作系统,主力工作电脑一台,如无需求请忽略
在 Docker 中安装
注意:一下全部流程需要使用管理员账号操作。
下载并安装 Docker
在群晖的【套件中心】找到 Docker 软件,点击安装
下载Docker
在 Docker 中下载镜像
打开 Docker,
左侧,点击【注册表】
在右侧右上角输入框输入:vaultwarden,回车搜索(官方镜像更名为 vaultwarden,所以不要输入错了)
在列出的镜像中选择名称为:vaultwarden/server,单击当前行即可
选中当前行后,点击对话框最上方的【下载】按钮
在弹出的版本选择中,点开下拉框选择最新版,注意:latest 不一定是最新版!
本文撰写时,已有新版本1.28.1推出,所以这里一定不要选 latest,请选择高于1.28.1的版本。
下载镜像
点击选择,等待 Docker 下载镜像
使用镜像创建容器并运行
若这是你第一次使用docker,我建议你在群晖的共享文件夹中创建一个单独的文件给docker,步骤为:
点击 NAS 主菜单
点击 控制面板
点击 共享文件夹
点击 新增
名称输入:docker,所在位置建议选择主存储池
下一步,直到应用
当你已经有一个docker文件夹作为共享文件夹时,可以继续往下操作。
打开 FileStation,在 docker 文件夹中新建一个子文件夹:Bitwarden
打开 Docker 应用,点击左侧容器,然后点击新增
在弹出的窗口中选择我们刚刚下载好的镜像,点击下一步
在弹出的窗口中确认已勾选“使用已选择的网络”,bridge,确认后,点击下一步
在弹出的窗口中继续点击下一步
在端口设置处的80端口的左侧填18080(如果你知道这里意味着什么,那你可以随便填,比如28080、9090、18580,如果你不懂这个含义是什么,那就填18080)3012可以留空,不用填,继续下一步
在存储空间设置中点击新建文件夹,在弹出的窗口中选择我们刚刚创建的 docker/bitwarden 文件夹,在右侧装在路径填:/data,点击下一步
点击创建容器
为什么需要在端口处设置端口转发和文件夹映射?
Docker 是一个虚拟机容器,我们创建的容器的运行环境跟 NAS 本机的运行环境完全隔离,所以容器中的服务通过端口提供的服务需要使用一个端口映射出来我们才能进行访问,如果这里不填,Docker 会自动随机一个当前系统尚未使用的端口,这对我们后期对端口服务进行二次转发是较为麻烦的,所以在此处进行指定;
因为 Docker 创建的每一个容器的环境都相互隔离,所以当容器删除之后,容器中的数据也就随之消失了,而我们每次升级或调整容器时都会有可能重新创建这个容器,为了保证容器中的数据不会丢失,在这里通过文件夹映射的功能把容器中的数据映射到我们外部文件夹,这样即使容器删除了,我们的数据依旧得以保留,下次重新创建容器的时候重新关联一下文件即可。
选择你刚刚下载的镜像文件
设置端口映射
设置文件夹映射
点击完成
至此,你就拥有一个属于你自己的密码管理服务了,你的所有密码都将保存到这里,除了你,谁都无法看到你保存的密码是什么,非常安全。
但先别高兴太早,NAS 作为一个局域网设备,他现在只能发挥非常有限的作用,我们需要进一步完善它的网络连接来实现一个完全体的 Bitwarden。
如果你仅仅只想体验一下这个服务,也可以先在内网环境下使用,打开浏览器,输入http://把这里替换成你的 NAS 的内网 IP 地址:18080,进行简单设置后,就可以跳转到【实际使用体验】
在此之前,我需要向完全没有网络基础的同学介绍一下为什么需要这一步,已经掌握这部分知识的可以直接跳转下一章。
公网和私网的关系
简单来讲,我们当前的互联网网络环境分为两大部分:内网和外网。外网为我们提供互联网服务,内网用来接入外网,然后使用外网的互联网服务。
听起来好像有点儿生涩,但这就意味着:如果你想要使用某个互联网服务,那你必须要与这个服务处于同一个网络环境中。大概有以下三种情况
一般意义上的互联网服务在外网可以访问,正常情况下,你在内网,那如果你要访问外网,就需要从内网转换到外网,我们平时用的4G蜂窝网,WiFi 等帮你实现了这个功能;
当互联网服务在外网,你也在外网(一般情况下,当你使用4G蜂窝网络时,会被供应商临时分配到外网环境下),那也是可以直接访问的;
当互联网服务在内网,你也在内网时(很多电脑手机互传的服务就是基于这一环境),那是可以直接访问的;
如果你手持使用设备在外网,而互联网服务在内网;或者说你在一个内网,互联网服务在另外一个内网;那你就无法访问到内网中的互联网服务了
一般互联网服务:抖音、微博、微信、QQ、百度,这些互联网公司都在公网部署有自己的互联网服务,也是因为这些互联网服务的部署,你手中的 App 才能正常地运行和使用。
我们刚刚部署的 Bitwarden 就是第四种情况。
对你来说,是找一颗星星容易,还是找沙漠中的一颗砂砾容易呢(图片来自 unsplash)
我相信你还是可能不理解,那我们把当前的公网比作星空,互联网服务比作星空中的星星,把你自己比作沙漠中的砂砾(个人上网用户繁多)
你去星空中找某一颗星星,只需要抬头,寻找星星的参照物(例如把北斗七星作为参照),然后找到它即可。
但如果你是一颗星星,如何找到地球上某个沙漠中的一个特定的砂砾呢?这几乎不可能。
我们刚刚在 Docker 中部署的那个镜像,就为我们提供了互联网服务,如果你把 NAS 放置在家中,那当你在家时,就相当于沙漠中的两个挨着的砂砾,很容易就找到对方了。但若你出门了(去星空里了),再让你找那颗特定的砂砾,就没那么容易了。同样的,假如你去了别人家,连入了别人的 WiFi(进入到了另一个沙漠),那你也无法找到最开始跟你相邻的那个砂砾了。
这个时候,如果我们可以从砂砾上牵一根线,绑到某一个星星上,这样当我们需要找到特定的砂砾的时候,只需要找到某颗星星,然后顺着星星上绑着的线,就可以找到我们想要的那颗砂砾了。
接下来,我将会简单介绍一下你应该如何绑这根线(Frp)。
设置外网访问
你有两种方式设置外网访问
通过购买云服务器获取固定公网 IP 地址,然后通过 Frp 穿透到自己的 NAS (租一颗天上的星星,牵线到自己 NAS)
通过自己的宽带账号获取静态或动态公网 IP 地址,然后在路由器上做端口映射 (搞一颗星星放自己家)
搞一颗星星放自己家!?听起来很酷炫不是嘛~
相比较而言,第二种方式也确实是更加简单直接,也相比较省成本的方案。但它有一个致命的问题:能不能拿到公网IP地址,你说了不算,得你所在的宽带公司说了算,而大部分时间里,宽带公司都不会给你这个 IP ……(至少我没有)
所以很多需要公网IP的同学仍旧选择了第一种方案:购置云服务器。
如有需要,请打开搜索引擎搜索:群晖 docker frp,此处不再赘述。
另外,为了后期运维方便,我非常建议你使用域名而不是公网IP来使用自己的服务,请自行搜索域名购买,不再赘述。
域名有很多显而易见的好处:
减少你不需要修改(一旦更换云服务器,所有使用 Bitwarden 服务的地方都要重新修改服务地址)
更好记,就像少数派网站:sspai.com 跟 119.23.141.248 ,你觉得哪个更好记呢?
如果你坚持到了这一步,那恭喜你!!!
你已经成功了一半了。
为什么这么说?
因为为了我们服务在公网上的绝对安全,你还需要为这个服务设置 Https 加密。
tips:你需要先为自己的域名(或固定公网IP地址)申请 ssl 证书,群晖 NAS 有非常方便的证书导入功能,申请好的证书可以通过以下方式导入
打开控制面板 -> 安全性 -> 证书 -> 新增
导入你的ssl证书
将 http 转换成 https
简单理解的话,http 情况下,你在外网访问到家里的 NAS 的密码保管服务时,互联网世界的黑客就有机会将 http 劫持并查看传输内容,也就是说,你的密码又变的不安全了!
这时候我们就需要 Https 协议,有了它,每次传输的内容都是加密的,黑客是劫持不了的,同时传输内容也是加密的,他们(黑客)即使用手段找到了你传输的信息,也看不明白传输的内容是什么。
正所谓行百里者半九十,这一步非常重要,如果 https 协议没有设置就用的话,那我们前边所有的努力就都白费了。
假设你通过 frp 内网穿透到 NAS 的端口是9999 (云服务器上端口随便,NAS上的端口是9999)
此时9999的协议仍是http,请继续操作:
打开控制面板 -> 登录门户 -> 高级 -> 反向代理服务器
点击新增,名称随便填,为了好记可以写:bitwarden,
来源:协议选 https,主机名称填写你的域名,端口填9999,勾选【启用 HSTS】
目的地:协议 http,主机名:127.0.0.1,端口:18080(参考上方部署时所设置的 Bitwarden 端口号)
点击确定
打开控制面板 -> 安全性 -> 证书 -> 设置
找到服务中所有包含你域名或者公网 IP 的服务,将右侧证书修改为你自己的域名或公网 IP 证书,点击确定
设置反向代理,将http链接升级为更安全的Https
为你的反向代理域名设置证书
如果一切正常的话,现在你就可以访问https://你的域名:9999来真正设置你最开始部署的 Bitwarden 了。
恭喜你 🎉🎉🎉 ,You made it !
实际使用体验
以下就是非常舒适的使用体验了,不涉及任何部署相关的流程了,请放心食用。
PC端浏览器体验
第一次打开该网址时,会让你设置登陆账号跟密码,正常输入即可,输入后你就可以正常使用了。
网页端设置界面
第一次登陆某个网站的时候,因为你密码库是空的,所以它仍需要你手动输入账号跟密码,但当你输入一次后,Bitwarden 会检测当前的表单值,并提示你是否要将当前的账号和密码保存到密码库
输入正确了再保存~
也就是说它会根据你的使用时间不断进化,到后期越来越强大。
登录时,双击 Bitwarden 的推荐项目,密码就会自动填充到网页
当然,如果你希望提前在密码库把自己还记得的密码都填进去,下次在登录网站的时候直接用,也是可以的。
新增一个账号和密码项
iPhone 体验
第一次在手机上使用 Bitwarden 时需要进行初始化设置,步骤如下:
打开软件,在登录界面点击右上角齿轮按钮
在设置界面修改服务器 URL 为你自己刚刚映射的 Https 地址,点击保存(如果你打算用官方的服务,此处可以不用管)
回到登录界面登陆,账号是你第一次设置 Bitwarden 时输入的账号和密码
登录成功后,你的密码库可能是空,也可能已经同步了你在网页端添加的密码库
打开手机设置,找到【密码】选项,并在二级菜单中选择【密码选项】
打开自动填充密码,并将 Bitwarden 勾选上
在任何网页或者 App 的输入过程中,点击【密码】按钮,在弹出的应用中选择 Bitwarden 填充
iPhone设置步骤参考
至此,你就可以完全使用自己托管的密码库服务啦。
tips:在iOS上,Bitwarden 需要使用通知推送功能来自动后台同步你的密码数据,你需要打开 Bitwarden 的推送功能才能保证 App 在后台的密码同步,如果关闭后,Bitwarden 只能在你每次打开 App 的时候才能触发同步,体验不佳,所以强烈建议你开启通知推送功能,这只是 iOS 的同步策略需要,不会给你的手机推送奇奇怪怪的东西。
Android体验
安卓手机相比较 iOS,缺少了钥匙串这个功能,但你仍旧可以在辅助功能里开启自动填充。
我使用的安卓手机是小米13,自动填充服务在:更多设置 -> 语言与输入法 -> 自动填充服务
为了保证 App 在后台自动同步而不是每次使用都要打开App手动同步,你也要在安卓手机上设置 App 的省电策略为【无限制】。
App 使用体验
友情提示:有些 App 的登录界面不是标准的表单结构,所以不一定会触发 Bitwarden 的自动填充,可以先尝试输入密码,这个时候 Bitwarden 可能会因为检测到密码输入框而自动弹出。
Bitwarden 实际上还支持命令行和 Linux 系统的自动填充,但考虑到用户的动手能力,我相信使用命令行和Linux的用户应该不需要我介绍了吧,哈哈哈哈。
附言
事实上,我写到这里之后开始扪心自问:我真的有必要做到这一步吗?就像个正常人一样用官方的服务不好吗?
不好。
这种可以把自己的安全牢牢掌握在自己手上的快感,会上瘾。
做少数派中的少数派,更上瘾。