跳到主要内容
  1. 所有文章/

初探 Cloudflare 零信任 - 通过 Docker 部署 Bitwarden 密码管理器

·2655 字·约 6 分钟

前言 #

两年前,我就想自托管 Bitwarden 密码管理器了,但是直到 2022 年快结束的现在,我才真正动手。在搭建好 Vaultwarden 服务以后,这两天我就干了三件事:

  • 把七年里 Google Chrome 保存的密码导入到 Vaultwarden
  • 删除所有 Google Chrome 保存的密码
  • 整理密码:登录这些年注册过的网站,删除无法访问的网站账号,使用 Bitwarden 生成新的用户名/密码1

众所周知,Bitwarden 是个基础免费、增值付费、跨平台、自由开源2密码管理器,官方提供了 服务端 可部署源码,但是它有点太过于庞大。

Vaultwarden(原名 Bitwarden_RS)是官方服务端几乎等价的最佳替代品,它占用资源更低并且拥有更丰富的功能。在本文中,我们约定服务端叫做 Vaultwarden,客户端(包括浏览器拓展)叫做 Bitwarden3

社区的大牛们使用 Rust 重写了 Bitwarden API 服务端,除支持几乎所有的官方服务端特性外,它还带给我们一些原本 Premium 用户才能使用的特性,比如:

  • 对组织的支持
  • 文件作为附件(支持加密)
  • 保险库 API 支持
  • 高级 2FA 支持:Yubikey OTP, FIDO U2F, Duo…
  • Bitwarden TOTP 支持
  • 紧急访问
  • ……

为什么使用 Cloudflare Tunnel?

我们的口号是什么?安全!安全!还是 TMD 安全!

部署 Vaultwarden 的实例通过 Cloudflare Tunnel 访问,我们就无需关心服务器安全、反向代理、SSL 证书这些问题了,本文以一台刚 DD 重装纯净系统的 Debian GNU/Linux 11 (bullseye) 云服务器为例

安装 Docker #

通过 SSH 登录云服务器后,先刷新软件源安装一些基础软件包

sudo apt upate && \
sudo apt upgrade && \
sudo apt install -y wget curl vim ca-certificates gnupg lsb-release

导入 Docker 官方的 GPG 密钥

sudo mkdir -p /etc/apt/keyrings  && \
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

设置 Docker 存储库

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

开始安装4

sudo apt update && \
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

验证安装

sudo docker version
sudo docker compose version

现在 Docker 和 docker compose 就安装好了。

注册 Yubikey API【可选】 #

要是您有 Yubikey 的话,Vaultwarden 还支持 Yubikey OTP 的两步验证方法,假如您不幸地将出厂卡槽 (Slot 1) 的 OTP 信息删除了的话,可以参考我的 Yubikey 转运日志及上手指南 - OTP 部分,重新注册新的 OTP 信息并在 Yubikey 的官方服务器上注册。

否则,您只需要打开 Yubico API Key Signup 网站,输入5 您的邮箱和 Yubikey OTP 点击 Get API key 进行注册

Register Yubikey API
Register Yubikey API

注册成功后,妥善保管您的 API 信息

Get Yubikey API
Get Yubikey API

部署 Vaultwarden #

为了备份和迁移方便,本文使用 docker compose 部署

# 返回用户主目录
# 新建 vaultwarden 目录并进入
cd && \
mkdir -p container/vaulwarden && \
cd container/vaulwarden

# 创建数据映射目录和部署配置文件
touch docker-compose.yml vault.env && \ 
mkdir vault-data

docker-compose.yml 包含部署 Vaultwarden 的配置,vault.env 是它的环境变量

编辑 docker-compose.yml 文件

vim docker-compose.yml

写入以下配置6

version: '3.3'

services:
  vaultwarden:
    image: vaultwarden/server:alpine
    container_name: vaultwarden
    restart: always
    environment:
    - TZ=Asia/Shanghai
    ports:
    - 1314:80	 # Vaultwarden 映射端口
    - 3012:3012  # Websocket 映射端口
    volumes:
    - './vault-data:/data'
    env_file:
    - ./vault.env  # 环境变量路径

编辑环境变量 vault.env 文件,下面是我的配置文件,您可以参考 完整的示例文件 修改7

IP_HEADER=none
WEBSOCKET_ENABLED=true
WEBSOCKET_ADDRESS=0.0.0.0
WEBSOCKET_PORT=3012
SENDS_ALLOWED=true
# 启用紧急访问
EMERGENCY_ACCESS_ALLOWED=true
# 日志等级
LOG_LEVEL=warn

# 注册需要验证?
SIGNUPS_VERIFY=true
SIGNUPS_VERIFY_RESEND_TIME=3600
SIGNUPS_VERIFY_RESEND_LIMIT=3
# 允许注册的域名白名单(你的邮箱域名)
SIGNUPS_DOMAINS_WHITELIST=yourdomain.com
# 允许创建组织的用户邮箱
ORG_CREATION_USERS=you@yourdomain.com
# 使用 openssl rand -base64 48 命令快速生成管理员令牌
ADMIN_TOKEN=eefPNlNPHiA13sXw2z8B6/og7K/lTzNo0KFrUKjB9xHzpYtiUTmAa9+NmLPCILcB
# 允许邀请?
INVITATIONS_ALLOWED=true
# 邀请名称
INVITATION_ORG_NAME=Vaultwarden
# 邀请失效时间(时)
INVITATION_EXPIRATION_HOURS=12
# 密码提示?
SHOW_PASSWORD_HINT=false
# Vaultwarden 域名
DOMAIN=https://warden.yourdomain.com

# 替换您的 Yubikey API 信息(没有请注释掉)
YUBICO_CLIENT_ID=87654
YUBICO_SECRET_KEY=Sd1yGCsWonKyDAkyhObC1khs2QDJQYo1arrfDmg=
# YUBICO_SERVER=http://yourdomain.com/wsapi/2.0/verify

# 设置您的 SMTP 发送邮箱信息
SMTP_HOST=smtp.xxx.com
SMTP_FROM=warden@yourdomain.com
SMTP_FROM_NAME=Vaultwarden Service
# 根据邮箱修改
SMTP_SECURITY=force_tls
# SMTP 端口
SMTP_PORT=465
SMTP_USERNAME=warden@yourdomain.com
# 密码用 '' 包围起来
SMTP_PASSWORD='Y6qMP7LVgx+JOzYa3kKbOq8q'
SMTP_TIMEOUT=15

开始启动 Vaultwarden 容器了

sudo docker compose up -d

查看 Vaultwarden 是否启动

sudo docker ps -a

安装 Cloudflared #

为了方便以后更新建议添加 cloudflared 软件库,以 Debian 11 (Bullseye) 为例

# 导入 GPG Key
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

# 添加软件库
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bullseye main' | sudo tee /etc/apt/sources.list.d/cloudflared.list

# 安装 cloudflared
sudo apt update && sudo apt install -y cloudflared

登录 Cloudflare Zero Trust 控制台,新建一个 Cloudflare Tunnel,选择系统和架构,复制右边的安装服务命令执行

Install Cloudflared Service
Install Cloudflared Service

然后给这个 Tunnel 添加 Public Hostname

Add Service Port
Add Service Port

[可选] 添加 Websocket Public Hostname

通过 Websocket 主动向桌面客户端推送密码库更新,此处选择 TCP 类型应该是错误的8 ,更多信息可查看 Vaultwarden Wiki - Enabling WebSocket Notifications

Add Websocket Tunnel
Add Websocket Tunnel

[推荐] 保护 Vaultwarden 管理员后台路径

默认的管理后台是 https://warden.yourdomain.com/admin,只能通过之前设置的 Admin Token 登录,为了防止这个管理入口被人恶意爆破,此处我们可以使用 Cloudflare Zero Trust 设置保护策略。

Cloudflare Zero Trust 控制台左侧导航栏的 Access 里的 Applications ⇒ Add an applications 添加一个访问应用,类型选择 Self-hosted,选择托管 Vaultwarden 的域名,路径写 admin 保存

Admin Access
Admin Access

接着在后面 Policies 和 Authentication 按照你自己的要求设置访问策略和验证方式即可,这样在访问管理员后台的时候,会先通过 Cloudflare Zero Trust 访问策略才能继续。

使用 Bitwarden #

第一次使用,在部署的 Vaultwarden 上按照流程注册账号、设置记得住且足够强的 Master Password、添加几种保护账号的两步验证方式

Add 2FA
Add 2FA

现在进入 Bitwarden 下载页面 选择使用的客户端和浏览器插件安装后就可以开始使用啦!

  • 客户端支持:Windows, macOS, Linux, iOS, iPadOS, Android
  • 浏览器支持:Google Chrome, Safari, Opera, Edge, Brave, Tor…

无论是哪种客户端/浏览器,将自托管服务器 URL 修改为您的 Vaultwarden 服务地址

Server URL
Server URL

在 iPhone/iPad/Android 上可以设置 Bitwarden 为默认的密码自动填充工具(部分国产魔改 Android 可能有所限制)

Set Default Autofill
Set Default Autofill

在 iOS/iPadOS 上的 Bitwarden 客户端设置里,按照 Add extension 提示添加拓展,现在就可以完美使用了!

Add Extension
Add Extension

最后 #

这几天体验下来真的不错,每个设备上的 Bitwarden 客户端可以设置密码库定时锁定(1~5 分钟都可以)。然后可以用 TouchID、FaceID、Windows Hello 等生物识别方式解锁密码库,非常方便!

此外,这个方案可以也可以在你家里的 NAS、树莓派(参考官方文档选择镜像)、All in One 设备上部署,而完全不需要考虑公网 IP、DDNS、内网穿透、反向代理……

用户名生成和密码生成都支持自定义规则,以后终于不用苦想用户名了;Bitwarden Sent 功能很赞,可以发送文本或文件(最大支持 500MB),设置访问策略、阅后即焚、定时删除……

如果要更新 Vaultwarden Docker 容器

cd && cd container/vaulwarden \
&& sudo docker compose down \
&& sudo docker compose pull \
&& sudo docker compose up -d

别忘记定期备份你的 Vaultwarden 哦,如果使用其他数据库后端的,数据库也要单独备份!


  1. 总共保存了 300 多个不同网站的密码,剔除失效网站的账号,现在只剩下 100 个出头了 ↩︎

  2. 服务端、客户端、浏览器拓展全部开放源码 ↩︎

  3. 我们使用的服务来自于 Bitwarden 官方人员以及 Vaultwarden 社区贡献者的辛勤工作,向他们表示感谢! ↩︎

  4. 此处 docker compose 作为 docker 插件安装,使用命令为 docker compose,如果你的 docker compose 是独立安装的,使用命令应该为 docker-compose ↩︎

  5. 选中 Yubikey OTP 输入框,触摸一下 Yubikey 即可,至于短按 (Slot 1) 还是长按 (Slot 2) 取决于您的 Yubikey OTP 卡槽(出厂是 Slot 1) ↩︎

  6. 我选用的 Alpine 镜像标签,对于个人来说绝对够用了,可以参考 如何选择 容器镜像 ↩︎

  7. 本文使用的 SQLite 数据库,对于个人和家庭来说一般够用了,如果您想要使用其他数据库可以参考 项目 Wiki 里的 Database 章节 ↩︎

  8. Cloudflare 社区 上了解到,Cloudflare Tunnel 应该支持 Websocket ,需要在服务器修改 Cloudflared 的配置文件,URL 开头应该类似这样: ws://localhost:port ↩︎

Dejavu Moe
作者
Dejavu Moe
Not for success, just for growing.