社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

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

云原生实验室 • 2 年前 • 380 次点击  


本文转自 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 进行注册

Register Yubikey API

注册成功后,妥善保管您的 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

写入以下配置

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 软件库[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

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

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 保存

Admin Access

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

使用 Bitwarden

第一次使用,在部署的 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 都不需要!



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


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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/150419
 
380 次点击