ZMUKE vault 手册

Cloudflare:每组织一张管理 token

最后更新: 2026-08-17.

你正在用的那台操作机上做完即可。两台操作机定位相同,各有一份 ~/vault

互不同步。

在线阅读: https://zmuke-vault-docs.pages.dev/

铁律


0. 本机 vault

vault version
vault --business zmuke check
vault --business slaunchx check
vault --business mocalmax check

应全部 ok。未 init 的域只在你明确要求时再 vault --business <域> init


1. 补全 slaunchx 域名

Dashboard 域列表对照 CLOUDFLARE_ZONES.md,把未点名的

slaunchx zone 只把域名补进表。确认 8milex.com 不在本账号管理范围。


2. Zone ID 不预存

vault 不存 CLOUDFLARE_ZONE_ID*。用某个根域名时再查:

vault --business slaunchx run cloudflare-slaunchx-workspace-admin -- \
  sh -c 'curl -sS "https://api.cloudflare.com/client/v4/zones?name=slaunchx.cc" \
    -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN"'

必须是根域名,必须带 name=。不要把输出贴进仓库或聊天。

Dashboard 只需抄 Account ID(三组织共用)进 CLOUDFLARE_ACCOUNT_ID


3. 每组织建一张管理 token

路径: Manage Account → API Tokens → Create Token → Create Custom Token

三张名称: zmuke-edge-infraslaunchx-edge-inframocalmax-edge-infra

权限 级别
Account Cloudflare Tunnel Edit
Account Access: Apps and Policies Edit
Zone Zone Read(按域名查 Zone ID)
Zone DNS Edit
Zone Zone WAF Edit
Zone Analytics Read(安全事件排查: 请求被哪条 WAF 规则拦)
Account Cloudflare Pages Edit
Account Workers R2 Storage Edit
Account Access: Service Tokens Edit
Account Account Filter Lists Edit(WAF 引用的 IP 白名单列表)

不要加: API Tokens(能造 token 即无限提权)、Workers Scripts / KV / D1、Account Settings、

Zone Edit / Zone Settings、Billing。

Pages / R2 与 Tunnel / Access 同为账号级, 无法按组织切; 组织归属靠命名前缀

(项目/桶名带组织名)。CI 自动部署一律用低权 deploy token, 不用管理 token。

资源:

Account Resources → Include → 只选这一个账号
Zone Resources    → Include → Specific zone → 只选该组织的 zone

设 TTL。有稳定出口 IP 时加 Client IP Filtering。

已有且仍在用的 mocalmax-workers-deploy 不要重建、不要撤销。

Gitea Actions(runner mocalmax-pages)的仓库 secret 就是它。

zmuke / slaunchx 若还没有 workers token,等真有 Pages/Workers CI 再开,

不要和管理 token 合并。


4. 写入本机 vault

每条隐藏输入,一条一个键。录错用 rotate

vault --business zmuke set cloudflare-zmuke-workspace-admin CLOUDFLARE_ACCOUNT_ID
vault --business zmuke set cloudflare-zmuke-workspace-admin CLOUDFLARE_API_TOKEN
vault --business slaunchx set cloudflare-slaunchx-workspace-admin CLOUDFLARE_ACCOUNT_ID
vault --business slaunchx set cloudflare-slaunchx-workspace-admin CLOUDFLARE_API_TOKEN
vault --business mocalmax set cloudflare-mocalmax-workspace-admin CLOUDFLARE_ACCOUNT_ID
vault --business mocalmax set cloudflare-mocalmax-workspace-admin CLOUDFLARE_API_TOKEN

大脑机上若已经有同名 profile,那是另一份库。这台是空的,直接 set

不要为了「统一」去撤 Gitea 里的旧 Pages token。


5. 核对

vault --business zmuke list
vault --business slaunchx list
vault --business mocalmax list
vault --business zmuke check
vault --business slaunchx check
vault --business mocalmax check

每个 cloudflare-<组织>-workspace-admin 只有两键:

CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID


6. 对端机同步(D13: 双机同放, vault 0.3.0 起原生支持)

不再手动补录。任一台录入/轮换后, 一条命令推给对端:

vault --business <组织> sync-to <ssh别名> [application...]   # 省略应用名 = 整域

机制: 本机解密仅存内存 → SSH 加密通道 → 对端用自己的主钥重加密入库。

幂等 (同值跳过, 变值 rotate, 缺失新建), 两端审计各记一笔, 明文不落盘、

不上屏 (export-app 拒绝 TTY)。**仍然禁止 scp ~/vault/businesses/*/data**,

两库主钥保持独立。

D14 (2026-08-17): 两台 vault 保持完全镜像, 不再区分管理面/开发面。

录入或轮换后随手 sync-to 对端。0.4.0 增 delete-key / delete-app;

删除后同样两侧各删一次 (sync 不传播删除)。

首次全量镜像已完成并核对: 三域 16 应用 / 50 键两侧零差异; 旧键

CLOUDFLARE_ZONE_ID 已清; lima ~/.config/dev-env.sh 明文残留已清除,

wrangler 部署改经 vault run cloudflare-zmuke-workspace-admin 注入。


7. 只读验证

两台机各跑一遍(不打印任何值):

vault --business <组织> run cloudflare-<组织>-workspace-admin -- \
  sh -c 'curl -sS -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  "https://api.cloudflare.com/client/v4/zones?per_page=50" | head -c 200'

注意: /zones 列表因账号级权限会显示全账号 zone 名, 列表可见 ≠ 可操作,

不能作为范围判据。真判据是按 zone 的资源访问:

# 读本组织 zone 的 DNS 应 200; 读其他组织 zone 的 DNS 应 403
curl -o /dev/null -w '%{http_code}' -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  "https://api.cloudflare.com/client/v4/zones/<zone_id>/dns_records?per_page=1"

2026-08-17 已实测: 三张 token 交叉越界读均 403, 隔离生效。


8. 旧凭据废弃(新 token 验证通过后)

  1. Dashboard 撤销旧 token 族: -account-edge-zone-edge 及其它非

-edge-infra / -workers-deploy 的 API token。

  1. 大脑机 vault 删除对应旧 profile。
  2. **清除 debian-vm 的 ~/.config/dev-env.shCLOUDFLARE_API_TOKEN /

CLOUDFLARE_ACCOUNT_ID 两行**(该文件被 ~/.profile source, 全进程继承,

属 TOKENS.md 点名的历史残留), 同时在 Dashboard 撤销那枚 User API Token;

此后 wrangler 部署一律经 vault run 注入。

  1. Gitea Actions 里的 mocalmax-workers-deploy 不动。

勾选

操作员手册,不要公开传播。不含 Token / Account ID / Zone ID。HANDOFF 不在此站。