【Docker系列】Bitwarden密码管理器

前言

bitwarden是一个密码管理器,到2022/11/24号,bitwarden项目在这之前已经转成了vaultwarden了,市场上也有不少的密码管理器,bitwarden也是口碑最好的那几款之一,开源免费,也有付费版本,有付费的版本可以保证项目的持续性,对项目的经济上还是非常重要的。

我们平常在浏览器上登录某些网站时,在登录成功时,浏览器会有个小窗口问你是否要保存密码,bitwarden也是类似这种功能,只是bitwarden的功能更加强大和安全,bitwarden还支持随机输出强、弱密码,可以根据自己的需求设计密码类型,同时,bitwarden是存储在自己的服务器的,使用SSL加密,安全性远比浏览器帮你存储的高,基本上完全可控,或者你也可以使用本地的局域网配置你的bitwarden,这样不联网更加安全,前提是你有自己的局域网😃。

使用Docker部署vaultwarden

我的安装环境:Ubuntu20.04

内核版本:5.4.0-100-generic

Docker版本:Docker version 20.10.18, build b40c2f6

docker-compose版本:docker-compose version 1.25.0, build 0a186604

在使用Docker部署前,你应该具备以下条件:

  1. 服务器已安装Docker、docker-compose、Nginx
  2. 已经有一个域名,可以是子域名,后面需要申请SSL证书

如果你还没安装以上环境,你可以查看我的另一篇文章:

安装Docker、docker-compose:https://blog.hikki.site/2802e5c6.html#Ubuntu18.04安装Docker-CE社区版

安装Nginx:https://blog.hikki.site/111f4f09.html#Linux解压编译安装Nginx

生成随机token

1
openssl rand -base64 48

生成随机一段字符串后,复制保存一下,等会需要用到。

开始编写docker-compose.yml文件

我这里将vaultwarden部署在/home/docker/bitwarden/目录下,先进入该文件夹下

1
2
3
sudo mkdir -p /home/docker/bitwarden/ 
cd /home/docker/bitwarden/
sudo vim docker-compose.yml

将以下内容下入到docker-compose.yml文件内

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: "2.1"

services:
app:
image: vaultwarden/server:latest
environment:
- SERVER_ADMIN_EMAIL=a3xxxx6@126.com # 自己的邮箱,按需修改
- SIGNUPS_ALLOWED=false
- INVITATIONS_ALLOWED=true # 允许邀请注册
- WEBSOCKET_ENABLED=true
- ADMIN_TOKEN=QfewuffefaufgefafWCOmyMKS2+zauVk # 刚刚生成的token一大段字符串
- DOMAIN=https://bitwarden.domain.com # 之后使用的域名,可以是子域名
volumes:
- ./data:/data/ # 将密码库的文件挂在到宿主机的/home/docker/bitwarden/data下
ports:
- 8462:80 # 端口映射,按需修改
restart: unless-stopped
networks:
- default

networks:
default:
name: bitwarden

以上配置的方式,只允许邀请注册,不允许注册用户,这样安全性会提高一点。

如果你之后的bitwarden的服务掉了,或者是其他原因使用不了,那你也可以使用/home/docker/bitwarden/data目录下的数据来恢复你的数据,据说是可以恢复的,但我还没出现过问题,不知道行不行,哈哈哈,如果你有试过,可以告知我一声。

启动Docker服务

1
docker-compose up -d

启动服务后,在当前(/home/docker/bitwarden/)目录下,可以看到一个data的文件夹,这个文件夹是存储着你的密码信息,我们可以修改他的权限,不给其他用户查看修改。

1
2
3
4
# 设置该文件夹的所有权是root
sudo chown -R root:root /home/docker/bitwarden/
# 设置该文件夹的权限为600,其他用户不能查看该文件夹或者修改
sudo chmod -R 600 /home/docker/bitwarden/

给bitwarden配置域名

domain.com是我的域名,你应该根据你的域名进行修改

bitwarden规定必须使用https,因为http的数据是的明文传输,不安全,会泄露密码,我们使用可以使用我们的子域名bitwarden.domain.com,然后使用acme.sh申请一个SSL证书(免费)。

在申请域名前,建议你需要将子域名bitwarden.domain.com解析到我们的服务器。

解析记录参考:

  • 记录类型:A(将域名指向一个IPV4地址)
  • 主机记录:bitwarden
  • 解析线路:默认
  • 记录值:服务器IP地址
  • TTL:10分钟(默认)

将该记录解析到你的服务器,你就得到一个子域名bitwarden.domain.com了,这可以开始申请了。

具体申请过程这里不累赘了,详情参考另一篇文章:https://blog.hikki.site/2e63f4a4.html

Nginx反向代理

编辑Nginx的配置文件

1
sudo vim /usr/local/nginx/conf/nginx.conf

将以下内容添加到nginx.conf文件中的http块内里面,注意{}的范围

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#bitwarden
server {
listen 80;
server_name domain.com; # 按照自己的域名需修改
return 301 https://$server_name$request_uri;

}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name domain.com; # 按照自己的域名需修改
ssl_certificate cert/domain.com/cert.pem; # 按照自己的域名需修改
ssl_certificate_key cert/domain.com/key.pem; # 按照自己的域名需修改

ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型,您需要自行评估是否配置TLSv1.1协议。
ssl_prefer_server_ciphers on;
location / {
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;
proxy_pass http://localhost:8462; # 按照自己的端口需修改
}
}

编辑完后先检测一下配置是否正确:

1
2
3
root@ecs-280:~# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

看到以上内容说明配置没有写错,可以加载配置

1
/usr/local/nginx/sbin/nginx -s reload

加载配置完后,可以打开bitwarden了,再配置一下就可以使用了。

配置bitwarden服务端

进入bitwarden配置端

访问https://bitwarden.domain.com,访问会出现以下页面,需要输入token才能进入,这个token就是刚刚生成的那个token,可以在docker-compose.yml这个文件看到token

02-Vaultwarden Admin Panel-20221125-249

输入token回车后进入bitwarden配置面板

03-Vaultwarden Admin Pa20221125-887

配置邮箱

该邮箱配置是用于使用bitwarden发送邀请邮箱注册使用,我这里使用126的邮箱,使用126的邮箱给qq邮箱发送注册邀请,然后使用qq邮箱登录bitwarden使用,你如果看不懂控制面板的英文,可以尝试使用翻译插件仔细看看,这配置也是不难的。

这里应该也是支持QQ邮箱的,你可以去看看QQ邮箱的发送端口是哪个,根据QQ邮箱的信息填写

04-Vaultwarden Admin Pa20221125-661

Username和Password是被邀请者的用户名和密码。

邀请用户

打开Users,查看邀请用户记录,05-Vaultwarden Admin Pa20221125-890

发送邀请

邀请需要使用的用户,如果你只是自己使用,可以给自己发送一个邀请,然后使用这个邮箱登录bitwarden就可以使用了,这个发送邀请可以是可以上一步填写的邮箱是同一个,邀请后的用户使用的邮箱登录和上一步设置的密码登录。

06-Vaultwarden Admin Pa20221125-882

浏览器登录

访问https://bitwarden.domain.com/,登录成功后,就可以开始使用了,可以逛逛了解一下bitwarden有什么功能。

导入浏览器的密码

如果有需要,可以将浏览器的密码导入到bitwarden上,这样会方便许多。

导出浏览器密码

08-浏览器导出密码

导入浏览器密码

打开 https://bitwarden.domain.com 网页。

打开工具--->导入数据,导入刚刚在浏览器的数据,选择相应的文件格式,即可导入数据。

07-导入数据  Bitwarden 网页密20221125-413

配置客户端

bitwarden的客户端有web端(浏览器的插件)和本地客户端(APP程序),配置基本大同小异,这里只演示浏览器的web端配置,手机端的配置也是差不多的。我这里使用Edge浏览器,

09-Microsoft Edge 加载项 -20221125-008

10-Snipper - Snipaste20221125-060 11-Snipper - Snipaste20221125-773 12-Snipper - Snipaste20221125-051

导入后已经可以看到刚刚导入的数据了。到这里就完全可以使用了,平时在使用的时候,在输入密码的时候,右键,可以看到有个bitwarden选项,选择对应的功能即可。

bitwarden基本就完全部署结束了,下面的内容是高级功能,有兴趣可以看看。

进阶内容:URI匹配检测

我们安装完bitwarden后,可能会有个疑问,bitwarden是怎么识别我在哪一个网页需要自动填充密码呢?这就涉及到bitwarden的识别机制了,我们可以根据自己的需求来选择不同的识别方式,一开始默认使用的基本域,如果你不了解这个东西,也不想去了解,以下的文章你可以跳过了,对你不会有影响。

默认URI匹配检测

URI匹配检测有以下几个方式:

  • 基础域
  • 主机
  • 开始于
  • 正则表达式
  • 精确
  • 从不

基础域

选择基本域 当URI的顶级域名二级域名与检测到的资源匹配时,将提示Bitwarden提供自动填充功能。基本域匹配可用于任何国家/地区代码顶级域(例如,.it.co.uk

例如,如果URIhttps://google.com 使用基本域匹配检测:

网址 是否自动填充?
http://google.com
https://accounts.google.com
https://google.net ×
http://yahoo.com ×

主机

我使用的就是主机方式,因为我经常使用服务器调试一下程序时可能会有需要输入账号密码什么的。你应该根据自己的需求来选择不同的检测方式,如果不知道选哪个,那就选择默认的基础域即可。

选择主机 当URI的主机名和(如果指定)端口与检测到的资源匹配时,将提示Bitwarden提供自动填充。

例如,如果URIhttps://sub.bitwarden.domain.com:4000 使用主机匹配检测:

网址 是否自动填充?
http://sub.bitwarden.domain.com:4000
https://sub.bitwarden.domain.com:4000/page.html
https://bitwarden.domain.com ×
https://sub.bitwarden.domain.com ×
https://sub2.sub.bitwarden.domain.com:4000 ×
https://sub.bitwarden.domain.com:5000 ×

开始于

选择开始于 当检测到的资源以URI开头时,将提示Bitwarden提供自动填充功能,而不管URI后面的路径是什么。

例如,如果URIhttps://sub.bitwarden.domain.com/path/ 使用从匹配检测开始:

网址 是否自动填充?
https://sub.bitwarden.domain.com/path/
https://sub.bitwarden.domain.com/path/page.html
https://sub.bitwarden.domain.com ×
https://sub.bitwarden.domain.com:4000/path/page.html (被端口中断) ×
https://sub.bitwarden.domain.com/path (缺少尾部斜杠) ×

正则表达式

正则表达式是一个高级选项,如果使用不正确,可能会导致账号密码胡乱自动填充,如果你不懂使用正则表达式,请不要选择该选项。

选择正则表达式 将提示Bitwarden提供自动填充当检测到的资源匹配指定的正则表达式。正则表达式始终不区分大小写。

不安全示例

如果URI^https://.*google\.com$ 使用正则表达式匹配检测:

网址 是否自动填充?
https://google.com
https://sub.google.com
https://malicious-site.com?q=google.com
http://google.com ×
https://yahoo.com ×

这可能会比预期的相符项目多。请考虑避免使用句号(.),除非转义(\)匹配任何字符。

安全示例

如果URI^https://[a-z]+\.wikipedia\.org/w/index\.php 使用正则表达式匹配检测:

网址 是否自动填充?
https://en.wikipedia.org/w/index.php?title=Special:UserLogin&returnto=Bitwarden
https://pl.wikipedia.org/w/index.php?title=Specjalna:Zaloguj&returnto=Bitwarden
https://en.wikipedia.org/w/index.php
https://malicious-site.com ×
https://en.wikipedia.org/wiki/Bitwarden ×

精确

正在选择精确 当URI与检测到的资源**完全匹配**时,将提示Bitwarden提供自动填充。

例如,如果URIhttps://www.google.com/page.html 使用完全匹配检测:

网址 是否自动填充?
https://www.google.com/page.html
http://www.google.com/page.html ×
https://www.google.com/page.html?query=123 ×
https://www.google.com ×

从不

意思就是不使用bitwarden填充功能。