1、前言

在互联网上冲浪,我们经常需要注册各种账号,日积月累,账号越来越多。如果密码都设置一样,某个网站被攻破则其他网站账号也跟着泄露;而如果密码设置成不一样,又怕时间久了自己忘记。于是,我们就需要一款密码管理软件来帮我们记录账号密码。

我最近试用了 1Password,在 Edge 浏览器上的体验还不错。半个月试用期很快就到了,虽然可以继续使用,但不能再进行编辑。

在网上寻找同类软件,找到了开源的 Bitwarden。它的管理界面跟 1Password 类似,操作体验区别不大。最重要的是,Bitwarden 除了官网提供的付费服务外,还支持自建服务器。

2、搭建 Bitwarden 私有服务器

今天使用的 Docker 镜像是 Vaultwarden,由 Bitwarden_rs 更名而来。它使用 Rust 编写,与官方 Bitwarden 客户端兼容,并改用 SQLite 数据库,相对于官方版使用 MSSQL 数据库体积要小很多,更省内存。

文件 docker-compose.yml 如下:

version: "3"

services:
  vaultwarden:
    container_name: vaultwarden
    image: vaultwarden/server:latest
    restart: always
    ports:
      - 8880:80
      - 3012:3012
    environment:
      ADMIN_TOKEN: "NdEe49VWt3V9DjCnnBVA4a5nrm5Yg4qScv8Vejaa" #访问/admin的token
      WEBSOCKET_ENABLED: "true" #开启WebSocket
    volumes:
      - ./vw-data:/data

环境变量 ADMIN_TOKEN 设置用于登系统管理后台的凭证,建议设长一点,以增加暴力破解难度。

执行 docker-compose up -d 启动服务,然后就可以通过 http://127.0.0.1:8880 去访问 Web 控制台了,但这样很不安全。我们需要配置独立域名和 SSL 证书,让数据加密传输。

假设我使用 vault.yangdx.com 域名,nginx 作为代理,配置如下:

server {
    listen 443 ssl http2;
    server_name vault.yangdx.com;
    access_log /var/log/nginx/vault.log main;

    ssl_certificate /etc/nginx/cert/fullchain.pem;
    ssl_certificate_key /etc/nginx/cert/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";

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

    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:8880;
    }
}

配置完后重启 nginx,浏览器打开 https://vault.yangdx.com 就可以看到 Vaultwarden 的登录界面了,点击“创建账号”按钮来注册一个账号。

登录后,主界面跟 1Password 有些相似:

接着再打开 https://vault.yangdx.com/admin,输入前面设置的 token 进行登录,修改一下配置:

如果需要使用邮件功能,则填写 SMTP 邮件配置,下面是 QQ 邮箱配置示例:

注意,上面的 Password 不是 QQ 登录密码,而是发件授权码,需要到 QQ 邮箱单独获取:

3、安装 Bitwarden 客户端

Bitwarden 的桌面客户端支持 Windows、macOS、Linux,浏览器扩展支持 Chrome、Firfox、Edge、Safari 等,在 iPhone、Android 手机上也有相应的 App 支持。

下载地址见 https://bitwarden.com/download/

我安装的是 Edge 浏览器扩展,安装完毕后点击扩展图标,在登录之前要填写一下私人服务器 URL:

Bitwarden 的浏览器扩展在操作体验上跟  1Password 有区别。

1Password 是当用户名/密码输入框获得焦点时,自动弹出匹配的账号列表,同时输入框右边会显示 1Password 小图标。

而 Bitwarden 是在扩展图标处显示匹配的账号数量,点击扩展图标则显示匹配的账号列表。就这两天使用体验来讲,我个人更喜欢 Bitwarden 这种非侵入式的设计。

4、备份

前面搭建 Vaultwarden 服务的时候,宿主机的 ./vw-data 目录跟容器的 /data 目录做了映射,又因为 Vaultwarden 使用的是 SQLite 数据库,所以备份数据的时候,直接打包 vw-data 目录即可。只要不忘记主密码,把这个 vm-data 目录放到其他服务器上,就可以继续使用。