记忆一隅

密码管理器bitwarden服务搭建

2022-08-14 · 6 min read
笔记

Password manager bitwarden service setup

bitwarden支持自托管和官网托管,官网服务服务器在境外,访问速度较慢,这里选择自托管。vaultwarden是bitwarden的服务端开源实现,原名bitwarden_rs。

部署

从docker hub 拉取vaultwarden镜像

docker pull vaultwarden/server

为vaultwarden创建一个文件夹,用于存放vaultwarden的数据,包括密码数据库等。然后运行镜像。

mkdir /data/bitwarden 
docker run  -d \
            --name vaultwarden \
            -p 8192:80 \
            -p 3012:3012 \
            -e SIGNUPS_ALLOWED=true \
            -e WEB_VAULT_ENABLED=true \
            -e DOMAIN=https://mydomain.cn \
            -v /data/bitwarden:/data \
            vaultwarden/server

上面命令的各个参数含义如下:
-d 在后台运行
--rm 容器停止运行后,自动删除容器文件
--name vaultwarden容器的名字为vaultwarden
-p 8192:80 容器的端口80映射到8192
-p 3012:3012 容器的端口3012映射到3012
-e SIGNUPS_ALLOWED=true 设置环境变量SIGNUPS_ALLOWED=true允许用户注册
-e WBE_VAULT_ENABLE=true 设置环境变量WBE_VAULT_ENABLE=true
-e DOMAIN=https://mydomain.cn设置域名,需要替换成自己申请的域名
-v /data/bitwarden:/data 容器的/data/目录映射到宿主机的/data/bitwarden目录

这样vaultwarden就跑起来了。为了后续重启运行方便,可以将运行命令保存为一个sh脚本。

配置反向代理与HTTPS

bitwarden为了保证密码安全,必须使用https访问密码库,为了便于访问与启用https,这里我使用caddy进行反代。与caddy相关的使用可以参考我的文章Caddy2安装与托管静态博客,我的caddy配置文件如下:

(TLS_CONFIG) {
    # TLS 配置采用 https://mozilla.github.io/server-side-tls/ssl-config-generator/ 生成,SSL Labs 评分 A+
    protocols tls1.2 tls1.3
    ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
}

# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile
(LOG) {
    log {
        output file "{args.0}" {
                roll_size     500MiB
                roll_local_time
                roll_keep     20
                roll_keep_for 30d
        }
    }
}


(HSTS) {
    # HSTS (63072000 seconds)
    header / Strict-Transport-Security "max-age=63072000"
}

(ERROR_HANDLE) {
        handle_errors {
                @404 {
                        expression {http.error.status_code} == 404
                }
                handle @404 {
                        rewrite * /404.html
                        file_server
                }
        }
}

(GENERAL_CONFIG) {
        tls xxx@xxx.com {
            import TLS_CONFIG    
        }
        # HSTS
        import HSTS
        # 压缩支持
        encode zstd gzip
        # 错误处理
        import ERROR_HANDLE
}

# globe config
{
        servers :443 {
                protocol {
                                experimental_http3
                } 
        }
}

myconfig.com {
        reverse_proxy /notifications/hub {
                to localhost:3012
        }
        reverse_proxy /notifications/hub/negotiate {
                to localhost:8192
        }

        reverse_proxy localhost:8192 {
                # 将真正的远程 IP 发送给 Rocket,以便 vaultwarden 可以将其
                # 放入日志,以便 fail2ban 可以禁止正确的 IP。
                header_up X-Real-IP {remote_host}
        }
        header / {
                # 禁止在框架内呈现网站 (clickjacking protection)
                X-Frame-Options "DENY"
                # 防止搜索引擎编制索引(可选)
                X-Robots-Tag "none"
                # 服务器名称移除
                -Server
        }
        import LOG "/home/ubuntu/database/logs/myconfig.com.log"
        import GENERAL_CONFIG
}

# 引入其他具体的站点配置
import /etc/caddy/*.caddy

其中3012端口是为了通过websocket进行通知,WebSocket 通知用于将发生的一些相关事件通告给 Bitwarden 的浏览器和桌面客户端,例如密码数据库中有条目被修改了或被删除了。要启用 WebSockets 通知,必须使用外部反向代理,并且必须执行以下配置操作:

  • 将 /notifications/hub 端点路由到 WebSocket 服务器,默认在 3012 端口,确保传递 Connection 和 Upgrade 头。(提示:可以使用 WEBSOCKET_PORT 变量来更改端口)
  • 将所有其他(包括 /notifications/hub/negotiate)路由到标准 Rocket 服务器,默认在 80 端口上。
  • 如果使用 Docker,则可能还需要使用 -p 标识来映射两个端口。

配置完成后,就可以在配置的域名页面上访问bitwarden服务了。

禁用注册与启用管理页面

默认情况下,可以访问的任何人均可以注册新的账户,在我们自己注册完账号后,为了保证安全与账号不被滥用,要禁用该功能,请将 SIGNUPS_ALLOWED 环境变量设置为 false,在docker run命令后添加一行:

-e SIGNUPS_ALLOWED=false \

但是Vaultwarden 管理员可以通过管理页面邀请任何人(前提需要配置好SMTP),不受以上限制。

要启用管理页面,需要设置一组身份验证令牌。该令牌可以是任何字符,但建议使用随机生成的长字符串。在docker run命令后添加一行:

-e ADMIN_TOKEN=some_random_token_as_per_above_explanation \

重启docker,然后输入yourconfig.com/admin就可以进入管理页面了,在管理页面中可以配置smtp,邀请其他人注册以及其他更多配置可以进行选择。

网络连接异常处理

如果在vaulatwarden管理员页面的Diagnostics选项中,发现Internet access状态为No(下图为正确状态)

那么需要将docker网络所在网段的防火墙放开,按如下配置:

sudo ufw allow from 172.17.0.0/16
sudo ufw allow to  172.17.0.0/16

数据的备份

密码库保存着我们的所有密码,如果出现问题,那么密码将全部丢失,所以必须做好备份,这里我是采用将docker数据文件夹整体加密压缩后,定时备份到腾讯云cos中。同时通过cos的生命周期设置,实现对过期备份的自动删除。脚本配置如下:

#!/bin/sh
currentdate=$(date +%Y%m%d) #获取当前时间
#压缩指定目录到日期压缩包,密码为backupdata
zip -P backupdata \
    -r backup_${currentdate}.zip \
    /data/bitwarden \

coscmd upload backup_${currentdate}.zip /
rm backup_${currentdate}.zip 

coscmd为腾讯云cos工具,需要自行安装,参见:https://cloud.tencent.com/document/product/436/10976

然后设置crontab,定时在每天凌晨进行一次数据备份:

15 4 * * * bash /home/ubuntu/backup/backup.sh

下图为cos备份生命周期设置:

https://zhuanlan.zhihu.com/p/349524829
https://rs.ppgg.in/