前言

注册了许多网站和APP,密码太多记不住?这时候就需要一个密码库来安全地储存你的密码
本文将介绍使用 Vaultwarden 在 Ubuntu 上自建密码库的方法

关于 Vaultwarden

前身为 bitwarden_rs ,引用官方的介绍

Alternative implementation of the Bitwarden server API written in Rust and compatible with upstream Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.

它是一种用 Rust 编写的可用于 Bitwarden 官方客户端的密码库服务端程序,适用于低配置服务器部署

第一步:安装 docker

使用官方脚本直接安装

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

等待命令执行完成后,若当前用户非 root 用户,使用以下命令将当前用户加入 docker 组,以获得 docker 访问权限

sudo usermod -aG docker <用户名>

注销然后重新登录,否则会报错

配置 docker 镜像源以加速下载

sudo vi /etc/docker/daemon.json

文件中填入

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}

保存退出,重启 docker

sudo systemctl daemon-reload
sudo systemctl restart docker

输入以下命令验证

docker info

输出有类似这样的结果

Client: Docker Engine - Community
 Version:    24.0.7
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.11.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.21.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 24.0.7
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
 runc version: v1.1.9-0-gccaecfc
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 5.15.0-88-generic
 Operating System: Ubuntu 22.04.2 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 6
 Total Memory: 3.785GiB
 Name: ubuntu-server
 ID: c1384daf-2eb5-4573-b297-7220afd8a46b
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  http://hub-mirror.c.163.com/
 Live Restore Enabled: false

第二步:拉取镜像并创建容器

拉取 Vaultwarden 镜像

docker pull vaultwarden/server:1.30.0

使用了docker镜像源一定要再拉取的镜像末尾加上确切的版本号,以免镜像源的 latest 与官方源版本不同,会造成bitwarden客户端不兼容
具体版本号可在这里查看:Docker Hub - vaultwarden/server

创建 Vaultwarden 容器

数据储存目录和初始管理员密码按需修改,这里使用8080端口搭建

docker run -d --name vaultwarden -v /path/to/vaultwarden数据储存目录:/data --restart unless-stopped -p 8080:80 -e ADMIN_TOKEN=(初始管理员密码) vaultwarden/server:1.30.0

这时候输入服务器 IP 或域名就能访问到 vaultwarden 主界面了
vaultwarden主界面

但这时候还不能正常使用,需要配置 https

第三步:配置 https

安装 nginx 用于 https 反代

现代浏览器在http下无法再正常使用 vaultwarden ,因此需要通过 nginx 反代出 https 来使用

sudo apt install nginx-core

申请 SSL 证书

若为本地部署或局域网部署可以跳过此步骤
本文在 zerossl 上获取免费证书,其他方式也大同小异
进入 zerossl 官网

  • 首页巨大的输入框里直接输入你的域名或IP
    zerossl 是支持获取纯 IP SSL 证书的,国内服务器不想备案可以直接用 IP 并换端口访问
    zerossl
  • 然后就会跳转到注册/登录界面,登录已有账号或者注册新账号
  • 下一步根据需要选择不同有效期的证书
    选择证书
  • 下一步保持默认,让他自动生成CSR
  • 下一步选择默认的计划
  • 然后就到了域名验证阶段,三种方式任君选择。
    如果申请的是 IP SSL 证书,就只能用最后一种文件验证的方式
    验证域名
    根据页面提示完成验证
  • 验证完成后下载证书
    下载证书
  • 下一步,你可以直接按照页面给出的 help center 中找到各种场景安装 SSL 证书的教程
  • 将证书上传到服务器,并解压到一个文件夹中
  • 合并证书链
    cat certificate.crt ca_bundle.crt >> ssl.crt
  • 编辑 nginx 站点配置文件
    为方便,这里直接以默认站点文件演示,注意备份!
    sudo vi /etc/nginx/sites-available/default
    在文件末尾粘贴以下内容
    server {
    
        listen               443 ssl;
        
        ssl_certificate      /etc/ssl/ssl.crt; 
        ssl_certificate_key  /etc/ssl/private.key;
         
        server_name  your.domain.com;
        access_log   /var/log/nginx/nginx.vhost.access.log;
        error_log    /var/log/nginx/nginx.vhost.error.log;
        location     / {
                proxy_pass http://127.0.0.1:8080;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    
    }
  • 重启 nginx
    sudo /etc/init.d/nginx restart

第四步:创建账户

  • 访问 https://服务器IP或域名 ,进入 vaultwarden 网页密码库,根据要求创建账户
  • 创建完成后,进入管理页面 https://服务器IP或域名/admin ,输入之前设置的 ADMIN_TOKEN ,可以在这里调整设置
  • 建议创建好需要的账户以后,关闭新用户注册,在 General settings 下,取消勾选 Allow new signups
    关闭新用户注册

(可选)删除 ADMIN_TOKEN

配置完成后,安全起见,删除容器环境变量中的 ADMIN_TOKEN

docker container stop vaultwarden
docker container rm vaultwarden

复制之前第一次创建容器的命令,删除 -e ADMIN_TOKEN=xxx 再重新创建容器

docker run -d --name vaultwarden -v /path/to/vaultwarden数据储存目录:/data --restart unless-stopped -p 8080:80 vaultwarden/server:1.30.0

此时管理面板将不能再访问

第五步:配置客户端

  • 登录界面邮件地址下方下拉框选择 自托管 ,输入 https://服务器IP或域名
    PC
  • 登录并开始使用

补充说明

  • 若使用国内云服务器搭建,记得去云服务器控制台放行端口
  • 若使用国外云服务器搭建,有些服务商需要去控制台放行端口,而也有一些服务商默认不开防火墙,需要在操作系统中放行端口
  • 以 vultr 的 Ubuntu 服务器为例,使用以下命令放行端口
    ufw allow 端口号