1 前言

作为一个计算机爱好者,选择统一的密码还是每个软件一个单独的密码,永远是个困境;
一个人要记住太多的密码是不太现实的,保持密码以书面形式又是非常不安全的;
对于数量越来越多的账号密码,一直以来,我都在寻找一个安全、快速、方便的密码长期保存方式;
从手写笔记到手机备忘录,
从txt文档到word文档,
从自己手动备份到onedrive自动同步... 汗.png

现如今比较流行的方式是使用密码管理工具进行密码的统一管理,这类软件一般拥有多平台客户端、浏览器插件等,密码一般加密保存到本地或者云端;

密码管理工具很多,有人说最好的密码管理工具是 1Password,但是他实在是卖的太贵了,暂时不考虑;
再对比各大软件,其实各有特色。有的倾向于将密码库储存到云端,有的可将密码库储存到本地进行自己保存,有的开源,有的是私有化,有的还提供私有化部署 太开心.png
最终我选择使用Bitwarden来搭建私人密码库,比较全的客户端覆盖,提供开源免费版,还提供私有化部署,满足了我对密码库的所有要求;

2 Bitwarden Server

Bitwarden 官方提供私有化部署,有一键部署脚本和手动部署两种方式,不过官方由于使用的是 MSSQL 数据库,整体部署下来对机器配置要求较高

官方推荐服务器配置

2020-11-30T12:45:05.png

只部署一个私人密码库,使用这么重量级的应用是不符合我的习惯的(钱包顶不住) 捂嘴笑.png
经过我的一番查找,终于在Github发现了有dalao使用 Ruby 开发了一个兼容的 Bitwarden 服务器:bitwarden_rs,并且提供了 Docker 镜像部署;
Github传送门:https://github.com/dani-garcia/bitwarden_rs
该服务器端系统配置要求很低,Docker镜像体积也很小,部署非常方便,使用 SQLite 服务器来存储数据,对于个人来说已经足够;
最终就选择使用它来作为我的密码库的服务器端。

3 准备

首先需要你有一个域名,一台安装了Docker环境的服务器;
可参考Docker官方文档:https://docs.docker.com/get-docker/ 来进行Docker的安装
为方便部署和更新,本文使用 docker-compose 来管理服务
在linux下可使用如下命令进行 docker-compose 的安装和更新

sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

如果要进行更新,替换1.27.4为最新的版本号即可。
查看最新版本:https://github.com/docker/compose/releases

4 安装Bitwarden

4.1 创建Bitwarden数据存放目录

mkdir -p /data/bitwarden && cd /data/bitwarden

4.2 创建docker-compose配置文件

cat >> docker-compose.yml <<EOF
version: '3'

services:
  # 服务名称
  bitwarden:
    # 指定使用 Docker Hub 中的最新镜像
    image: bitwardenrs/server:latest
    # 容器名称
    container_name: bitwarden
    # 开机自动启动
    restart: always
    # 指定容器内的 /data 目录挂载到宿主机的当前目录下的 /data/bitwarden/data 目录,这样你可以在宿主机上执行数据库的备份操作
    volumes:
      - /data/docker/bitwarden/data:/data
    # bitwarden配置
    environment:
      # 开启网页访问
      WEB_VAULT_ENABLED: 'true'
      # 开启新用户注册,我们注册后关闭即可
      SIGNUPS_ALLOWED: 'true'
      # 开启长连接
      WEBSOCKET_ENABLED: 'true'
      # 日志文件
      LOG_FILE: /data/bitwarden.log
    # 将容器内的80/3012端口映射到宿主机的7006/7007端口;其中80端口为 HTTP 服务,3012 端口是 websockets 服务
    ports:
      - 7006:80
      - 7007:3012
EOF

4.3 Nginx反向代理配置

#bitwarden
location / {
  proxy_pass http://127.0.0.1:7006;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
}
location /notifications/hub {
  proxy_pass http://127.0.0.1:7007;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
}
location /notifications/hub/negotiate {
  proxy_pass http://127.0.0.1:7006;
}

以上配置为最基础的配置,你还可以加入 HSTS / 压缩 / XSS 防护等配置;
详细配置请参考官方文档:https://github.com/dani-garcia/bitwarden_rs/wiki/Proxy-examples
现在已经是 2020 年,请为域名配置 HTTPS 证书,并将 HTTP 流量阻挡或重定向到 HTTPS,以保障数据传输的安全。

4.4 启动docker服务

docker-compose up -d

4.5 内存占用

可以看到,该服务器端仅仅占用10M内存
2020-11-30T13:07:43.png

5 用户注册和数据导入

启动完成后,我们就可以通过我们配置的域名来访问网页版了
2020-11-30T13:14:30.png

点击创建账号进行账号的注册
2020-11-30T13:15:29.png

注册登录后可在上方的工具中进行数据导入,支持多种格式的数据导入
2020-11-30T13:16:20.png

6 关闭新用户注册

现在你的bitwarden服务器允许任何人访问和注册,如果你只需要自己使用,可以关闭用户注册功能。
调整docker-compose配置文件

SIGNUPS_ALLOWED: 'false'

改动配置后需要运行以下命令来删除并重新创建容器以使配置生效,无需担心你的数据,我们的数据均保存在我们第4.1中创建的目录中

docker-compose down && docker-compose up -d

这样就关闭了用户注册功能,并禁用了 web 的访问。密码数据我们还是可以在客户端中进行编辑的。

7 登录客户端

服务器端安装完毕后,我们需要登录到客户端来进行密码的管理和自动填充,Bitwarden的客户端都大同小异,这里以Chrome扩展为例:
首先我们在登录页面点击小齿轮
2020-11-30T13:22:28.png

然后我们填入我们自己的Bitwarden服务器地址
2020-11-30T13:23:15.png

之后使用我们刚刚注册的账号进行登录即可,其他客户端的配置和这里是一样的。

8 备份

我们在使用过程中的所有数据都保存在我们创建的目录:/data/bitwarden 中
为保证数据安全我们最好定期将该目录的数据进行备份
你可以自己手动备份也可以使用我们的自动备份脚本:WebServerAutoBackup
Github: https://github.com/ehaut/WebServerAutoBackup
配置文件中填写备份目录为:/data/bitwarden
然后在crontab定时任务中添加定时任务,即可每日进行备份到你指定的地方。

#每日凌晨 2:15 备份bitwarden
15 2 * * * cd /root/WebServerAutoBackup && ./backup.sh config-bitwarden.ini > /data/backup/log/bitwarden-cron.log  2>&1 & 1

9 更新

由于使用的是非官方的服务器端,所以作者们会经常同步更新到官方的更新中,以保证与客户端的兼容性
更新也是直接运行如下命令即可

cd /data/bitwarden
//停止运行的bitwarden容器
docker-compose stop
//拉取最新镜像
docker-compose pull
//重新构建并启动
docker-compose up -d --build

10 安全提醒

对于使用任何密码管理工具的人来说,主密码的重要性不言而喻。一旦主密码泄漏,相当于将所有帐号密码拱手相让;一旦主密码丢失,所有数据也都化作随机噪音,变得一文不值。所以,请时常审视、改进你的安全策略,定期对帐号做安全审查,不定期修改并牢记主密码。

Thanks:
本文无耻的 参考了 基本抄袭了JokerQyou的文章:https://blog.mynook.info/post/selfhost-bitwarden/