一直以来,我的密码使用习惯都是用脑子记,所以只能一套简单密码走天下。从最初的qq账号,到如今将近两百个网站的密码,基本都是用的同一密码。究其原因,可能是对网站安全人员的盲目自信,也可能是认为自己的数据价值不高。

即便大厂的数据泄露事件已经屡见不鲜,自己也一直很侥幸没有成为那个受害者,当然也可能已经是个小透明,然而自己却浑然不知。

其实这就像车祸等意外,没发生在自己身上时,俨然是一个抱着侥幸心理的旁观者心态。但谁也不能保证下一个是不是自己,所以只能在自己最大的努力范围下,尽人事听天命。

Bitwarden是一个免费的开源密码管理服务,支持 Windows, macOS 和 Linux 等主流操作系统,浏览器插件也基本涵盖了常用的主流浏览器,同时支持ios和安卓等移动设备。如果不想自建的话,Bitwarden 官方提供了免费的密码托管服务,只是激活一些附加功能需要升级到 $10.00/年 的高级会员。

Bitwarden官网提供了基于Docker的自建教程,不过对服务器配置要求比较高:

  • Processor: x64, 1.4GHz or faster
  • Memory: 2GB of RAM or more
  • Storage: 10GB or more
  • Docker: Engine 1.8+ and Compose 1.17.1+

github上有很多开源的Bitwarden 服务器实现,目前最热门的当属bitwarden_rs. 很大程度上降低了对服务器配置的要求,同时一些官方后台中需要付费使用的功能,比如TOTP认证的自动生成,在这里也可以免费使用。

在服务器安装dockerdocker-compose

参考docker官网的教程安装dockerdocker-compose

使用nginx配置反向代理

假设使用域名xxx.com用来访问Bitwardend的后台管理界面,同时指定127.0.0.1:16857映射到docker中的bitwarden服务。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
server {
    listen 80;
    server_name xxx.com;
    rewrite ^(.*) https://xxx.com$request_uri permanent;
}

server {
    charset utf-8;
    listen 443;
    server_name xxx.com;
        ssl on;
        ssl_certificate /path_to_cer/fullchain.cer;
        ssl_certificate_key /path_to_key/xxx.com.key;

    location / {
	proxy_pass http://127.0.0.1:16857;
	proxy_set_header Host $http_host;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

更新nginx配置:

1
sudo service nginx reload

docker-compose 配置

在用户主目录下新建 bitwarden 文件夹,并在文件夹中新建配置文件docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: '3'

services:
 bitwarden:
  image: bitwardenrs/server
  container_name: bitwarden
  restart: always
  volumes:
      - ./bw-data:/data
  ports:
    - 16857:80
  environment:
    - SIGNUPS_ALLOWED=true

启动服务:

1
docker-compose up -d

客户端

部署完成后,访问后台管理界面xxx.com,注册账号。注册完毕可将docker-compose.yml中的SIGNUPS_ALLOWED设置为false,从而关闭用户注册功能。

安装浏览器插件,以chrome为例,在chrome网上应用店安装Bitwarden - 免费密码管理器插件。

由于是自建环境,在插件登录前,需要更改设置:

自我托管环境>服务器URL中填入bitwarden后台管理网址xxx.com,然后即可在插件中登录注册好的账号。

除了浏览器插件外,还可以在安卓或ios的商店中下载移动端app。

数据备份

对于密码这类重要数据,必须要做好备份,不然数据丢失的后果很严重。虽然很多网站可以找回密码,但假如要找回超过100个网站的密码,可能至少要耗时个1天的时间,而且你并不会记得都在哪些网站有过账号。即便不嫌麻烦,也并不是所有网站都能在网站上自助找回密码,比如各高校的edu邮箱。

数据备份最好遵循3-2-1 原则,这样能最大限度的保证数据安全,所谓的3-2-1 原则,具体是指:

  • 3:保存3份完整文件,其中包括一份原件,加上两份拷贝;
  • 2:备份文件至少要保存在两种不同介质上;
  • 1:一份备份文件保存在异地。

数据原件算一份,也就是说还需要考虑另外两处存放拷贝数据的合适介质。

我的目前方案是,一份存在github私有仓库中,一份存到另一台服务器上。

数据备份至github私有仓库

在github上新建私有仓库bitwarden-backup,并拉取到服务器某一路径下。

新建bitwarden_backup.sh文件:

1
2
3
4
5
6
sqlite3 /home/huangzy/bitwarden/bw-data/db.sqlite3 ".backup '/home/huangzy/backup/bitwarden_backup.sqlite3'"
zip -jP"123123" /home/huangzy/backup/bitwarden-backup/bitwarden_backup.zip /home/huangzy/backup/bitwarden_backup.sqlite3
cd /home/huangzy/backup/bitwarden-backup
git add -A
git commit -m "bitwarden daily backup"
git push -u origin master

并创建Crontab定时任务,每天早晨8点备份:

1
0 8 * * *  bash /home/huangzy/backup/bitwarden_backup.sh

默认db.sqlite3是属于root用户的,其他用户使用sqlite3命令备份时会遇到权限问题。可以更改db.sqlite3的所属,或者让root用户执行定时任务。

数据备份至另一台服务器

可以同样使用定时任务,将数据定期备份至另一台服务器上。

数据恢复

先停止bitwarden服务:

1
docker-compose down

恢复数据:

1
sqlite3 /home/huangzy/bitwarden/bw-data/db.sqlite3 ".restore '/home/huangzy/backup/bitwarden-backup/bitwarden_backup.sqlite3'"