Cloudflare:每组织一张管理 token
最后更新: 2026-08-17.
在你正在用的那台操作机上做完即可。两台操作机定位相同,各有一份 ~/vault,
互不同步。
在线阅读: https://zmuke-vault-docs.pages.dev/
铁律
- 值只经
vault set隐藏录入,不进聊天 / argv / 仓库。 - Zone Resources 只选该组织的 Specific zone,禁止 All zones。
- 不为
8milex.com发 token。 - 不要创建 Global API Key。
- 不要动 已写入 mocalmax Gitea 的
CLOUDFLARE_API_TOKEN(Actions 在用)。
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-infra、slaunchx-edge-infra、mocalmax-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
zmuke-edge-infra→ 只zmuke.commocalmax-edge-infra→ 只mocalmax.ccslaunchx-edge-infra→ 全部 slaunchx zone(可先勾已点名的,其余补名后再 Edit 加进资源范围)
设 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_TOKEN、CLOUDFLARE_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 验证通过后)
- Dashboard 撤销旧 token 族:
-account-edge、-zone-edge及其它非
-edge-infra / -workers-deploy 的 API token。
- 大脑机 vault 删除对应旧 profile。
- **清除 debian-vm 的
~/.config/dev-env.sh中CLOUDFLARE_API_TOKEN/
CLOUDFLARE_ACCOUNT_ID 两行**(该文件被 ~/.profile source, 全进程继承,
属 TOKENS.md 点名的历史残留), 同时在 Dashboard 撤销那枚 User API Token;
此后 wrangler 部署一律经 vault run 注入。
- Gitea Actions 里的
mocalmax-workers-deploy不动。
勾选
操作员手册,不要公开传播。不含 Token / Account ID / Zone ID。HANDOFF 不在此站。