前段时间,Lastpass这样的专业密码管理软件也被爆出漏洞,泄露用户加密后的密码数据。使用Vaultwarden这种社区维护的开源软件,自建一套密码管理系统,是一个比较好的选择。
Vaultwarden是用Rust语言编写的Bitwarden服务端,它比官方服务端更轻量,所需资源更少,可以在更小的机器上运行。同时,它可以很好地兼容Bitwarden的客户端。

Bitwarden 和 Vaultwarden 对比

自建 Bitwarden 服务端需要多达11个容器,而Vaultwarden仅需1个,且后者所需资源大大小于前者。

BitwardenVaultwarden
CPU核心数10.2
内存2GB128MB
储存12GB200MB

Bitwarden 虽说是开源软件,但是用了微软 SQL 闭源数据库,这可能让人有点不爽。
写作本文时,Bitwarden 正在开发简单一点的版本,目前在测试中,可单容器部署以及可选使用哪种数据库。

准备工作

如果使用DigitalOcean,Linode等虚拟服务器,则需要做好安全工作。

安装Docker和Docker-compose

sudo apt install docker.io docker-compose -y
安装完成后,把操作系统用户添加到docker用户组,这样就能直接执行docker命令,而不用每次都要加sudo。如果你想用sudo也可以跳过这步。
sudo usermod -aG docker username
把username改为实际操作系统用户名。

域名 / 子域名

可以直接用IP访问,最好还是用域名,并配置SSL证书。

HTTPS / SSL 证书

必须使用HTTPS才能访问 Vaultwarden,否则会出错。可以用反向代理为其配置HTTPS。

防火墙 (非必须,但推荐)

不要把 Vaultwarden 直接暴露在公网。使用防火墙仅开启必要端口。

安装 Vaultwarden

创建一个目录,来存放所有相关文件。
mkdir -p ~/docker/vaultwarden/data
进入该目录。
cd ~/docker/vaultwarden

创建 Docker-compose.yml

使用nano编辑器来编辑 docker-compose.yml 文件
nano docker-compose.yml
编辑完成后按Ctrl + O 再按 Enter 保存
按Ctrl + X 退出

Docker-compose.yml 基本设置

version: '3'

services:
  vaultwarden:
    container_name: vaultwarden
    image: vaultwarden/server:latest
    restart: unless-stopped
    volumes:
      - ./data/:/data/
    ports:
      - XXXX:80
  • container_name
    在你机器上显示的容器名,建议设置为 vaultwarden 便于识别。
  • image
    镜像名,容器使用的镜像,设置为 vaultwarden/server ,后面的 latest 表示使用最新版本
  • restart
    告诉 Docker ,如果这个容器停止运行了,应该何时重启。建议设置为 unless-stopped ,表示除非你手动停止,否则 Docker 会一直尝试重启。
  • volumes
    设置容器内外文件夹对应关系。按上面设置就好。
  • ports
    设置容器内外的端口对应关系。xxxx是宿主机的端口,任意端口都可以。如果你在同一台机器设置反向代理,则不用管防火墙设置。否则需要在防火墙打开对应端口。

Docker-compose.yml 环境设置

下面来添加其他设置,所有可配置项请参考官方文档

系统设置

      - DOMAIN=https://subdomain.yourdomain.com
      - LOGIN_RATELIMIT_MAX_BURST=10
      - LOGIN_RATELIMIT_SECONDS=60
      - ADMIN_RATELIMIT_MAX_BURST=10
      - ADMIN_RATELIMIT_SECONDS=60
      - ADMIN_TOKEN=YourReallyStrongAdminTokenHere
      - SENDS_ALLOWED=true
      - EMERGENCY_ACCESS_ALLOWED=true
      - WEB_VAULT_ENABLED=true
  • DOMAIN
    域名,访问 Vaultwarden 的域名
  • LOGIN_RATELIMIT_MAX_BURST
    在下面选项规定的时间内,最多能尝试登陆次数。
  • LOGIN_RATELIMIT_SECONDS
    规定一个时间,单位是秒。
  • ADMIN_RATELIMIT_MAX_BURST
    在下面选项规定的时间内,最多能尝试登陆管理面板次数。
  • ADMIN_RATELIMIT_SECONDS
    规定一个时间,单位是秒。
  • ADMIN_TOKEN
    登陆管理面板的密码,请设置复杂一点。如果不设置,则禁用管理面板。
  • SENDS_ALLOWED
    Bitwarden有个功能,可以通过链接分享文字和文件。该选项控制是否开启这项功能。
  • EMERGENCY_ACCESS_ALLOWED
    是否开启紧急联系人功能。你可以添加一个邮箱地址作为紧急联系人,系统将发送邮件到该邮箱,点击邮箱链接确认,你再次确认后,该邮箱就成为你的紧急联系人。通过该邮箱登陆后,该用户请求访问你的密码库,你可以手动同意或者拒绝,如果你没有任何操作,那么在发送请求7天后,系统将自动同意。
  • WEB_VAULT_ENABLED
    是否开启网页登陆。当你设置好账号,可以关闭容器,把该选项设置为 false ,再打开容器。关闭网页登陆,但你可以通过客户端登陆,这样可以提高安全性。

Docker-compose.yml 注册设置

      - SIGNUPS_ALLOWED=false
      - SIGNUPS_VERIFY=true
      - SIGNUPS_VERIFY_RESEND_TIME=3600
      - SIGNUPS_VERIFY_RESEND_LIMIT=5
      - SIGNUPS_DOMAINS_WHITELIST=yourdomainhere.com,anotherdomain.com
  • SIGNUPS_ALLOWED
    用户是否无需登陆即可注册。
  • SIGNUPS_VERIFY
    注册是否需要验证邮箱地址。
  • SIGNUPS_VERIFY_RESEND_TIME
    验证邮件发送间隔。
  • SIGNUPS_VERIFY_RESEND_LIMIT
    验证邮件最大发送次数。
  • SIGNUPS_DOMAINS_WHITELIST
    注册邮箱允许的域名。

Docker-compose.yml SMTP邮件设置

      - SMTP_HOST=smtp.youremaildomain.com
      - [email protected]
      - SMTP_FROM_NAME=Vaultwarden
      - SMTP_SECURITY=SECURITYMETHOD
      - SMTP_PORT=XXXX
      - [email protected]
      - SMTP_PASSWORD=YourReallyStrongPasswordHere
      - SMTP_AUTH_MECHANISM="Mechanism"
  • SMTP_HOST,发件服务器地址
  • SMTP_FROM,发件人邮箱
  • SMTP_FROM_NAME,发件人名称
  • SMTP_SECURITY,发件服务器安全设置,可选: starttls, force_tls, off
  • SMTP_PORT,发件服务器端口
  • SMTP_USERNAME,发件服务器登陆用户名
  • SMTP_PASSWORD,发件服务器登陆密码
  • SMTP_AUTH_MECHANISM,发件服务器验证机制,可选: Plain, Login, Xoath2

完整 Docker-compose.yml

将以上配置组合到一起。

version: '3'

services:
  vaultwarden:
    container_name: vaultwarden
    image: vaultwarden/server:latest
    restart: unless-stopped
    volumes:
      - ./data/:/data/
    ports:
      - XXXX:80
    environment:
      - DOMAIN=https://subdomain.yourdomain.com
      - LOGIN_RATELIMIT_MAX_BURST=10
      - LOGIN_RATELIMIT_SECONDS=60
      - ADMIN_RATELIMIT_MAX_BURST=10
      - ADMIN_RATELIMIT_SECONDS=60
      - ADMIN_TOKEN=YourReallyStrongAdminTokenHere
      - SENDS_ALLOWED=true
      - EMERGENCY_ACCESS_ALLOWED=true
      - WEB_VAULT_ENABLED=true
      - SIGNUPS_ALLOWED=false
      - SIGNUPS_VERIFY=true
      - SIGNUPS_VERIFY_RESEND_TIME=3600
      - SIGNUPS_VERIFY_RESEND_LIMIT=5
      - SIGNUPS_DOMAINS_WHITELIST=yourdomainhere.com,anotherdomain.com
      - SMTP_HOST=smtp.youremaildomain.com
      - [email protected]
      - SMTP_FROM_NAME=Vaultwarden
      - SMTP_SECURITY=SECURITYMETHOD
      - SMTP_PORT=XXXX
      - [email protected]
      - SMTP_PASSWORD=YourReallyStrongPasswordHere
      - SMTP_AUTH_MECHANISM="Mechanism"

Vaultwarden 启动!

docker-compose up
检查一下有没有报错,没问题就按Ctrl + C 退出,用下面命令让容器在后台执行。
docker-compose up -d

停止容器 docker-compose down
更新容器 docker-compose pull

配置Nginx反代

server
    {
        listen 80;
        server_name example.com;
        rewrite ^(.*) https://$host$1 permanent;
    }

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name example.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/blog;
        ssl_certificate /etc/ssl/example.cer;
        ssl_certificate_key /etc/ssl/example.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE";
        # ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        location / {
            proxy_pass  http://127.0.0.1:xxxx;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        access_log  /home/wwwlogs/bitwarden.log;
    }

将上面配置文件中的127.0.0.1:xxxx替换为实际端口。

常用操作

进入/home/bitwarden目录后运行以下命令。

  • 启动容器
    docker-compose up -d
  • 停止容器
    docker-compose down
  • 更新服务端

    cd /home/bitwarden
    docker-compose pull
    docker-compose up -d

其他

  1. 关闭网站图标
    默认开启了网站图标功能,服务端会去请求网站的图标,搭在国内服务器上面的话,可能会有一些问题。可以关闭此选项。disable_favicon.png

参考链接