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

cdf489698ebb6792ead9e680708ed31f.gif

本文转自 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) 云服务器为例

安装 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

开始安装

$ 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[5] 部分,重新注册新的 OTP 信息并在 Yubikey 的官方服务器上注册。

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

0f6067ecb0667620e4ae4c2668e159ab.png
Register Yubikey API

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

ad7c94766cd25b028bf25319de266b22.png
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

写入以下配置

version: '3.3'services:vaultwarden:image: vaultwarden/server:alpinecontainer_name: vaultwardenrestart: alwaysenvironment:- TZ=Asia/Shanghaiports:- 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 软件库[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,选择系统和架构,复制右边的安装服务命令执行

0a2ef4f302f5055f5a3c197b22509930.png
Install Cloudflared Service

然后给这个 Tunnel 添加 Public Hostname

e45b0adbc4a50c1660ab571a7f85ae3c.png
Add Service Port

[可选] 添加 Websocket Public Hostname

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

c8daaaf3299e04d82424b6c885e45a31.png
Add Websocket Tunnel

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

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

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

0b4e5d4503fca0255fcb2cec123f7788.png
Admin Access

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

使用 Bitwarden

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

d5e646ce970c00640e7ed89a9462217e.png
Add 2FA

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

  • 客户端支持:Windows, macOS, Linux, iOS, iPadOS, Android

  • 浏览器支持:Google Chrome, Safari, Opera, Edge, Brave, Tor…

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

d4d1308f3b88c39666994caf8d1b9b78.png
Server URL

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

99c31312ebed9f727383ef9d61d928cd.png
Set Default Autofill

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

82b19cac5388c071cd35912d8bc99eda.png
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/

a74c3cfb5e07222ebe1d4c310cdda34d.gif

ba24bdef52eff6c8ae640d56e9dedc62.png

你可能还喜欢

点击下方图片即可阅读

我将 9 个 ChatGPT 账号接入微信,我现在整个人都麻了...

2022-12-10

53a850b645288c944e4a4c12367e4be6.jpeg

AI 对话模型被网友玩坏了!这次还可以运行 Docker 容器...

2022-12-04

9a09c6584349295f34ac71bf7b58359a.jpeg

JVM 内存与 K8s 容器内存不一致引发的 OOMKilled 总结

2022-12-01

5e0a9c7562eb12fe67a78f5cdbdb8cd1.jpeg

Tailscale ACL 访问控制策略完全指南!

2022-11-28

f3e55257e429a67a34ac51714788ad15.jpeg

482c0f218f72418acfcb1a0f882d3433.gif

云原生是一种信仰 🤘

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

876eb8df96e9cfeb1b59d5a52fe8f366.gif

fac7731e9f9cc3d25c886704334136e7.gif

点击 "阅读原文" 获取更好的阅读体验!

发现朋友圈变“安静”了吗?

5294a9feb90d6d7335535f1bef1e0fb9.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41016.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nopepad++使用教程

Contents 1 介绍2 下载&安装3 Notepad配置(Python) 3.1 配置制表符3.2 自动完成3.3 配置调试工具4 添加辅助插件5 PythonScript(控制台插件) 5.1 日常使用5.2 多视图模式5.3 显示符号5.4 快捷键大全6 参考链接 介绍 Notepa…

将 Quicker 搜索功能打造成专属于你的 Windows 启动器

在 macOS 平台上,有许多优秀的启动器,如老牌双雄 Alfred、Launchbar 和新秀 Raycast。反观 Windows 平台,则有 uTools、Listary、Wox 等应用,它们在基础功能上表现不错,但受限于应用生态,可拓展性都较弱。Q…

文心一言 VS 讯飞星火 VS chatgpt (28)-- 算法导论5.1 3题

三、假设你希望以1/2的概率输出0与 1。你可以自由使用一个输出0或1的过程 BIASED-RANDOM。它以某概率 p 输出1&#xff0c;概率 1-p 输出0&#xff0c;其中 0<p<1 &#xff0c;但是 p 的值未知。请给出一个利用 BIASED-RANDOM 作为子程序的算法&#xff0c;返回一个无偏的…

学成在线案例——黑马程序员pink老师\思路讲解\完整源代码

本文为跟随B站黑马程序员pink老师学习CSS时所写&#xff0c;文章讲解了学成在线首页的制作思路&#xff0c;并贴出了源代码&#xff0c;作为学习笔记分享给大家 如有错误&#xff0c;欢迎指出。如有侵权&#xff0c;联系删除 文章目录 1. 案例准备工作2. CSS属性书写顺序3. 页面…

文心一言 VS 讯飞星火 VS chatgpt (62)-- 算法导论6.5 1题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;62&#xff09;-- 算法导论6.5 1题 一、试说明 HEAP-EXTRACT-MAX在堆A(15&#xff0c;13&#xff0c;9&#xff0c;5&#xff0c;12&#xff0c;8&#xff0c;7&#xff0c;4&#xff0c;0&#xff0c;6&#xff0c;2&#xff0c…

文心一言 VS 讯飞星火 VS chatgpt (45)-- 算法导论6.1 3题

三、证明:在最大堆的任一子树中&#xff0c;该子树所包含的最大元素在该子树的根结点上。 文心一言&#xff1a; 在最大堆中&#xff0c;根结点是整个堆中最大元素的孩子&#xff0c;因此它包含的最大元素是在该子树的根结点上。 我们可以通过递归的方式证明任意子树中的最大…

文心一言 VS 讯飞星火 VS chatgpt (29)-- 算法导论5.2 1题

一、在 HIRE-ASSISTANT 中&#xff0c;假设应聘者以随机顺序出现&#xff0c;你正好雇用一次的概率是多少&#xff1f;正好雇用 n 次的概率是多少? 文心一言&#xff1a; 讯飞星火&#xff1a; 华为盘古&#xff1a; 在HIRE-ASSISTANT中&#xff0c;假设应聘者以随机顺序出现…

文心一言 VS 讯飞星火 VS chatgpt (34)-- 算法导论5.3 1题

一、Marceau 教授不同意引理 5.5 证明中使用的循环不变式。他对第1次送代之前循环不变式是否为真提出质疑。他的理由是&#xff0c;我们可以很容易宣称一个空数组不包含0排列。因此一个空的子数组包含一个0排列的概率应是 0&#xff0c;从而第 1次选代之前循环不变式无效。请重…

开源AI智能客服系统源码 人工智能对话软件源码 完整程序包+搭建教程

分享一个开源AI智能客服系统源码、人工智能对话软件源码&#xff0c;电脑端手机端详细的搭建教程&#xff0c;源码开源可二开。 功能介绍&#xff1a; 是一款人工智能对话系统&#xff0c;它可以陪你聊天&#xff0c;帮你写文章&#xff0c;帮你写论文&#xff0c;帮你写代码…

文心一言 VS 讯飞星火 VS chatgpt (42)-- 算法导论5.4 6题

六、假设将n个球投人 n 个箱子里&#xff0c;其中每次投球独立&#xff0c;并且每个球等可能落入任何箱子。空箱子的数目期望是多少?正好有一个球的箱子的数目期望是多少? 文心一言&#xff1a; 这是一个典型的概率问题。首先&#xff0c;我们可以通过简单的计算来理解问题…

文心一言 VS 讯飞星火 VS chatgpt (56)-- 算法导论6.3 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;56&#xff09;-- 算法导论6.3 2题 对于 BUILD-MAX-HEAP 中第 2行的循环控制变量 i 来说&#xff0c;为什么我们要求它是从A.length/2到1递减&#xff0c;而不是从1到A.length/2递增呢? 文心一言&#xff1a; 在 BUILD-MAX-HE…

文心一言 VS 讯飞星火 VS chatgpt (54)-- 算法导论6.2 6题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;53&#xff09;-- 算法导论6.2 5题 六、证明:对一个大小为 n的堆&#xff0c;MAX-HEAPIFY 的最坏情况运行时间为 Ω(Ign)。(提示对于n个结点的堆&#xff0c;可以通过对每个结点设定恰当的值&#xff0c;使得从根结点到叶结点路径…

文心一言 VS 讯飞星火 VS chatgpt (63)-- 算法导论6.5 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;63&#xff09;-- 算法导论6.5 2题 二、试说明 MAX-HEAP-INSERT(A&#xff0c;10)在堆A(15&#xff0c;13&#xff0c;9&#xff0c;5&#xff0c;12&#xff0c;8&#xff0c;7&#xff0c;4&#xff0c;0&#xff0c;6&#xf…

文心一言 VS 讯飞星火 VS chatgpt (43)-- 算法导论5.4 7题

七、为使特征序列长度的下界变得更精确&#xff0c;请说明在 n 次硬币的公平抛掷中&#xff0c;不出现比Ign - 2lglgn 更长的连续正面特征序列的概率小于 1/n。 文心一言&#xff1a; 在 n 次硬币的公平抛掷中&#xff0c;每个硬币正、反面朝上的概率均为 1/2。让我们考虑一个…

商汤AI象棋机器人到底谁在买?北大象棋大师已签收

金磊 衡宇 发自 凹非寺量子位 | 公众号 QbitAI 郭晶晶家的象棋家教——没错&#xff0c;就是商汤AI象棋机器人“元萝卜”&#xff08;SenseRobot&#xff09;&#xff0c;近日正式现货发售。 从近2个月前开始预售的那刻起&#xff0c;各种讨论就萦绕在它周围&#xff1a; AI象棋…

【Tensorflow+自然语言处理+LSTM】搭建智能聊天客服机器人实战(附源码、数据集和演示 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、自然语言处理与智能 自然语言处理技术是智能客服应用的基础&#xff0c;在自然语言处理过程中&#xff0c;首先需要进行分词处理&#xff0c;这个过程通常基于统计学理论&#xff0c;分词的精细化可以提升智能客服的语…

Python自动发抖音脚本教程(1:介绍和源码)

如果你很懒,不想自己一步一步的手动操作发抖音。希望自动化一键操作,那么你来这就对了。 本脚本可以模拟人工操作网页,自动发送抖音。不是纯接口的模式哦,如果符合你的期望请继续往后看。 【订阅获取源码,源码在最后】 我们先看效果: 首先我们准备好视频文件和封面。…

GPT-4 插件和插件化的思考

一、前言 最近 ChatGPT 的 Plus 用户在 GPT-4 中新增了插件功能&#xff0c; GPT 在插件的加持下如虎添翼。 那么常用的插件是哪些&#xff1f;插件化是什么&#xff1f;插件化有什么好处&#xff1f;插件化和我们日常开发中哪些设计模式思想一致&#xff1f;GPT 的插件还存在…

苹果汽车售价或低于 10 万美元;微软将开发一站式“超级应用”;Adobe 将销售 AI 生成图片|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

其他:管理员账户已被禁用

windows常用的命令&#xff1a; winr 运行 netplwiz 点高级--再点高级&#xff08;进入本地用户和组&#xff09; winr 运行 services.msc 打开 服务(本地) winr 运行 msconfig 进入系统配置 &#xff08;一般用户安全模式进入退出&#xff09; winr 运行 gpedit.msc &…