MENU

基于宝塔docker部署自建Bitwarden密码管理服务

• May 20, 2020 • Read: 1019 • 主机

前言

  如今,互联网服务越来越多的渗透进生活的方方面面,尤其是今年的这次疫情,更是让以往不熟悉智能手机、除了微信基本不使用其他互联网服务的中老年人不得不去了解、掌握一定的互联网使用技能,而在这个过程中遇到的除了下载以外的另一个比较难解决的门槛就是账户注册和密码设置。以往老人们除了银行账户和微信账户基本没有其他账户,除了银行卡密码也没有什么其他密码,微信登录都是手机号验证码登录,没有形成账户密码体系的概念。因此当需要在一些平台,比如各地的政务平台申请健康码需要注册账号时就遇到了问题,他们不知道怎么起用户名,也不知道密码该怎么设置,用银行卡密码不安全,但另想一个密码极大可能没几天就忘了。而子女帮忙注册如果使用自己常用的账号密码也不安全,此时就需要密码管理服务来设置一套新的账户并记录之,既安全又不会忘记。
  对年轻人也是如此,现在随便使用什么服务都要求你注册一个账号,定外卖、打车、购物、电子邮箱等等不一而足,很多人在不同的网站使用同一套用户名称和密码,觉得既方便又好记。但这中间蕴含了巨大风险,很多网站由于安全机制不完善、员工操作失误甚至被恶意攻击都会造成数据泄露,导致密码外泄。一般造成外泄的网站会很快反应采取安全措施,但不少别有用心者会利用这些信息撞库去尝试登陆其他网站,由于其他网站并没有信息泄露事故,因此它们不会采取措施,而如果你在不同的网站使用同样的名户名和密码,就会被这些人的撞库行为试出你在其他网站的登录信息,可能会造成损失。
  因此,无论对老年人还是年轻人,其实都需要一套密码管理服务,它应该能够自动生成一定强度的密码并能够记录用户在不同网站和平台的登录信息,并可以在用户登录网站时自动填写登录信息,免去人们记忆、输入的过程,这样人们就可以在不同网站设置完全不同的用户名和密码,即便一个网站的数据泄露也并不会威胁到其他网站的信息安全。理想情况下,人们应该只用记得自己在哪些网站注册过账户,而不用记忆确切的用户名和密码等登录信息但依然可以借助密码管理服务自动登录。

产品选择

  如今,提供这种服务的公司和产品有很多,比如Mac&iOS平台上广受好评的1password,Apple自家的钥匙串,Chrome自带的密码管理功能,跨平台的KeePass、EnPass、LastPass,其中有些是开源免费的,配合webdav即可实现云同步,有些需要购买或者订阅使用厂家的云服务实现同步,有些可以通过局域网实现同步而不通过公网云端保证安全性。
  而我既想使用能够通过公网云同步的功能,但又不想使用厂家的云服务,因为一旦你使用的密码厂家的信息遭到泄露,会导致你所有的密码都被泄露,这种情况下相当于你把所有的账号信息全部交给了密码管理服务提供商。此外,1password在Apple平台上做的很好,但Windows版本的客户端很简陋,使用也不方便,订阅费也并不便宜,而KeePass通过webdav同步有人反映有时不流畅。
  此时Bitwarden进入了我的视线,该公司本身提供了服务,用户可以直接使用,就和其他的同类软件一样,但该公司还将它们的产品进行了开源放在了GitHub上,并提供了多种自主部署方式,这既是一种对自家产品安全性的自信,也方便了其他人自行搭建。但官方提供的docker对服务器配置要求比较高,需要2G以上的内存,这种服务器一般价格都不低,自主部署在经济上很不划算。但有人用rust实现了一个第三方版本Bitwarden_rs配置要求低很多,1G内存足以,还能使用一些官方版的收费功能,果断使用之。

部署过程

  总体来说本文的部署方案是基于宝塔docker来进行部署,虽然资源的消耗多一些,但方便快捷,适合新手,而且服务器本身已经安装了宝塔来进行管理。

1.宝塔安装docker管理器

  如果宝塔已安装docker管理器,该步骤可省略。如果未安装,在宝塔面板首页左侧点击软件商店,搜索docker,安装即可,安装完后把 首页显示 的开关打开,方便后续管理。
w0.0.png

2.获取镜像

  打开docker管理器,点击镜像管理--->获取镜像,输入Bitwarden_rs的官方镜像bitwardenrs/server后点击获取镜像。
w0.1.png
w1.png

3.创建容器

  1. 点击容器列表--->创建容器按钮。
  2. 填写端口映射中的容器端口:80(必须是80),服务端口:6666(6666可以自定义)。
  3. 如果使用WebSockets,实现自动同步,那么再增加一组端口映射:容器端口服务端口都填3012。否则可以不添这组映射。配合第10步其他设置一起食用。
  4. 填写目录映射中的服务器目录:/www/wwwroot/xxx(此处目录可自定义,但这里使用网站目录,xxx为将来打算建立的网站域名,使用网站目录也会给后面建网页入口带来些许方便),容器目录:/data(必须是/data)。
  5. 填写内存配额,根据自己服务器情况填写,建议至少填512MB,能填1G以上就填1G以上。
  6. 点击提交按钮创建容器
  7. 点击容器名称修改为bitwardenrs(自己起个名字)方便记忆。

端口映射和目录映射填写完成后一定要点击+号进行添加!!!
端口映射和目录映射填写完成后一定要点击+号进行添加!!!
端口映射和目录映射填写完成后一定要点击+号进行添加!!!

w2.png
w0.png

4.创建站点

  1. 宝塔创建一个网站,网站域名填写之前服务器目录设置中的xxx,FTP、数据库均不创建,PHP版本选择纯静态。
  2. 网站设置SSL,添加证书,强制开启HTTPS。bitwarden要求必须使用HTTPS,这一步不可少。
  3. 添加反向代理,名称随意填,目标URL为http://127.0.0.1:6666,此处端口号6666和上面创建容器时服务器端口保持一致。
    w3.png

w5.png

5.开始使用

  搭建完成后在宝塔安全设置中放行之前设置的服务器端口6666和3012。之后访问网站即可打开web页面进行账号注册进行使用了。此处主密码应该设置一个有足够强度且在别处没有使用过自己能记住的密码,以后只要这个密码不失手,那么其他密码就是安全的,以后我们只需要记住这唯一的一个密码。
823752848793e.png

6.关闭注册

  一般我们自主部署只是为了自己使用或者与家人、朋友等小范围内使用,并不向外提供公众服务,因此当需要使用的人都注册完毕以后我们应该关闭注册功能。

  1. 在docker管理器中点击刚才创建的容器的状态绿色图标,停止容器运行,然后删除容器(删除容器后不会删除数据)。
    w6.png
  2. 在VPS中运行下面的命令重新运行容器,其中bitwardenrs为我们在3.6中给容器起的名字,SIGNUPS_ALLOWED=false代表禁止注册,/www/wwwroot/xxx为上面创建容器时所写的服务器目录,/data为容器目录,6666:80代表上面创建容器时的服务器端口:容器端口
docker run -d --name bitwardenrs \
  --restart unless-stopped \
  -e SIGNUPS_ALLOWED=false \
  -e WEBSOCKET_ENABLED=true \
  -v /www/wwwroot/xxx/:/data/ \
  -p 6666:80 \
  -p 3012:3012 \
  bitwardenrs/server:latest

运行完在容器列表里就又可以重新看到了,然后再去试下创建账号就会出现一个不能创建账号的错误提示。
w7.png
后面如果想重启启用注册功能,只需把上面代码中的false改为true把第6步再来一遍即可。

7.浏览器插件及客户端下载

  去Bitwarden下载:Bitwarden

8.客户端及插件连接自建服务

  打开客户端或者插件,先不要登录,点击左上角的齿轮按钮,在服务器URL一栏中填写自建服务的域名,然后再登录。
b6de0110b315b.png

9.其他设置(试行)

  bitwarden默认是不会自动同步的,不管你是添加或者删除又或是修改了一条记录,都只是先保存在本地,只有当你手动点一下同步时才会进行同步。此时我们可以打开WebSockets notifications功能,这样手机修改后会立刻自动同步到云端,但手机端是接不到其他平台的即时修改信息的,官方就是这样弄的,没办法解决。具体设置为添加反代:
  宝塔打开/www/server/panel/vhost/nginx/proxy/xxx/*.conf这个文件,添加如下信息(3012是默认的WebSocket server端口可以通过变量WEBSOCKET_PORT修改,具体参见wiki。我们可以在终端使用docker ps查看容器端口使用情况):

location /notifications/hub {
    proxy_pass http://127.0.0.1:3012;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location /notifications/hub/negotiate {
    proxy_pass http://127.0.0.1:6666;
}

10.其他配置

  如果只是一般用,到这里就差不多了,但如果要使用组织管理、开启管理员等功能请参见项目wiki:Bitwarden_rs/wiki

其他

  账户密码信息是我们的个人无形资产,我们每个人都有必要保护好它们,一旦泄露,会给我们带来巨大的安全隐患,严重可造成个人信息泄露被人拿去利用、造成经济损失,给我们的生活带来不变。
  为了保证数据安全,我们最好选择靠谱的大型云厂商,小厂商跑路、数据丢失都会给自己带来麻烦。而即便使用大厂商的服务器,我们也应该定期备份,比如有的厂商就提供服务器数据自动备份功能,即便厂家不提供,我们也应该多地手动备份,保证数据安全。而Bitwarden的机制决定了即便其他人拿到了我们的服务器数据,没有主密码他们也得不到其中的信息,因此一定要做好备份,保管好主密码。

更新方法

  2020年5月22日,bitwarden官方终于给server端带来了梦寐以求的回收站功能,bitwarden_rs也在第一时间跟进,仅在两天后就带来了docker镜像更新,得知此消息后果断在第一时间更新了自己的服务器端,这下终于不用怕手抖删错了密码找不回来了,也趁此记录一下更新方法,虽然很简单就是了。另外,bitwarden也在本次更新中启用了新的图标配色,变成和百度贴吧一样的蓝色了,老实说,我觉得很丑,还不如以前的暗蓝色。难道说我的审美真的出问题了?新的贴吧蓝才是公司企业和人民群众喜闻乐见的颜色?

  为了方便阅读,另外单独写了一篇文章记录更新过程:基于 docker 更新 bitwarden

参考文章

https://liubing.me/bt-docker-build-bitwarden.html#L3
https://www.hostloc.com/thread-654984-1-1.html
https://www.laobuluo.com/3172.html
https://www.laobuluo.com/3233.html
https://cloud.tencent.com/developer/article/1606461


自定义专属信息(仅用作自用记录)

Last Modified: July 27, 2021
Leave a Comment

5 Comments
  1. 散逸 散逸

    你好,请问 这样的方式搭建,后期怎样备份自己更换服务器时怎样迁移数据呢?

    1. @散逸这个用的是sqlite数据库,是基于文件的,备份网站目录就好了。如果只想备份数据库,备份网站目录下的sqlite文件就行。恢复的时候把备份的文件放在新服务器网站目录下就OK了。当然还有其他办法,你在网页上把所有数据导出,迁移以后再把数据导入也行。

  2. kkz kkz

    请问,按照教程到了打开web页的时候却提示Welcome to nginx!,是我漏了什么步骤吗?谢谢

  3. 长得帅 长得帅

    “回收站”保留时长没有设置项,一直保留?@(吐舌)

    1. @长得帅没有看到有保留时长的选项,按我的理解和其他密码管理软件的机制来看,除非手动删除回收站里的内容,否则会一直保留。