❝本文转自 Dejavu Moe 的博客,原文:https://www.dejavu.moe/posts/selfhosted-bitwarden-with-cloudflare-tunnel/,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang
两年前,我就想自托管 Bitwarden 密码管理器了,但是直到 2022 年快结束的现在,我才真正动手。在搭建好 Vaultwarden 服务以后,这两天我就干了三件事:
把七年里 Google Chrome 保存的密码导入到 Vaultwarden
删除所有 Google Chrome 保存的密码
整理密码:登录这些年注册过的网站,删除无法访问的网站账号,使用 Bitwarden 生成新的用户名/密码
众所周知,Bitwarden[1] 是个基础免费、增值付费、跨平台、自由开源的 密码管理器,官方提供了 服务端[2] 可部署源码,但是它有点太过于庞大。
Vaultwarden[3](原名 Bitwarden_RS)是官方服务端几乎等价的最佳替代品,它占用资源更低并且拥有更丰富的功能。在本文中,我们约定服务端叫做 Vaultwarden,客户端(包括浏览器拓展)叫做 Bitwarden。
社区的大牛们使用 Rust 重写了 Bitwarden API 服务端,除支持几乎所有的官方服务端特性外,它还带给我们一些原本 Premium 用户才能使用的特性,比如:
对组织的支持
文件作为附件(支持加密)
保险库 API 支持
高级 2FA 支持:Yubikey OTP, FIDO U2F, Duo…
Bitwarden TOTP 支持
紧急访问
……
为什么使用 Cloudflare Tunnel?
❝我们的口号是什么?安全!安全!还是 TMD 安全!
部署 Vaultwarden 的实例通过 Cloudflare Tunnel[4] 访问,我们就无需关心服务器安全、反向代理、SSL 证书这些问题了,本文以一台刚 DD 重装纯净系统的 Debian GNU/Linux 11 (bullseye) 云服务器为例
通过 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
开始安装
$ 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 的话,Vaultwarden 还支持 Yubikey OTP 的两步验证方法,假如您不幸地将出厂卡槽 (Slot 1) 的 OTP 信息删除了的话,可以参考我的 Yubikey 转运日志及上手指南 - OTP[5] 部分,重新注册新的 OTP 信息并在 Yubikey 的官方服务器上注册。
否则,您只需要打开 Yubico API Key Signup[6] 网站,输入您的邮箱和 Yubikey OTP 点击 Get API key 进行注册
Register Yubikey API注册成功后,妥善保管您的 API 信息
Get Yubikey API为了备份和迁移方便,本文使用 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
写入以下配置
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
# 允许创建组织的用户邮箱
[email protected]
# 使用 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
[email protected]
SMTP_FROM_NAME=Vaultwarden Service
# 根据邮箱修改
SMTP_SECURITY=force_tls
# SMTP 端口
SMTP_PORT=465
[email protected]
# 密码用 '' 包围起来
SMTP_PASSWORD='Y6qMP7LVgx+JOzYa3kKbOq8q'
SMTP_TIMEOUT=15
开始启动 Vaultwarden 容器了
$ sudo docker compose up -d
查看 Vaultwarden 是否启动
$ sudo docker ps -a
为了方便以后更新建议添加 cloudflared 软件库[8],以 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[9] 控制台,新建一个 Cloudflare Tunnel,选择系统和架构,复制右边的安装服务命令执行
Install Cloudflared Service然后给这个 Tunnel 添加 Public Hostname
Add Service Port[可选] 添加 Websocket Public Hostname
❝Add Websocket Tunnel通过 Websocket 主动向桌面客户端推送密码库更新,此处选择 TCP 类型应该是错误的,更多信息可查看 Vaultwarden Wiki - Enabling WebSocket Notifications[10]
[推荐] 保护 Vaultwarden 管理员后台路径
❝默认的管理后台是
https://warden.yourdomain.com/admin
,只能通过之前设置的 Admin Token 登录,为了防止这个管理入口被人恶意爆破,此处我们可以使用 Cloudflare Zero Trust 设置保护策略。
在 Cloudflare Zero Trust[11] 控制台左侧导航栏的 Access 里的 Applications ⇒ Add an applications 添加一个访问应用,类型选择 Self-hosted,选择托管 Vaultwarden 的域名,路径写 admin 保存
Admin Access接着在后面 Policies 和 Authentication 按照你自己的要求设置访问策略和验证方式即可,这样在访问管理员后台的时候,会先通过 Cloudflare Zero Trust 访问策略才能继续。
第一次使用,在部署的 Vaultwarden 上按照流程注册账号、设置记得住且足够强的 Master Password、添加几种保护账号的两步验证方式
Add 2FA现在进入 Bitwarden 下载页面[12] 选择使用的客户端和浏览器插件安装后就可以开始使用啦!
客户端支持:Windows, macOS, Linux, iOS, iPadOS, Android
浏览器支持:Google Chrome, Safari, Opera, Edge, Brave, Tor…
无论是哪种客户端/浏览器,将自托管服务器 URL 修改为您的 Vaultwarden 服务地址
Server URL在 iPhone/iPad/Android 上可以设置 Bitwarden 为默认的密码自动填充工具(部分国产魔改 Android 可能有所限制)
Set Default Autofill在 iOS/iPadOS 上的 Bitwarden 客户端设置里,按照 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]
Bitwarden: https://bitwarden.com/
[2]服务端: https://github.com/bitwarden/server
[3]Vaultwarden: https://github.com/dani-garcia/vaultwarden
[4]Cloudflare Tunnel: https://www.cloudflare.com/products/tunnel/
[5]Yubikey 转运日志及上手指南 - OTP: https://www.dejavu.moe/posts/yubikey-setup/#otp
[6]Yubico API Key Signup: https://upgrade.yubico.com/getapikey/
[7]完整的示例文件: https://github.com/dani-garcia/vaultwarden/blob/main/.env.template
[8]cloudflared 软件库: https://pkg.cloudflare.com/index.html
[9]Cloudflare Zero Trust: https://one.dash.cloudflare.com/
[10]Vaultwarden Wiki - Enabling WebSocket Notifications: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-WebSocket-notifications
[11]Cloudflare Zero Trust: https://one.dash.cloudflare.com/
[12]下载页面: https://bitwarden.com/download/
你可能还喜欢
点击下方图片即可阅读
我将 9 个 ChatGPT 账号接入微信,我现在整个人都麻了...
2022-12-10
AI 对话模型被网友玩坏了!这次还可以运行 Docker 容器...
2022-12-04
JVM 内存与 K8s 容器内存不一致引发的 OOMKilled 总结
2022-12-01
Tailscale ACL 访问控制策略完全指南!
2022-11-28
云原生是一种信仰
关注公众号
后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!
点击 "阅读原文" 获取更好的阅读体验!
发现朋友圈变“安静”了吗?