Press "Enter" to skip to content

从keepass转到了自建vaultwarden

一直以来我都是使用keepass来保存密码,作为知名开源的密码管理器,keepass在Windows、macOS以及iOS等平台都有对应的客户端,如果轻度使用的话,也还能接受,但是最近发现iOS平台越来越多的App有意或者无意地不支持iOS自带的钥匙串或者密码黏贴功能,再加上iOS端同步密码文件不是很方便,于是花了点时间转到了自建vaultwarden,这里记录下我的转换过程。

2021-05-08更新

因原bitwarden_rs项目改名成vaultwarden,本文相关项目名称也替换成vaultwarden。

前言

如上所述,我一直是用的keepass加Dropbox在各个平台同步密码文件,用了三四年了,一直也还算舒服,只要解决了Dropbox连接服务器问题,大多数情况使用都是没问题的,但是Dropbox免费版不知道啥时候开始限制了客户端数量,对于我这种有多个设备的人来说稍微有点不方便,而且,有的时候不是所有在用的设备都能使Dropbox连上服务器。再者,keepass在iOS上是有客户端,但是并不是很好用,并且keepass在iOS的文件同步、文件关联什么的很不方便。

然后了解了下,vaultwarden自持自建,对资源占用也不高,各个系统都有对应的客户端,数据可以完全放在自己手里,如果域名备案,可以部署在国内服务器,速度和延迟都能得到保证。

综合考虑下了,vaultwarden相对keepass来说却是更适合我,正好手上还有几台3年到期的国内服务器在吃灰,这些原因一起促使我有动力从keepass转到vaultwarden。

配置过程

其实vaultwarden官方也提供安装脚本,使用的是vaultwarden原版以及MSSQL,我试了下,整体安装完成之后,总共占用大概1.5G的内存,仅仅是一个密码管理器,占这么多资源实在是没必要,还不如花10美元使用官方的服务。于是我选择了vaultwarden,一个使用Rust编写的官方vaultwarden替代品,占用内存非常轻量,vaultwarden本身可能占用就20M内存不到,配合现有的Nginx,也额外占不了多少资源。

我是在腾讯云国内地域服务器配置的,系统为最新版Debian,服务器资源为1核CPU,2G内存,50GSSD,用来配置一个vaultwarden绰绰有余。

其实vaultwarden也可以使用预编译的二进制软件安装,但是配置过程比Docker复杂多了,考虑到后期维护以及升级,我还是选择了docker方式部署。

安装过程是用的root账户。

安装docker

如果已经安装可以跳过这步,代码如下:

apt-get update

apt-get install apt-transport-https ca-certificates curl gnupg lsb-release

curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update

apt-get install docker-ce docker-ce-cli containerd.io

接着是安装docker-compose,命令如下:

curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker composer配置文件

然后在打算保存vaultwarden数据的目录新建一个对应文件,比如说/var/www/vaultwarden,对应的名称及内容如下:

vim docker-compose.yml

version: "3"

services:
  vaultwarden:
    image: vaultwarden/server
    container_name: vaultwarden
    restart: always
    ports:
        - "127.0.0.1:8081:80"
        - "127.0.0.1:3012:3012"
    volumes:
      - ./vw-data:/data
    environment:
      WEBSOCKET_ENABLED: "true"
      SIGNUPS_ALLOWED: "true"
      WEB_VAULT_ENABLED: "true"
      #ADMIN_TOKEN: ""

其中,WEBSOCKET_ENABLED是指是否启用Websocket,用来推送变动通知;SIGNUPS_ALLOWED是指是否允许注册,建议第一次运行时允许注册,注册完账号之后再改为false关闭注册;WEB_VAULT_ENABLED,可以理解为是否开启web端,有些操作需要通过web端进行操作。

3012是vaultwarden使用的websocket端口,80是web相关端口,因为我本机的80端口已经被Nginx占用了,所以我将vaultwarden的80映射到了8081端口。

Nginx配置文件

没啥说的,就是配置Nginx反代后端的vaultwarden,我的完整配置文件如下:

server{
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	server_name  test.buzt.cn;
	index index.html index.php;
	ssl on;
	ssl_certificate /path/to/test.buzt.cn.crt;
	ssl_certificate_key /path/to/test.buzt.cn.key;
	ssl_session_cache        shared:SSL:10m;
	ssl_session_timeout      10m;
	ssl_session_tickets      on;
	resolver                 8.8.4.4 8.8.8.8  valid=300s;
	resolver_timeout         10s;
	ssl_session_cache builtin:1000 shared:SSL:10m;

	ssl_prefer_server_ciphers on;

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
	ssl_stapling on;
	ssl_stapling_verify on;

	add_header X-Frame-Options "SAMEORIGIN";
	add_header X-XSS-Protection "1; mode=block";
	add_header X-Content-Type-Options "nosniff";

	charset utf-8;

	location / {
		proxy_pass http://127.0.0.1:8081;
		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 {
		proxy_pass http://127.0.0.1:8081;
	}

	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;
		proxy_pass http://127.0.0.1:8081;
	}
}

server
{
	listen          80;
	server_name test.buzt.cn;
	location / {
		rewrite ^/(.*)$ https://test.buzt.cn/$1 permanent;
	}
}

实际使用的话,替换一下SSL证书就行了。我这里使用的是test.buzt.cn作为域名。

相关命令

几个进程相关命令:

# 启动
docker-compose up -d
# 重启
docker-compose restart
# 停止
docker-compose down
# 更新vaultwarden镜像,需要先停止
docker pull vaultwarden/server:latest

配置好docker-compose及Nginx之后,打开对应的域名比如说test.buzt.cn即可登录web端注册账号,如图:

登录界面
vaultwarden注册界面

注册完之后即可返回登录界面进行登录。建议注册完之后关闭注册选项,防止无关用户注册。关闭注册方法是先停止容器,然后修改上述yml文件里面的SIGNUPS_ALLOWED为false,重新启动就行了。

配置客户端

其实客户端配置没啥说的,只要改个URL就行,比如说我macOS客户端:

vaultwarden客户端修改URL为自建服务器

打开之后,点击右上角的齿轮图标,将服务器URL修改为自建的即可。iOS等也是一样。

将密码从keepass转到vaultwarden

vaultwarden提供了keepass转换至vaultwarden功能,原版keepass 2或者macOS端的MacPass都支持导出再导入至vaultwarden,以我用的MacPass为例,解锁之后,点击文件→导出→导出为xml…,即可导出成xml:

macpass导出密码至xml

然后登陆web端,依次到工具→导入数据,选择对应的格式即可导入了:

keepass导入至vaultwarden

vaultwarden数据备份

如果跟我一样,选择将vaultwarden的数据放在/var/www/vaultwarden,则所有数据都在该目录下面,备份的时候将里面所有的文件或者挣个文件夹备份就行,如果不放心,还可以单独将里面的sqlite3数据备份一下,例如将文件备份至~:

sqlite3 /var/www/vaultwarden/bw-data/db.sqlite3 ".backup '/root/db-$(date '+%Y%m%d-%H%M').sqlite3'"

如果提示“-bash: sqlit3: command not found”,则手动安装一下sqlite3就行:

apt install sqlite3

参考内容

文中很多内容都来自于vaultwarden项目官方,项目地址:https://github.com/dani-garcia/vaultwarden/

配置相关wiki:https://github.com/dani-garcia/vaultwarden/wiki

感谢vaultwarden官方及vaultwarden项目以及众多开源开发者。