OpenSandbox seccomp与AppArmor加固实战:如何为AI Agent沙箱做安全升级
【免费下载链接】OpenSandboxSecure, Fast, and Extensible Sandbox runtime for AI agents.项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandbox
OpenSandbox 是一个面向 AI Agent 的安全、快速、可扩展的沙箱运行时(Sandbox Runtime),它让 AI 在隔离的容器中安全执行代码。对于跑在生产环境中的 Agent 系统来说,"能跑"只是起点,"跑得住"才是关键。本文带你用 5 步完成Docker 沙箱安全加固:启用 seccomp 系统调用过滤、加载 AppArmor 强制访问控制、丢弃危险权限,再叠加 OpenSandbox 内置的execd 沙箱内加固,让沙箱安全再升级。
一、先搞懂:seccomp 和 AppArmor 是什么?
在动手之前,用一分钟理解这两个 Linux 安全机制:
| 机制 | 作用层面 | 通俗理解 |
|---|---|---|
| seccomp | 系统调用(syscall) | 给程序一份"系统调用白名单",调用不在名单上的内核接口直接拒绝(如mount、ptrace) |
| AppArmor | 文件/资源访问 | 按"配置文件"限制程序能访问哪些文件、路径和网络资源,属于强制访问控制(MAC) |
一句话概括:seccomp 管"程序能对内核做什么",AppArmor 管"程序能碰哪些资源"。两者叠加,即使 Agent 执行了恶意的模型输出代码,攻击面也会大幅缩小。
二、查看 OpenSandbox 的默认安全基线
OpenSandbox Server 的 Docker 运行时默认已启用多项加固,在配置文件中可以直接看到:
no_new_privileges = true—— 禁止进程提权(防 setuid 类漏洞)drop_capabilities—— 默认丢弃 8 项危险能力(NET_ADMIN、SYS_ADMIN、SYS_PTRACE等)pids_limit = 4096—— 限制每沙箱进程数,防 fork 炸弹
默认配置参考:example.config.toml
[docker] drop_capabilities = ["AUDIT_WRITE", "MKNOD", "NET_ADMIN", "NET_RAW", "SYS_ADMIN", "SYS_MODULE", "SYS_PTRACE", "SYS_TIME", "SYS_TTY_CONFIG"] no_new_privileges = true # Optional: set an AppArmor profile name (e.g., "docker-default") when AppArmor is enabled apparmor_profile = "" # Seccomp profile: empty string uses Docker default; set to an absolute path for a custom profile seccomp_profile = ""完整的配置项说明见官方配置文档:server/configuration.md
三、seccomp 加固:三步启用自定义系统调用过滤
第 1 步:准备 seccomp profile 文件
以 Docker 默认 profile 为基础(docker info中可导出 Default seccomp profile),删掉沙箱确实需要的系统调用,保存为 JSON 文件,例如/etc/opensandbox/seccomp-profile.json。
第 2 步:在 Server 配置中指定 profile
修改 Server 配置(TOML),在[docker]段填入绝对路径:
[docker] # 空字符串 = 使用 Docker 默认 seccomp;填绝对路径 = 启用自定义 profile seccomp_profile = "/etc/opensandbox/seccomp-profile.json"第 3 步:重启 Server 并验证
重启 OpenSandbox Server 后,新建的每个沙箱容器都会带上该 seccomp 过滤规则。执行逻辑位于 Docker 容器操作模块:container_ops.py,Server 会将其转换为security_opt = seccomp=<path>应用到每个沙箱。
💡小提示:profile 太严会导致容器启动失败或命令执行异常,建议先在测试环境用最小 Agent 任务验证一遍再上生产。
四、AppArmor 加固:为沙箱挂载强制访问控制
如果宿主机内核启用了 AppArmor(大多数 Linux 发行版默认开启,可用aa-status检查),只需一行配置即可生效:
[docker] # 指定 AppArmor profile 名称,例如 Docker 自带的 "docker-default" apparmor_profile = "docker-default"留空时 Docker 会使用其默认 profile;显式指定后,沙箱容器将受该 profile 的文件访问约束,实现"默认拒绝、按需放行"。
对于需要更严格策略的团队,可以先运行沙箱观察日志,逐步把denied记录收敛成自定义 profile,这是标准的 AppArmor 调优流程。
五、进阶:execd 沙箱内 seccomp 加固(第二道防线)
上面配置的是容器层防护。OpenSandbox 还在容器内部埋了一道更细的防线——由沙箱内的execd组件负责,默认开启:
- 内置 seccomp 黑名单:拦截约 30 个危险系统调用,包括
mount、chroot、pivot_root、ptrace、bpf、kexec_load等,无需任何配置 - 自定义 deny 列表:可用
[seccomp] deny = [...]完全替换内置黑名单 - no_new_privileges 加固底座:用户代码进程经原生 launcher 启动,默认丢弃全部 capabilities
- Landlock 文件围栏(可选):内核支持时,将文件访问收敛到白名单路径
- eBPF 行为审计(可选):记录 exec、connect、提权事件到 JSONL 审计文件
完整配置示例(含中文注释的各节说明):isolation.example.toml,深入文档见:docs/components/execd.md
# 示例:替换内置 seccomp 黑名单(deny 会完全替换内置列表) [seccomp] deny = ["mount", "ptrace", "bpf", "seccomp"]运行时能力探测接口GET /v1/isolated/capabilities会报告当前环境实际启用了哪些加固项(seccomp / AppArmor / capabilities 降级情况都不会致命,只会降级并标注),方便你在不同宿主机上批量校验加固生效情况。
六、加固效果验证清单
完成配置后,按下面清单逐项验证:
| 验证项 | 方法 |
|---|---|
| seccomp 生效 | 容器内执行黑名单中的系统调用应被拒(如strace -f观察EPERM) |
| AppArmor 生效 | dmesg或/var/log/audit中出现apparmor="DENIED"记录 |
| no_new_privileges | grep NoNewPrivs /proc/<pid>/status应为1 |
| execd 内置加固 | 调用/v1/isolated/capabilities,检查hardening字段 |
| 进程数限制 | fork 超过pids_limit时收到EAGAIN |
多租户与隔离会话的整体安全模型,可延伸阅读:docs/guides/isolation-sessions.md 与 docs/architecture/index.md。
七、常见问题 FAQ
Q1:seccomp profile 配错了,容器起不来怎么办?先用空字符串回退到 Docker 默认 profile,再对比自定义文件与默认文件的差异定位。最常见的坑是误删了clone、clone3(新版内核上容器启动必需)。
Q2:宿主机没有 AppArmor(如某些极简发行版),会影响 seccomp 吗?不会,两者相互独立。AppArmor 配置留空即可,seccomp、capabilities、pids_limit 均照常生效;反之亦然。
Q3:容器层和 execd 内层的 seccomp 会冲突吗?不会,而是层层收紧。容器层管整个容器生命周期,execd 内层只约束用户代码进程;内层黑名单未覆盖的风险点恰好被容器层兜底。
Q4:加固后 Agent 执行慢了吗?seccomp 的每次系统调用仅增加纳秒级开销,AppArmor 在缓存命中时接近零开销,日常 Agent 负载基本无感。
总结
给 AI Agent 沙箱做安全加固,核心就记住四层:
- 🛡️默认基线:
no_new_privileges+ capabilities 丢弃 + pids 限制(开箱即得) - 🛡️seccomp:
[docker].seccomp_profile一行配置启用自定义系统调用过滤 - 🛡️AppArmor:
[docker].apparmor_profile挂载强制访问控制 - 🛡️execd 内层加固:内置 seccomp 黑名单 + no_new_privs + 可选 Landlock / eBPF 审计
按本文 5 步走下来,你的 OpenSandbox 沙箱就从"能隔离"进化到了"扛得住恶意代码"的级别。生产环境建议先用小规模任务跑通验证清单,再全量铺开。
【免费下载链接】OpenSandboxSecure, Fast, and Extensible Sandbox runtime for AI agents.项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandbox
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考