关于云密码管理软件

云密码管理软件这一块,我一直使用的是1password, 使用1password的体验非常不错, 被人诟病的手机应用端自从更新到1password 8以后也很不错。导致我本次决定迁移到Vaultwarden的原有:

  1. 前段时间信用卡莫名其妙的收到了一笔境外的扣款,想了半天终于想起来是1password (年费订阅..还特地致电去冻了卡)。
  2. 去年Lastpass的云存储设施遭黑客入侵,大量客户保险库敏感数据疑遭泄露。让我意识到数据还是握在自己手里合适。
  3. 说起来你们可能不信,我没有用过Docker,都是服务本地直接安装。

安装过程

云服务提供商是腾讯云,感觉最近一段时间很少看到腾讯阿里做力度非常大的活动了。考虑到1password和其他服务订阅的成本,一年续费的价格也就没有显得很贵。

安装Docker

官方提供了非常好的手册来参考,这里还是简单的说一下

  1. 更新apt索引以及安装apt对HTTPS的支持
1
2
3
4
5
6
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
  1. 添加Docker的GPG key
1
2
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  1. 设置repository
1
2
3
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

剩下的步骤就是更新apt索引和安装了

1
2
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装Vaultwarden

简单介绍一下Vaultwarden,就是一个非官方Rust版本的服务端,这目前算是个人用Bitwarden的最优解决方案,因为它不是那么消耗服务器性能,项目地址:Link。感兴趣的可以去翻一翻,里面有Wiki会对本章节的部分内容做完整的解释。

为了方便,这里使用 docker-compose 启动服务,在上文的Docker安装中已经涵盖,如果没有可能要自己安装。

  1. 首先创建一个yml文件这里我叫vaultwarden.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3.1'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
environment:
- TZ=Asia/Shanghai
- SIGNUPS_ALLOWED=false
- INVITATIONS_ALLOWED=true
- ADMIN_TOKEN=<super-lang-password-here>
- LOG_FILE=/data/vaultwarden.log
- LOG_LEVEL=warn
- SHOW_PASSWORD_HINT=false
- DOMAIN=<your-domain-here>
volumes:
- /etc/vaultwarden/:/data/
ports:
- "127.0.0.1:2081:80"

​ 这里对其中的几个参数做一下解释这些配置可以参考Wiki和个人需求做修改

  • SIGNUPS_ALLOWED:是否允许注册新用户
  • INVITATIONS_ALLOWED:是否允许邀请用户,注:在admin界面中可以邀请用户
  • ADMIN_TOKEN:访问admin界面需要的token
  • LOG_FILE:输出日志文件的路径
  • SHOW_PASSWORD_HINT:密码提示
  • volumes:将本地磁盘的映射到Docker中, ports也同理

在你配置好所有文件之后便可以启动Vaultwarden

1
sudo docker compose -f vaultwarden.yml up -d

但是这还没完,因为在配置文件中我们将本地的2081映射到了Docker的80端口,这里我使用Cloudflare + Nginx反向代理到2081端口,以及完成HTTPS的证书配置

Nginx配置

HTTPS证书的配置这里不再多说,已经有很多方案可以解决这一个问题,这里列出反代部分的Nginx配置文件:

1
2
3
4
5
6
7
8
9
10
11
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
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;
if ( $host = '<your-domain-here>' ){
proxy_pass http://127.0.0.1:2081;
}
}

安全配置

由于Vaultwarden在登录界面没有设置验证码等手段来防止bot进行密码爆破,官方提供了fail2ban来解决这一问题。加上我们使用了Cloudflare,这使得本地封锁IP失效,需要使用fail2ban自带的action来实现和Cloudflare的联动。这里有一篇文章可以用作参考。

Fail2ban action设置

默认的的action文件存储在/etc/fail2ban/action.d里,其中就包含了官方对于CF支持的action,我们打开cloudflare.conf,做如下修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Init]

# If you like to use this action with mailing whois lines, you could use the composite action
# action_cf_mwl predefined in jail.conf, just define in your jail:
#
# action = %(action_cf_mwl)s
# # Your CF account e-mail
# cfemail =
# # Your CF API Key
# cfapikey =

cftoken = YOURGLOBALAPIKEY

cfuser = YOURCLOUDFLAREMAIL

cftarget = ip

注意,这里用到的是GlobalAPIKEY,所以你需要自信考虑承担这个风险。

Fail2ban Filter设置

这部分的设置在Wiki中也有提及,可以去Wiki自行参考。

进入 /etc/fail2ban/filter.d 目录,新建 vaultwarden.local

1
2
3
4
5
6
[INCLUDES]
before = common.conf

[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\. Username:.*$
ignoreregex =

新建 vaultwarden-admin.local

1
2
3
4
5
6
[INCLUDES]
before = common.conf

[Definition]
failregex = ^.*Invalid admin token\. IP: <ADDR>.*$
ignoreregex =

这两个配置文件分别为应用界面和admin界面。

Fail2ban Jail设置

进入 /etc/fail2ban/jail.d 目录,新建 vaultwarden-admin.local,这里要注意的是log的位置以及刚才的action

1
2
3
4
5
6
7
8
9
10
[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden
logpath = /etc/vaultwarden/vaultwarden.log
maxretry = 3
action = cloudflare
iptables-allports
bantime = 30d
findtime = 3h

新建vaultwarden.local

1
2
3
4
5
6
7
8
9
10
11
12
# /etc/fail2ban/jail.d/vaultwarden.local

[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden
logpath = /etc/vaultwarden/vaultwarden.log
maxretry = 3
action = cloudflare
iptables-allports
bantime = 30d
findtime = 3h

注:这里port可能不是那么重要,因为在Cloudflare上是全Ban,但是我还是保留了。

启动fail2ban

1
sudo systemctl start fail2ban

到此为止,你就获得了一个自己掌握数据的密码管理软件,并且使用Cloudflare在武装保护它。至于说数据的备份和恢复,抽时间在写吧。