群晖 Docker系列 搭建密码管理应用bitwarden

这篇文章是 openwrt 系列 15 篇文章中的第 12 篇

关键词:群晖玩法、群晖Dokcer、Bitwarden

原来的bitwarden镜像已经更名为Vaultwarden,也就是本文即将安装的应用。旧的bitwarden镜像还可以用,只是不再更新和维护了。所以它并不是bitwarden的官方镜像。虽然不是bitwarden官方的镜像,但Github上15.6k的Star也让我感觉它的安全性还是有保障的,毕竟其中应该有不少大佬会把关。这个项目还有一个netDada的赞助商!有钱支持的话,软件的维护工作应该会比较顺利。2022年9月6号,开源密码管理器 Bitwarden 宣布完成 1 亿美元融资,PSG 领投、Battery Ventures 参投,似乎有向加密领域发展,感觉势头不错。不管怎样,我已经决定使用它了!

值得一提的是,bitwarden只能在https下使用。这毕竟是一个密码管理工具嘛,怎么能在http下运行!

另外,如果你在意的话,可以选择在自己的NAS而不是VPS上托管bitwarden。不过经过Linux基础 个人VPS安全的相关设置,我们的个人VPS其实也蛮安全了。况且密码的调用是需要主密码的,别人就算获得了你的原始文件,没有主密码还是无法查看。况且,bitwarden还有许多安全措施,比如登陆邮件提醒,甚至是二次验证。总之就是非常安全了!

下面看看怎么安装它吧

配置yml文件

不了解docker的小伙伴请先看:《Docker系列 配置Docker全局环境》;《Docker系列 了解Docker Compose的配置文件》。

我们使用root的权限来运行脚本。如果你用了非root用户,加sudo即可。

修改文件$work/docker-compose.yml的内容如下,参考:Raspberry Pi Home Server Episode 8: BitWardenRS – Password Manager with Remote Access

这种安装方式,bitwarden的注册是邀请制,并不能随意注册。这样感觉更加的安全!

version: "2"

services:
  app:
    image: vaultwarden/server:latest
    environment:
      - SERVER_ADMIN_EMAIL=<[email protected]> # 按需修改
      - SIGNUPS_ALLOWED=false
      - INVITATIONS_ALLOWED=true
      - WEBSOCKET_ENABLED=true
      - ADMIN_TOKEN=<token> # 按需修改
    volumes:
      - ./app:/data/
    ports:
      - 3667:80 # 按需修改
    restart: unless-stopped
    networks:
      - default

networks:
  default:
    name: bitwarden

上线服务:

docker-compose up -d

经过我的测试,如果你外挂了/data/这个文件夹,你是完全可以恢复bitwarden的数据的。你们自己也可以试一下。或者有大佬测试过也可以和我反馈,看是不是可以完全恢复。

另外,我们还可以给/data/文件夹添加root的保护。像这样:

# 将文件夹改为root所有
sudo chown -R root:root $work/app

# 设置只有root用户可以使用。其它用户甚至连看都不行
sudo chmod -R 700 $work/app # 600应该也可以

这样,就可以保证一定的安全。

此外,我在实际使用的时候,我会将docker-compose.yml的内容放在其它隐秘之处,然后运行完docker-compose up -d后就删除docker-compose.yml。这样可以最大限度地保护ADMIN_TOKEN不被窃取。但不推荐大家用(主要是怕你们把内容搞丢了)。

项目运行

在container manager中,运行上述yam。

image-20240429032925830
image-20240429032955107

设置反向代理

  1. 进入群晖的 「控制面板」-「Synology 应用程序门户」-「反向代理服务器」 页面,如图添加一条 「反向代理服务器规则」。(「来源端口」 你自己定义,这里假如为 28080;「目的地端口」 对应上面配置容器参数步骤中设置的本地端口 8080)

image-20240429033137172

我是将黑群晖宿主机挂在Openwrt路由下,而Openwrt路由使用了lucky插件做的动态域名解析与ssl配置。所以在lucky中将此域名转发到公网,实现了外网访问

  1. 进入群晖的 「控制面板」-「安全性-「证书」 页面,将你的域名证书文件和私钥文件导入群晖中。

image-20240429033518188

将Lucky配置的泛域名文件 .pem和.crt,导入到群晖中

  1. 使用 ssl工具 生成中间证书文件,导入到手机(否则会报错)

image-20240429033744963

基本设置完成

主要页面

进入服务端后,界面大致是这样的:

image-20220421173635826
image-20220421173651669
image-20220421173709288
image-20220421173746814
image-20220422090221865

客户端使用

初始化设置

使用时一般用Chrom浏览器插件或者Apple APP的方式使用,而不是用服务器端。

说实话,按bitwarden的默认设置,这个软件是比较难用的。所以要改一些设置。

这里给出我的基本设置:

image-20220421173534661

设置从不就是你使用的时候可以不用经常输入主密码解锁。好像也有1小时之类的选项,不过你退出浏览器后就不生效了。反正个人电脑和手机一般只有自己用嘛!如果你有一段时间不用电脑,并且其它人可能会用到你的帐户,你可以设置更加严格的超时规则。

另外一个比较重要的,就是在其它--选项中,要设置主机的URI匹配检测而不是默认的基础域。不然,像192.168.1.111:1234192.168.1.111:1235这两个地址会被认为是同一个。但实际上,它们通常对应不同的应用。刚刚开始用的时候,着实困扰了一小阵子!

至于两步验证,给大家看一下bitwarden的提示:

启用两步登录可能会将您永久锁定在 Bitwarden 帐户之外。如果您无法使用常规的两步登录提供程序(例如您丢失了设备),则可以使用恢复代码访问您的帐户。如果您失去对您帐户的访问,Bitwarden 支持也无法帮助您。我们建议您记下或打印恢复代码,并将其妥善保管。

其实两步验证+恢复代码也是一个不错的方案!支持的服务有:

image-20220422085815642

不过我觉得也不用搞得这么复杂,简单点就行!实际上,对个人用户而言,定期改密码使用强密码对于大多数情况而言已经足够安全了。

选用Chrome

Microsoft Edge浏览器也不错,可以直接使用Chrome插件。

这里对于Chrome我要多说一些。其实国内很多浏览器,比如360安全浏览器,都是基于chrome的内核。我个人觉得,如果你有一个google帐户的话,使用chrome浏览器是最佳的选择。我们来看一下最新的https://gs.statcounter.com/的数据:

image-20220422081358618

记得选软件的有一个简单而有效的标准是什么吗?就是群众的眼睛是雪亮的。这时你知道要使用什么浏览器了吧!而且我个人使用而言,Chrome的使用体验也是最好的,特别是它的插件拓展。

这里我只演示chrome怎么操作,其它浏览器自己可以摸索一下!

导入Chrome密码

在使用bitwarden之前,相信很多小伙伴和我一样,都是用chrome之类的浏览器来管理自己的密码(这种情况下,一般你已经有一个Google帐户)。现在有了bitwarden,我们就不需要它们啦!下面我就以chrome为例讲一下如何进行密码的迁移。

打开chrome://settings/passwords,界面如下图。我们可以将提示保存密码自动登录都关闭了:

image-20220422075815476

在这个界面,可以导出密码:

image-20220422080536350

或者你也可以访问:https://passwords.google.com/options?ep=1。界面如下。我们可以导出密码。随后输入帐号密码验证后,会下载一个Google Passwords.csv的文件:

image-20220422080059735

我们可以用WPS之类的工具打开Google Passwords.csv文件看一下它都有些啥:

image-20220422080345389

所以你的帐户和密码信息是以明文的方式保存在Google Passwords.csv!所以用完之后一定要彻底删除Google Passwords.csv这个文件喔!

密码导入bitwarden

打开工具--导入数据。你自己看图吧,不懂的评论留言:

image-20220422081732427

导入完成后,我还建议大家去公开密码报告里了解一下自己的帐户密码的泄露情况。已泄露密码是在已知的数据泄露中被发现的密码,这些数据已由黑客公开发布或在暗网上销售。我这里截取一下我自己的某些网站的泄露情况:

image-20220422082403872

我估计大家的情况也是大同小异,哈哈!那些密码越弱的,泄露的次数就越多呢!我觉得在上述网站,如果没有二次验证机制(就是登陆还需要手机验证码)的保护,并且有心人要攻击你,你的帐户基本上已经没有任何安全性可言。大家有什么想法,欢迎评论留言!或者也可以秀一下自己以前的泄露次数。

所以,记得要按需修改密码喔!可以先改一些重要的、关键的、常用的网站的密码,比如google、百度、网盘之类的。其它的不太重要的以后看情况再慢慢地改。慢慢地过渡嘛!

标签页

一般情况下,如果你在bitwarden里保存了一个帐户和密码,访问对应的网站时,bitwarden插件会显示一个数字,像这样:

image-20220422075447595

在标签页中,有一个东西值得一说,就是左上角的符号:

image-20220422085934193

点一下它,它可以打开一个bitwarden专属的小窗口。如果你要编辑一个帐户信息,这个方法会比较方便。不然,它就只能填充而不能修改帐户信息。我也是过了好久才发现这个用法( ̄△ ̄;)

建议通过bitwarden的密码生成器生成新的强密码。这个真的好用!而且它是在你自己的网络里,我觉得应该比在线的密码生成器要安全一些。

image-20220422101103176

假设你现在改好了一个密码,按一下这个标志就可以检查它有没有被泄露过。如图:

image-20220422090539959

还有一个小功能,我觉得也挺有用的,就是安全笔记

image-20220422091220687

可以用来记录一些token之类的非登陆用信息。

还有文件夹功能对密码分类。我觉得是蛮好用的功能了!

其它使用细节,有疑问的评论留言吧!欢迎交流了!

删除chrome保存的密码

建议非常熟悉bitwarden的用法后再去删除原来托管在chrome上的密码。我当时是一开始用bitwarden就已经删除了chrome的密码。不然很容易造成冲突。

做法如下:

  • 打开谷歌浏览器,访问:chrome://settings/clearBrowserData 。 这将打开一个弹出窗口,可让您清除浏览数据。
  • 确保将时间范围设置为“ 时间不限” 。这样才可以删除全部的密码喔!
  • 单击“ 密码”旁边的复选框,以及要删除的所有其他数据。
  • 单击清除数据以删除所有密码和所选数据。

image-20220422100520979

防止Google Chrome浏览器提示保存密码

  • 打开谷歌浏览器,网址框输入:chrome://settings/passwords
  • 单击窗口右上角的三点菜单。
  • 取消提示保存密码检查密码

image-20220422100437795

注意事项

如果你曾经为bitwarden更换域名,记得去后台更新URL为新域名,否则bitwardent保存的附件将无法正常下载

image-20240429035118881

疑难解答

PC 客户端登录提示 Failed to fetch 错误

我遇到的是由于系统代理设置错误引起:Web 端登录、Chrome 扩展、苹果和安卓客户端使用一切正常,但 PC 客户端登录(以及注册)时提示 Failed to fetch,试过删除账户、重新启动容器、容器操作中使用 「清除」、重装 app 等,都不能解决。

网上找到的只有一篇英文文章 "Failed to fetch" errors on desktop app,然而并没有解决问题。

当时的解决方法:查看群晖及容器都没有相关的日志记录,猜测是没有和服务端建立连接,最后测试发现和 Windows 系统代理设置有关。打开 「Windows 设置-网络和 Internet-代理」,关闭使用设置脚本即可。

安卓客户端登录时提示 「发生错误 There is a problem connecting to the server」

目前还不清楚安卓客户端出现这个错误的具体原因。

我遇到的是 Web 端登录、Chrome 扩展、PC 和苹果客户端等使用一切正常,仅安卓客户端登录提示此错误。

当时的解决方法:经过无数测试和搜索参考,最后将 docker/bitwarden/ssl 中的证书文件 cert.pem 命名为 fullchain.pem 后解决

具体参考 bitwarden_rs wikiEnabling HTTPS 中的这段文字:

Due to what is likely a certificate validation bug in Android, you need to make sure that your certificate includes the full chain of trust. In the case of certbot, this means using fullchain.pem instead of cert.pem.

安卓客户端登陆提示 「发生错误。Exception message:java.security.cert.CertPathValidatorException:Trust anchor for certification path not found.」

这个错误是因为 Bitwarden 的证书文件中缺少中间证书导致安卓系统的证书校验异常(虽然不影响其他平台)。

检查你的证书链是否完整:https://www.digicert.com/help/(支持带端口检测

解决方法有两种

  • Bitwarden 服务端使用带中间证书的证书文件
  • 或者单独将你域名的中间证书安装到安卓手机中(参考链接

安卓手机安装中间证书的方法

以我的三星 S8 手机为例。将文件名包含 root 字符的 crt 证书文件传到手机中,「设置」 里找到 「生物识别和安全性」-「其他安全设置」-「从设备存储空间安装」,选择刚才上传到手机中的证书,自定义一个证书名,「使用于」 选择 「VPN and apps」。

iOS 客户端可以登录,但同步的时候提示 「无法同步」

这个一般是因为连接不稳定或速度慢导致,多试几次就可以了

错误信息收集及整理

测试并整理了一下各客户端在某些条件下出现的错误信息,以方便出错时定位故障:

不启用 SSL 并使用 http URL(或 IP):

  • Chrome:「发生错误。Cannot read property 'importKey' of null」
  • Microsoft EDGE:正常
  • Firefox:正常
  • Chrome 扩展:正常
  • PC 客户端:正常
  • 安卓客户端:正常
  • iOS 客户端:「发生错误。There is a problem connecting to the server」

不启用 SSL 并使用 https URL:

  • Chrome:「无法访问此网站。ERR_CONNECTION_CLOSED」
  • Microsoft EDGE:「无法安全地连接到此页面」
  • Firefox:「建立安全连接失败」
  • Chrome 扩展:「发生错误。Failed to fetch」
  • PC 客户端:「发生错误。Failed to fetch」
  • 安卓客户端:「发生错误。Exception message:Connection closed by peer」
  • iOS 客户端:「发生错误。There is a problem connecting to the server」

启用 SSL 并使用 http URL:

  • Chrome:「该网页无法正常运作。ERR_EMPTY_RESPONSE」
  • Microsoft EDGE:正常
  • Firefox:「呃…找不到此网站。」
  • Chrome 扩展:「发生错误。Failed to fetch」
  • PC 客户端:「发生错误。Failed to fetch」
  • 安卓客户端:「发生错误。Exception message:unexpected end of stream om com.android.okhttp.Address@8b73cc45」
  • iOS 客户端:「发生错误。There is a problem connecting to the server」

启用 SSL 并使用 https URL 但证书不匹配:

  • Chrome:正常
  • Microsoft EDGE:正常
  • Firefox:正常
  • Chrome 扩展:「发生错误。Failed to fetch」
  • PC 客户端:「发生错误。Failed to fetch」
  • 安卓客户端:「发生错误。Exception message:Hostnamexx.com not verified:certificate...」
  • iOS 客户端:「发生错误。There is a problem connecting to the server」

容器停止或填写了错误的环境 URL 或网络不通:

  • Chrome:「无法访问此网站。ERR_CONNECTION_TIMED_OUT」
  • Microsoft EDGE:「嗯... 无法访问此页面」
  • Firefox:连接超时
  • Chrome 扩展:「发生错误。Failed to fetch」 或 「发生意外错误」 或 「同步失败」
  • PC 客户端:「发生错误。Failed to fetch」 或 「发生意外错误」 或 「同步失败」
  • 安卓客户端:「发生错误。Exception message:Connection closed by peer」 或 「发生错误」 或 「同步失败」
  • iOS 客户端:「发生错误。There is a problem connecting to the server」

其他

备份密码库数据

强烈建议你在做重大操作(如更新 Bitwarden 容器)前先备份你的密码库!!

备份方法有两种:

  1. 客户端程序或网页端里 「导出密码库」(注意:导出操作无法备份文件附件
  2. 备份整个 data 文件夹(这里建议使用群晖中 Hyper Backup 套件来自动增量备份到坚果云)

20200219 我在未备份密码库的情况下做了更新 Bitwarden 容器的操作,然后所有客户端都无法同步了,即使删除 Bitwarden 容器后重新配置也无法解决。幸好 PC 客户端未退出登录,导出密码库再重新导入后才找回了所有密码。

20200402 又遇到同样的故障。

小结

总之,有了bitwarden,从此密码管理不用愁了!是不是有一种发现新大陆的感觉,哈哈!

bitwarden的安装是比较简单的。难就难在,我们要如何切实地了解、使用和维护。大家需要非常熟悉它的使用。真的,花几个小时甚至是1天时间去了解,我也不觉得浪费。毕竟,bitwarden保存的是你最秘密的东西——你所有的互联网帐户和密码

系列目录<< 群晖 Docker系列 搭建QBitttorrent黑群晖NAS 基本安全加固 >>