ZeroClaw 安全策略完全指南:自主级别、沙箱分层与容器硬化实践
【免费下载链接】zeroclawFast, small, and fully autonomous AI personal assistant infrastructure, any OS, any platform — deploy anywhere, swap anything 🦀项目地址: https://gitcode.com/gh_mirrors/ze/zeroclaw
ZeroClaw 是一套可部署在任意系统、任意平台上的自主 AI 个人助理基础设施。本文以仓库根目录的 SECURITY.md 为骨架,完整展开其安全模型:从受支持版本的修复承诺、漏洞上报流程,到三级自主级别(Autonomy Levels)与五层沙箱防护的纵深防御架构,再到 129 个自动化安全测试与符合 CIS Docker Benchmark 的容器硬化方案。读完本文,你将掌握 ZeroClaw 的威胁模型、如何在生产环境验证容器镜像的 non-root 与只读文件系统配置,以及如何结合源码确认每一层安全机制的落地位置。
版本支持策略:只维护最新 minor 线
ZeroClaw 的漏洞修复遵循"单线维护"原则:安全修复只跟随最新发布线(latest release line),没有维护分支(maintenance branches),早期 minor 版本不会收到回溯补丁(backported fixes)。
| 版本 | 是否受支持 |
|---|---|
| 最新发布的 minor 线 | ✅ 受支持 |
| 更早的 minor 线 | ❌ 不受支持 |
以官方文档给出的示例:若最新发布版本为0.8.6,则受支持的 minor 线是0.8.x;0.7.x及更早的版本线均不再受支持。
这意味着两件事:其一,升级到最新版本是你获得安全修复的唯一途径——文档明确要求"在报告之前请先升级到最新发布版,若问题仍可复现再按下述流程上报";其二,评估漏洞影响面时应始终以最新版本行为为准,旧版本存在的安全问题不会单独发补丁。
负责任地报告漏洞:私密通道与响应时限
不要在公开渠道(public GitHub issue)提交安全漏洞。SECURITY.md 规定了两条上报通道:
- 邮件 / GitHub 私密通道:通过 GitHub 的 private vulnerability reporting 联系维护者;
- GitHub Security Advisories:使用 GitHub Security Advisories 新建私密安全公告。
上报时建议包含以下四类信息:
- 漏洞描述(Description of the vulnerability)
- 复现步骤(Steps to reproduce)
- 影响评估(Impact assessment)
- 建议修复方案(Suggested fix,如有)
官方承诺的响应时间线(Response Timeline)如下:
| 阶段 | 时限 |
|---|---|
| 确认收到(Acknowledgment) | 48 小时内 |
| 评估(Assessment) | 1 周内 |
| 关键问题修复(Fix,critical issues) | 2 周内 |
这套流程与仓库的发布契约一脉相承:安全补丁集中在最新发布线、按固定节奏发布,配合上述时限承诺,让关键漏洞的披露到修复周期是可预期的。
安全架构:以"自主级别"为核心的纵深防御
ZeroClaw 的安全体系建立在**纵深防御(defense-in-depth)**之上,第一层即"自主级别"——决定 Agent 能在多大程度上脱离人工干预执行动作。
三级自主级别
| 级别 | 能力边界 |
|---|---|
| ReadOnly | Agent 只能读取,无 shell、无写入权限 |
| Supervised(默认) | Agent 可在 allowlist(白名单)范围内行动 |
| Full | Agent 在工作区沙箱内拥有完整访问权限 |
从源码看,该枚举定义于 crates/zeroclaw-config/src/autonomy.rs:AutonomyLevel按"最小自主到最大自主"排序,序列化为小写字符串,其中Supervised标注为#[default]——与 SECURITY.md 中"Supervised(默认)"的描述一致,也与 src/security/mod.rs 中SecurityPolicy::default()断言autonomy == AutonomyLevel::Supervised的测试互相印证。
自主级别不是摆设,而是直接参与系统提示词(system prompt)构造的运行时事实:在 crates/zeroclaw-runtime/src/agent/system_prompt.rs 中,ReadOnly会收敛工具集并禁止写入动作,Supervised要求高风险操作经批准,Full才放开自主执行。换句话说,同样的模型、同样的工具注册表,在不同自主级别下拿到的是不同能力的系统提示词,级别越低,Agent 可见的"武器"越少。
五层沙箱防护
SECURITY.md 列出了 5 层叠加的沙箱机制:
- 工作区隔离(Workspace isolation)——所有文件操作被限制在工作区目录内;
- 路径穿越阻断(Path traversal blocking)——拒绝
..序列与绝对路径; - 命令白名单(Command allowlisting)——只允许显式批准的指令执行;
- 禁入路径列表(Forbidden path list)——
/etc、/root、~/.ssh等关键系统路径始终被封锁; - 速率限制(Rate limiting)——每小时最大动作数与每日成本上限。
这些机制对应到源码中是成体系的安全子模块。安全子系统集中在 crates/zeroclaw-runtime/src/security/mod.rs,并在根 crate 的 src/security/mod.rs 中整体 re-export 供 CLI 使用。该目录下的模块直接对应上述防护目标:
- 沙箱执行器:
bubblewrap、firejail、landlock(Linux)、seatbelt(macOS)按目标平台条件编译,配合detect.rs的create_sandbox与sandbox_posture探测实际沙箱形态; - 策略与批准:
policy.rs承载SecurityPolicy/AutonomyLevel,approval相关逻辑负责 Supervised 级别下高风险工具的事前批准; - 命令与文件工具:shell / file 类工具的 allowlist 校验是第 3、4 层的落地位置;
- 成本护栏:
[cost]配置与速率限制配合,构成第 5 层防失控开销的兜底。
值得强调的是"禁入路径列表"与"命令白名单"的叠加效果:即使 Agent 处于Full级别,也仍然被工作区边界和禁入路径约束,Full不等于"裸奔",只是"在策略边界内自主"。
主要防护对象(威胁面)
SECURITY.md 明确列出该系统防范的攻击类型:
- 路径穿越攻击(如
../../../etc/passwd)——由第 2 层"路径穿越阻断"拦截; - 命令注入(如
rm -rf /、curl | sh)——由第 3 层"命令白名单"拦截; - 通过符号链接或绝对路径逃逸工作区——由第 1、2 层拦截;
- LLM API 调用导致的失控成本——由第 5 层"速率限制 / 成本上限"拦截;
- 未授权的 shell 命令执行——由第 3 层拦截。
这也是为什么配置中存在[risk_profiles.*]:容器默认配置(见下文 Dockerfile 生成的/zeroclaw-data/.zeroclaw/config.toml)即定义了level = "supervised"的默认风险画像,并为file_read、file_write、file_edit、memory_recall、memory_store、web_search_tool、web_fetch、calculator、glob_search、content_search、image_info、weather、git_operations等工具配置了auto_approve白名单——这就是"Supervised + allowlist"默认姿态的实例。
安全测试:129 个自动化用例守护每条防线
所有安全机制都由自动化测试覆盖,SECURITY.md 给出的测试入口如下:
cargo test -- security cargo test -- tools::shell cargo test -- tools::file_read cargo test -- tools::file_write这些测试的可信度可以从源码侧进一步佐证:
- src/security/mod.rs 内嵌测试验证
SecurityPolicy::default()的自主级别为Supervised、PairingGuard的配对要求默认关闭、SecretStore的加密/解密往返一致,以及redact对敏感值的脱敏行为(含多字节 UTF-8 边界安全——redact("密码是很长的秘密")不会因按字节切片而 panic); redact的实现在 crates/zeroclaw-runtime/src/security/mod.rs:长度 ≤4 时整体替换为***,否则保留前 4 个字符加***后缀,用于日志与审计场景避免敏感信息泄露;tools::shell/tools::file_read/tools::file_write对应 src/tools 下的工具实现,命令白名单、路径穿越、禁入路径的校验正是在这些工具的调用链上执行的。
此外,SECURITY.md 强调测试数量为 129 个,覆盖"所有安全机制"——这既包括上述策略与脱敏单元测试,也包括组件级测试(如 tests/component/security.rs)对安全边界的验证。
容器安全:对齐 CIS Docker Benchmark
ZeroClaw 的 Docker 镜像按CIS Docker Benchmark 最佳实践构建,SECURITY.md 给出的对照表如下:
| 控制项 | 实现方式 |
|---|---|
| 4.1 非 root 用户 | 容器以 UID 65534(distroless nonroot)运行 |
| 4.2 最小化基础镜像 | gcr.io/distroless/cc-debian13:nonroot—— 无 shell、无包管理器 |
| 4.6 HEALTHCHECK | 不适用(无状态 CLI/gateway) |
| 5.25 只读文件系统 | 支持docker run --read-only,配合/workspace卷 |
源码级的镜像硬化证据
对照 Dockerfile 可以逐条核实这些声明:
- 生产阶段(release stage)直接基于
gcr.io/distroless/cc-debian13:nonroot,且该镜像以 digest(sha256 固定摘要)锁定,杜绝基础镜像被篡改; USER 65534:65534在 dev 与 release 两个运行时阶段都显式设置,配合chown -R 65534:65534 /zeroclaw-data,确保数据目录归属 nonroot 用户;- 数据与配置位于
/zeroclaw-data,ENV ZEROCLAW_DATA_DIR=/zeroclaw-data/data、ENV HOME=/zeroclaw-data,工作区作为可写挂载点与只读根文件系统解耦——这正是docker run --read-only可行性的基础; - 默认配置即安全默认:镜像内生成的
config.toml将[risk_profiles.default]设为level = "supervised",并预设工具auto_approve白名单,开箱即是"受监督 + 白名单"姿态; - HEALTHCHECK 仍被提供(
zeroclaw status --format=exit-code,60s 间隔),SECURITY.md 中"4.6 不适用"指的是该控制项对无状态 CLI/gateway 的静态适用性判断,而非镜像缺失健康检查。
需要说明的前提:上述 distroless 镜像路径、UID 与用户声明均以当前仓库 Dockerfile 实际内容为准;不同发布版本的镜像标签与 digest 会由 dev/ci/container-base-images.toml 生成并随构建流水线更新。
验证容器安全:可复制的命令
SECURITY.md 给出了两组可直接执行的生产验证命令:
# 构建并验证非 root 用户 docker build -t zeroclaw . docker inspect --format='{{.Config.User}}' zeroclaw # 期望输出:65534:65534 # 以只读文件系统运行(生产加固) docker run --read-only -v /path/to/workspace:/workspace zeroclaw gateway命令语义拆解:
docker inspect --format='{{.Config.User}}'读取镜像配置中的User字段,若输出为65534:65534即确认 nonroot 运行(CIS 4.1);docker run --read-only将容器根文件系统挂载为只读(CIS 5.25),此时 Agent 的全部文件活动都必须发生在挂载的/workspace卷内——这与沙箱第 1 层"工作区隔离"在容器维度上的实现是一致的;- 注意 SECURITY.md 示例使用
zeroclaw gateway作为命令,而仓库 Dockerfile 的默认ENTRYPOINT ["zeroclaw"]+CMD ["daemon"]会以 daemon 模式启动;gateway子命令适用于只想暴露 gateway 服务的场景。
CI 强制:镜像安全被自动化守护
SECURITY.md 明确指出:CI 流水线中的source-images任务(.github/workflows/docker-image-pr.yml)会验证其加载的默认镜像与 Alpinelinux/amd64镜像均配置为以65534:65534运行。这意味着"镜像必须 nonroot"不是口头约定,而是合并前必须通过的门禁——任何让镜像回退到 root 运行的改动都会在 CI 阶段被拦截。该约束与仓库的镜像构建体系(多阶段构建、digest 锁定、$TARGETARCH交叉编译)共同构成了发布层面的安全红线。
结语:从策略到代码的安全闭环
ZeroClaw 的安全设计呈现出完整的闭环:
- 策略层:SECURITY.md 定义版本支持、披露流程与响应时限;
- 架构层:
AutonomyLevel(ReadOnly / Supervised / Full)+ 五层沙箱,实现"最小权限、纵深防御"; - 实现层:crates/zeroclaw-runtime/src/security 的 20+ 个子模块(策略、沙箱执行器、配对、密钥存储、提示注入防御、审计、成本护栏等)逐条落地;
- 验证层:129 个自动化测试 + CI 镜像门禁,防止安全机制退化;
- 交付层:distroless nonroot 镜像、只读文件系统支持、supervised 默认风险画像,让"安全默认值"随镜像一起交付。
对于部署 ZeroClaw 的团队,落地建议是:升级保持在最新 minor 线;用docker inspect --format='{{.Config.User}}'与docker run --read-only验证镜像姿态;按业务需要调整[risk_profiles.*]的级别与auto_approve白名单,在"自主能力"与"可控边界"之间找到适合自己场景的平衡点。
【免费下载链接】zeroclawFast, small, and fully autonomous AI personal assistant infrastructure, any OS, any platform — deploy anywhere, swap anything 🦀项目地址: https://gitcode.com/gh_mirrors/ze/zeroclaw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考