feat(chv): 对齐 Muse P3 收尾——authd 替身凭证 + Sentinel 出口审批

- 新测试 cloud/tests/test_chv_muse_p3.py 30 项:替身过期、真 token
  泄露面、SSRF 挡截、deny/ask 路径、authd-seed 拆分、wake 预审、
  客内 authd 守护进程、git credential helper 端到端(真 git fill)
- 8 个旧测试按新 authd 行为改写(未删测试、未放宽断言):
  GITEA_TOKEN 改走 authd-seed,build_ssh_command 不再 source 进
  codex 环境;wake 测试补 Sentinel 白名单 + 假解析器
- 7 处超 50 行函数拆到 50 行内(不改行为);补 authd/sentinel
  公共 API 注解,mypy 在改动文件上干净
- 真问题修复:git 默认不把 path 发给 helper,chv-sync boot 加
  credential.useHttpPath=true,否则 authd 路径每次都拒绝
- 全量 cloud 套件 1897 项 OK(skipped=8)

真机待验证(未做,等第三棒让出 WSL 测试机):见
docs/chv-muse-p3-gap.md §3.6 清单
This commit is contained in:
host committed 2026-11-06 21:21:55 +00:00
1 parent 06c3e172fe
commit a90cf78d84
15 files changed
+2370 -93

No files matched your search

+20
View File
@@ -43,6 +43,26 @@ GITEA_SYNC_KEYS = frozenset({
# _CHV_SECRET_ENV_NAMES)。
GITEA_SYNC_SECRET_KEYS = frozenset({"GITEA_TOKEN"})
# 其中 authd 专用密钥(feat-chv-muse-p3):只进客内 authd 的
# 独立 seed 文件 /etc/chv/authd-seed(见 hostkeys.AUTHD_SEED_PATH),
# 不进 guest-env、不进 codex 进程环境。本期只有 GITEA_TOKEN。
AUTHD_SECRET_KEYS = frozenset({"GITEA_TOKEN"})
def split_authd_env(secrets: dict | None) -> tuple[dict, dict]:
"""把密钥集拆成(走 authd 通道的子集,仍走 guest-env 的子集)。
authd 子集 = AUTHD_SECRET_KEYS 命中的键(本期只有 GITEA_TOKEN);
其余密钥(如 SUB2API_API_KEY)仍走 guest-env(见差距表 §3.3,
网关 key 的 privsep 改造是后续工作)。"""
authd, rest = {}, {}
for key, value in dict(secrets or {}).items():
if key in AUTHD_SECRET_KEYS:
authd[key] = value
else:
rest[key] = value
return authd, rest
# 其中非密钥、但 boot 时就要用、也必须进 guest-env 的键
#(SSH env 前缀到不了 cloud-init 时运行的 chv-sync boot)。
GITEA_SYNC_PLAIN_KEYS = GITEA_SYNC_KEYS - GITEA_SYNC_SECRET_KEYS