fix(chv-muse-r12fix3-2): worker socket 组权限 + allowed_uids 含 chv(P6 缺口 ②)

R12 复测 2 钉死:即使 worker active,chv 客户端也永远连不上
socket——worker root + 目录 /run/chv-gitea 0700 root + socket
0600 root + allowed_uids=(0,) 三处锁死;chv ping 一律 EACCES
(rc=2),root ping rc=0,privsep_worker_call 恒为 0,全部同步
走回落。

修法:三处配套改,只改一处仍锁死——
1. chv-gitea-worker.py:DEFAULT_ALLOWED_UIDS=(0, 1000)(root +
   chv;round-11 authd 同款;环境变量
   CHV_GITEA_WORKER_ALLOWED_UIDS 可覆盖);socket 用 group 权限
   (目录 0750、socket 0660、组为第一个非 root 放行 uid 的主组,
   _socket_group_gid/_set_group_perms 与 authd 同款实现;gid
   解析不出时回落 root-only 0700/0600,绝不放给全员)。
   拒绝 0666 探针口径。
2. build.sh tmpfiles.d:d /run/chv-gitea 改为 0750 root 1000,与
   新方案一致。gid 写数字 1000 而不用组名 chv——tmpfiles-setup
   跑在 07:23:24,chv 用户由 cloud-init 在 07:23:40 才建,组名
   当时解析不出;1000 是 chv 的 uid/gid(seed users 块未指定
   uid/gid,cloud-init 取首个空闲 1000;authd 同款假设)。
   worker 启动时再按 passwd 重新推导 gid 并重设权限,tmpfiles
   行只是开机存在性保证。审计日志仍 0600 root,不动。
3. 服务单元 ReadWritePaths 不动(/run/chv-gitea 仍在列,存在性
   由 tmpfiles 保证)。

注意:单元内 agent 同样映射为 chv uid 1000,故也能走到 socket,
但只能走类型化协议——操作白名单、仓库 confinement、安全扫描三
处仍在,worker 不持凭证(见 worker 模块注释)。

测试:WorkerSocketGroupPermsTest 新增 7 项——默认白名单含
(0,1000)、环境变量覆盖、gid 可推导时 0750/0660 + 组正确、显式
socket_group 时同样组权限、只有 root 时回落 0700/0600、gid 推导
函数四档、tmpfiles 行 0750 root 1000;WorkerUnitTmpfilesTest 的
/run/chv-gitea 期望改 0750。P6/round12/P2/P4 四模块 205 项全过。
This commit is contained in:
host committed 2026-11-08 09:48:16 +00:00
1 parent e31354dc58
commit 7cba3c2b21
4 files changed
+243 -27

No files matched your search

+10 -7
View File
@@ -48,12 +48,13 @@ P3(authd/sentinel 本体——只读、不重写、不改接口)、不碰 P4
(token/key/口令模式脱敏)+ `audit_inference_request/response`
(只记指纹与 verdict,不记值;失败 best-effort)。
- `chv-guest/chv-gitea-worker.py`(新,标准库守护进程):Unix socket
`/run/chv-gitea/worker.sock`(0700 目录、0600 socket);SO_PEERCRED
只放行 root(broker 走 root 连);操作白名单 pull/push/status/
ping;仓库只限 `~/workspace` 下(realpath + commonpath);git 以
chv 身份跑(`runuser -u chv`,文件归属不变),argv 里只配
credential helper、绝无 token;输出先过 `safety` 扫描 + 来源标记
再返回;超时 300 秒;异常只断本连接。
`/run/chv-gitea/worker.sock`(目录 0750、socket 0660、组为 chv 主组,
round-12 修复轮第三轮缺口 ②,round-11 authd 同款口径,拒绝
0666);SO_PEERCRED 只放行 root 与 chv(chv-sync 薄客户端以 chv
身份连);操作白名单 pull/push/status/ping;仓库只限 `~/workspace`
下(realpath + commonpath);git 以 chv 身份跑(`runuser -u chv`,
文件归属不变),argv 里只配 credential helper、绝无 token;输出先
过 `safety` 扫描 + 来源标记再返回;超时 300 秒;异常只断本连接。
- `chv-guest/chv-gitea-worker.service`(新):systemd 单元(root 运行,
单元外;`ProtectSystem=strict`、`PrivateTmp`、`NoNewPrivileges`、
`CapabilityBoundingSet=` 空、`RestrictAddressFamilies=AF_UNIX AF_INET
@@ -168,7 +169,9 @@ Base64、零宽字符)、藏在图片/附件/二进制里的指令、需要理
- worker 的 systemd 沙箱在真机上生效(`systemctl status`、cgroup
路径、受限调用被挡的表现)。
- broker → worker → helper → authd → git 全链路在真机上跑通
pull/push(真 Gitea、真 token 替身)。
pull/push(真 Gitea、真 token 替身)。round-12 修复轮第三轮
(缺口 ②)已改 socket 组权限 + allowed_uids 含 chv,待真机复测
3 验证 chv ping rc=0 且 privsep_worker_call > 0。
- worker 崩溃后 agent 侧只收到类型化失败、任务不炸(杀 worker
进程复现)。
- 安全扫描在真机 git 输出上的误报率抽查(真实 commit 信息样本)。