家庭服务器搭建vaultwarden(一)

本文最后更新于:9 个月前

介绍

作为一名信息安全爱好者,保护好自己的个人信息是必不可少的,其中的一个重要环节就是保护自己的密码。但是每个平台的密码都不一样,怎么记住那么多密码呢?这时候就需要用到密码管理软件了。因为前段时间,付费密码管理软件–lastpass被黑客脱库,因此让我对公有的密码管理服务更加不放心了。正巧有一次在tg群里吹水时,了解到还有bitwarden这款开源免费、可自行搭建服务端,并且支持多平台的密码管理软件,于是便想着用自己家里的虚拟服务器搭建一个试试。但是,官方的bitwarden使用SQL server存储数据,对于服务器配置要求太高,我便采用了同样开源免费、用Rust语言重写服务端、更轻巧的第三方密码管理软件–vaultwarden

项目地址:https://github.com/dani-garcia/vaultwarden

这可能是全网唯一一篇用自己家里的服务器搭建vaultwarden的教程了。网上的教程大多用公有云的vps搭建,但是国内vps需要备案才能使用,费时费力不说还有泄露隐私的风险;除此之外就是使用家里的群晖nas搭建,但是我的nas配置太低,而且ARM架构不支持docker,所以我只能忍痛放弃这条路。因为国内的家庭宽带不像vps一样开放了80和443端口,服务器设置Nginx反向代理也不像群晖nas那样简单方便,所以我踩了不少坑。下面我将亲自示范如何搭建一个开源的密码管理平台vaultwarden,搭建自己的私人密码库,让账号密码更安全。

正文

准备

首先,你需要一台安装好dockerdocker-composeLinux服务器,并且购买一个域名。对于家庭宽带而言,你需要拥有一个公网ip地址,并且域名需要提前配置好ddns(我的往期文章中讲过阿里云的配置方法,其它域名服务商也类似,都是通过调用api来更新域名解析)。你可以采用命令安装,但是我为了省事,使用了宝塔面板安装(也可以使用宝塔面板的国际版–aapanel,更安全)。完事后拉取vaultwarden的镜像,因为我的宝塔面板拉取镜像的功能有问题,所以只能使用命令拉取了:

1
docker pull vaultwarden/server:latest

踩坑

拉取完成后不要急,先安装Nginx并创建一个网站,点击“添加站点”,“创建站点”里面填写你购买好的域名,一定要带上端口号。这里的局域网http端口我为了避免以后可能的冲突,就没有填写80,而是填了一个比较大的作为http端口。PHP版本选择“纯静态”,其它的全部不创建,完成后点“提交”:

接着,在根目录下创建一个文件夹vw-data,用于存放vaultwarden的数据,再去刚才创建的网站,把网站目录改成你创建的这个文件夹。当然,你也可以用创建网站时自动生成的网站目录,但下图“挂载卷“中的“服务器目录”也要改成自动生成的网站目录,即/www/wwwroot/abc.com/。准备就绪后,去创建对应的docker容器,画红框的按照截图里面的填就行:

2

注意:这里的服务器端口要和前面创建网站填写的一样,创建网站和创建容器这两步千万不能反过来,否则会报“端口被占用”的错误!

由于vaultwarden的网页端必须要通过https访问,才能创建账号,所以我们必须要配置SSL证书。根据官方文档中的说明,采用docker挂载SSL证书的方式无法使用自动同步的功能,所以我们采用Nginx反向代理的方式。点击你创建的网站右侧的”设置“,再点左侧的”SSL”,申请证书或者填写已有的证书即可,建议申请通配符证书。

再点击左侧栏中的“反向代理”,点击”添加反向代理“,”目标URL“填写http://127.0.0.1:前面你设置的局域网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
28
29
30
31
32
33
34
35
36
37
38
39
40
location / {
# 6666端口替换成你前面设置的http端口
proxy_pass http://127.0.0.1:6666;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}

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 {
# 6666端口替换成你前面设置的http端口
proxy_pass http://127.0.0.1:6666;
}

location /admin {
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;
# 6666端口替换成你前面设置的http端口
proxy_pass http://127.0.0.1:6666;
}
# 加入robots.txt 防止搜索引擎爬虫抓取
location = /robots.txt {
# 改成你自己的目录
root /home/wwwroot/Bitwarden;
}

同样,这里的局域网https端口我为了避免以后可能的冲突,也没有填写443,而是前往左侧栏中的“配置文件”,把红框中的443端口替换成了其它的:

修改完成后,别忘记重载Nginx配置,或者直接重启Nginx

最后去你家光猫或者路由器后台设置一下端口转发(有的路由器叫“端口映射”),就可以了,记住外网端口不能填80和443。经过我这样一波操作,理论上用https://域名:外网非标准https端口应该是可以访问的,但实际上怎么都打不开网页端。

这时,就让我隆重介绍这次折腾的主角–Nginx Proxy Manager

正道

说到底,Nginx Proxy Manager其实就是一个图形化的管理面板。我们同样采用docker-compose安装,在/root目录下新建一个文件夹npm(也可以叫其它名字),并在npm文件夹下创建一个docker-compose.yml文件,内容填写:

1
2
3
4
5
6
7
8
9
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '4636:80' # 前面的局域网http端口可以修改成其它的
- '4637:81' # 前面的局域网gui管理端口可以修改成其它的
- '4638:443' # 前面的局域网https端口可以修改成其它的

使用命令docker-compose up -d创建Nginx Proxy Manager容器,局域网内用http://局域网ip:4637访问Nginx Proxy Manager后台,默认账号和密码如下:

1
2
邮箱:admin@example.com
密码:changeme

进入后台以后最好修改一下邮箱和密码,其中邮箱是用来提醒你更新SSL证书的。点击最上面菜单里的”Hosts”,再选择下拉框里的”Proxy Hosts”:

点右边的”Add Proxy Host”,下面的内容按照截图里面的填写:

其中vaultwarden容器的ip可以在宝塔面板里看到。

再接着设置SSL证书,可以用自己申请好的,也可以用Nginx Proxy Manager提供的申请证书功能,我使用的是自己申请好的。点击上方菜单中的”SSL Certificates”,再选择”Add SSL Certificate”下拉框中的”Custom”:

设置完证书后再回到刚才设置反向代理的页面,选择刚才上传的证书:

这里不建议开启”Force SSL”(强制https)选项,因为实测非标准端口开启此功能后会出现一些问题。

最后去你家光猫或者路由器后台设置一下端口转发(有的路由器叫“端口映射”),就可以了,记住外网端口不能填80和443。

在电脑浏览器中输入https://自己的域名:外网https端口,完美访问:

还没完,点击“创建账号”创建你自己的账号后,如果你不想其他人使用你的密码库,记得一定要关闭用户注册功能。当然,关闭以后你也可以发邮件邀请其他人注册,只不过要配置SMTP服务器。

怎么关闭呢?先删除你创建的vaultwarden容器,不用担心刚才创建的账户密码没了,因为它们被存放在了服务器的挂载目录中,也就是我设置的/vw-data。删掉之后再创建docker容器,还是使用vaultwarden/server:latest镜像,但这次不需要设置映射端口了,而且下面的“环境变量”中需要填写以下内容:

1
2
3
4
SIGNUPS_ALLOWED=false # 关闭用户注册
WEBSOCKET_ENABLED=true # 开启自动同步
INVITATIONS_ALLOWED=true # 开启邀请注册
ADMIN_TOKEN=xxxxxxxxxxx # 填写你自己的,使用命令openssl rand -base64 48生成,一定要保存好!

启动容器后,如果容器ip改变了,记得去Nginx Proxy Manager面板中修改一下,否则会无法访问。在电脑浏览器中输入https://自己的域名:外网https端口/admin,输入生成的ADMIN_TOKEN,即可在后台设置域名、SMTP服务器、二步验证等信息。

思考

当然,自建密码管理器也有风险,从网络安全的角度来说,把端口暴露到外网增加了攻击面,也增加了被黑客入侵的风险。为此我尝试过把“自托管服务”中的“服务器URL”改为局域网ip,同步时就打开wireguard VPN连接密码服务器,但是实际操作后发现并不能如我想的实现。下面以安卓手机端登录为例。

  • 当我填写http://局域网ip:局域网端口并登录时,报错如下:

小米http

  • 当我填写https://局域网ip:局域网端口登录时,报错如下:

小米https

总结

在下篇教程中,我将教大家如何实现一些进阶玩法,例如定时备份,让你的数据多一层保障。

好了,以上就是关于如何搭建vaultwarden的全部教程了,如果还有疑问或者不清楚的,欢迎在评论区留言,我会尽量帮助你们。我们下期再见!


家庭服务器搭建vaultwarden(一)
https://rookieterry.github.io/2023/01/04/家庭服务器搭建vaultwarden(一)/
作者
HackerTerry
发布于
星期三, 一月 4日 2023, 11:29 晚上
许可协议