#OpenClaw #NAS #Docker #最小权限

高权限 NAS Skill 未通过供应链与权限门禁,不代表 Agent 只能完全放弃 NAS 可观测性。更安全的做法是把宿主探测和 Agent 工具隔开:宿主定时生成脱敏快照,OpenClaw 只读快照,并只暴露固定无参数查询。

前置审计与不晋级原因见 《高权限 NAS Agent Skill 静态审计:为什么“有确认”仍不足以接入生产》

一、目标不是移植 fnOS

当前 N100 同时承担 Ubuntu Docker 宿主和 NAS 职责,但它不是 fnOS。原 Skill 依赖 fnOS 私有 API、session 和预编译 CLI,直接移植既不适配,也会把文件、Docker、用户和存储写能力一并带入 Agent。

本阶段只保留五种只读意图:

  • nas_status:容量与容器健康摘要;

  • nas_storage:固定挂载点容量;

  • nas_disks:块设备结构,不含序列号;

  • nas_shares:固定共享挂载状态,不含远端 source;

  • nas_containers:名称、镜像标识、运行状态、健康与重启次数。

五个工具的参数 schema 都是空对象。调用方不能传命令、路径、容器名或挂载点。

二、为什么采用快照隔离

OpenClaw 容器没有 Docker socket,也看不到完整宿主 /proc/sys 和网络共享挂载。这原本是正确的隔离,不能为了查询方便破坏它。

最终数据流如下:

1
2
3
4
5
6
普通用户 crontab
-> 固定只读 collector
-> 0600 脱敏 JSON(原子替换)
-> 既有 tools 只读挂载
-> OpenClaw NAS Observer
-> 五个无参数工具

collector 每五分钟只运行固定参数的 dflsblkfindmntdocker psdocker inspect。它不读取容器日志、环境变量、启动命令、label、端口或 mount 内容,也不连接第三方网络。

OpenClaw 插件自身不使用 child_process,只读取一个固定路径、最大 1 MiB、15 分钟有效期的 JSON。符号链接、未来时间、过期、缺字段和非法 JSON 全部拒绝。

三、生产验收

验收没有用“代码看起来只读”代替运行证据:

  1. 本地核心测试覆盖 fresh/stale/future、非法 JSON、缺字段、符号链接、超大输出和无 shell;

  2. N100 staging 实际生成 3 个存储投影、2 个共享投影和完整容器清单;

  3. 生产五个工具逐一执行,额外 command 参数和过期快照均 fail-closed;

  4. AST 复核 collector 只含四类固定命令,插件没有进程执行入口;

  5. 等待自然的五分钟 cron 边界,快照按计划刷新,而不是临时提频伪造证据;

  6. OpenClaw 只做一次配置热重载,容器 ID、PID 和 restart 保持不变;

  7. qB 与执行器身份、PID、restart 不变,NAS 两个共享的已用字节不变,部署窗口无新增存储错误。

生产前配置与 crontab 均有精确 SHA 备份。回滚脚本只恢复备份并删除本任务固定文件,不使用 sudo、Docker 操作或递归删除。

四、比“把 Docker socket 挂进去”少了什么

快照会带来最多约五分钟的延迟,也无法提供实时日志、SMART 原始属性、共享 ACL 或容器操作。这些不是遗漏,而是刻意保留的权限边界。

如果把 Docker socket 直接挂给 OpenClaw,查询会更实时,但该 socket 实际接近宿主 root 能力;只要插件或依赖被利用,攻击面就从“读取脱敏 JSON”跃迁为“控制所有容器和宿主挂载”。为了 NAS 状态查询承担这个代价并不合理。

五、仍未开放的能力

SMART 原始数据、Docker 日志和环境、Samba/NFS 配置与 ACL、磁盘 mount/umount/格式化、容器启停、qB/媒体写操作、任意命令或路径输入,以及 fnOS API 仍然关闭。

未来若确有需求,应逐项建立固定投影、敏感字段清单、对象绑定和回滚门禁,而不是把它们重新聚合成一个通用 NAS 管理工具。

OpenClaw 的整体能力规划见 《OpenClaw 后续功能规划与待办任务》

后续已在不引入 Docker socket 或通用 root 的前提下,扩展固定诊断、SMART short 与服务恢复 preview。设计、故障修正和生产验收见 《N100 NAS Observer 能力扩展:固定诊断、SMART 与恢复预览》