跳到主要内容

自建Bitwarden密码管理服务器

· 阅读需 6 分钟
Kevin2li
PDF Guru Anki开发者

背景

最近登录Github时发现,Github开始要求用户开启双因素认证(two-factor authentication, 2FA)了。

科普 | 什么是双因素认证?

双因素认证,就是登录或者做某些操作时,除了需要输入密码(第一因素,你知道的东西),还需要第二个东西来证明你是你。这个第二个东西可以是:

  1. 手机或硬件令牌上的一个临时验证码(你拥有的东西):每次登录时,手机上的一个特定应用会生成一个只有几分钟有效的新数字,你把这个数字输入进去,系统才会让你登录。
  2. 指纹或面部识别(你是什么):这是更高级的认证方式,你的生物特征就是第二因素。

简单来说,双因素认证就像是银行的安全门,密码是第一道门,你还得用第二把钥匙(比如手机上的验证码)才能完全打开门进去。这样即使有人知道了你的密码,没有第二把钥匙,也进不了门。这就是为什么双因素认证能大大提高账户安全性的原因。

根据Github上面的提示,推荐用户使用1PasswordAuthyMicrosoft Authenticator等密码管理软件生成一次性密码来作为第二因素。

但是上面这些软件我尝试了一下要么是付费软件,要么就是所在地区无法使用,总之就是很不方便,也没能设置成功。

后来了解到一个开源的密码管理软件Bitwarden似乎也可以,然而要使用双因素认证功能还需要购买会员。不过,由于它是开源软件,支持用户在自己服务器上部署,便可绕过它的收费服务。

下面记录一下搭建教程。

安装Bitwarden Server

首先,Bitwarden有官方的Docker部署指南,详细可以参考:Bitwarden Self-hosting | Linux Standard Deployment

但是官方提供的方案对服务器要求比较高,消耗系统资源比较大,属于重量级方案,这里没有采用。

然后发现有个非官方的使用Rust实现的Bitwarden Server平替方案vaultwarden, 对系统资源消耗小,并且Bitwarden的几乎全部功能都有,因此这里采用的是它的方案。

注意

这里主要使用Docker进行部署,用户需要事先安装好Docker

  1. 拉取vaultwarden容器镜像:
docker pull vaultwarden/server:latest
  1. 编写docker-compose.yaml

新建一个空文件夹,里面创建一个docker-compose.yaml文件,内容如下:

version: '3.9'
services:
vaultwarden:
container_name: vaultwarden
image: vaultwarden/server:latest
ports:
- "8000:80"
volumes:
- "./vw-data/:/data/"
restart: 'always'
  1. 启动容器:

在和docker-compose.yaml文件同级目录下执行下面命令。

docker compose up -d

浏览器中输入服务器地址访问:http://<your-server-ip>:8000

能正常打开网页表示启动成功。

公网访问

内网穿透

由于我把bitwarden服务部署在了本地的服务器,只有与本地服务器同一局域网下的设备能访问。为了能在公网环境下使用,还需要设置一下内网穿透。

首先你要有一台自己的云服务器,然后在云服务器和本地服务器都要安装对应的内网穿透软件,如frp等等。

然后经过一些配置,最终实现将云服务器的指定端口和本地服务器的bitwarden服务端口建立隧道, 具体可以参考你使用内网穿透软件的使用教程。

这个步骤做完,应该可以通过云服务器的IP地址来访问位于内网中的Bitwarden服务了。

反向代理

这步的目的是为了能够使用域名访问https访问。这个环节涉及到域名注册域名备案SSL证书申请等步骤,有机会单独出教程。

本教程使用nginx做反向代理,假设你已经完成了上面步骤,然后就可以在nginx配置文件(一般为/etc/nginx/nginx.conf)中添加新服务器。

假设你的域名是bitwarden.example.com, 配置中可添加下面内容:

# bitwarden
server {
server_name bitwarden.example.com;
listen 443 ssl http2;
ssl_certificate <替换为你的证书路径>;
ssl_certificate_key <替换为你的密钥路径>;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

# listen 80 default;
listen 80;
if ($scheme = http) {
return 301 https://$host:443$request_uri;
}

# 反向代理
location / {
proxy_pass http://127.0.0.1:8000;
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-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Accept-Encoding gzip;
proxy_redirect http:// https://;
}
}

重启nginx服务:

sudo ngins -s reload

正常情况下,此时已经可以通过域名https://bitwarden.example.com访问服务了。