应启用Docker沙箱安全约束,包括禁用网络、限制资源、使用非root用户、最小化镜像、动态容器生命周期管理及seccomp加固。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您尝试让Hermes Agent在隔离环境中执行代码,但容器无法正确启动或代码运行时出现权限、网络或资源异常,则可能是由于Docker沙箱配置未启用安全约束。以下是实现安全代码执行的多种沙箱环境配置方法:
一、启用Docker后端并配置基础沙箱参数
该方法通过修改Hermes Agent主配置文件,强制所有终端操作在Docker容器中执行,并设定默认隔离策略。核心在于禁用网络、限制资源、指定轻量镜像,确保代码无法逃逸或耗尽宿主机资源。
1、打开配置文件:~/.hermes/config.yaml
2、将terminal.backend设为"docker",并补充以下沙箱专用字段:
3、设置镜像为python:3.12-slim以减小攻击面
4、添加network_enabled: false彻底阻断容器外连能力
5、声明内存上限memory_limit: "512m"与CPU配额cpu_quota: 1.0
6、指定工作目录为/workspace,避免挂载敏感路径
二、使用Docker Compose部署带资源限制的沙箱服务
该方式适用于需长期运行且与其他服务(如API网关、日志收集器)协同的场景,通过docker-compose.yml统一声明沙箱运行时约束,避免手动传参遗漏。
1、新建docker-compose.sandbox.yml文件
2、写入version声明:version: '3.8'
3、定义hermes-sandbox服务,使用image: python:3.12-slim
4、在deploy.resources.limits下设定cpus: '1'与memory: 512M
5、添加network_mode: "none"关闭全部网络栈
6、挂载只读配置目录:- ~/.hermes:/root/.hermes:ro
7、设置启动命令为["sh", "-c", "cd /app && hermes run --sandbox"]
三、构建最小化非root沙箱镜像
该方法从镜像层杜绝特权风险,通过显式创建低权限用户并切换执行身份,使容器内进程默认不具备写入系统路径或调用敏感syscall的能力。
1、新建Dockerfile,首行声明基础镜像:FROM python:3.12-slim
2、创建无特权组与用户:RUN groupadd -g 1001 -f sandbox && useradd -r -u 1001 -g sandbox sandbox
3、复制Hermes Agent运行时依赖至/app
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
4、执行用户切换:USER sandbox
5、设置工作目录:WORKDIR /workspace
6、声明入口点为非交互式执行脚本:ENTRYPOINT ["python", "-m", "hermes.exec.sandbox"]
7、构建镜像:docker build -t hermes-sandbox:strict .
四、集成Java Docker客户端实现动态沙箱生命周期控制
该方法适用于需在运行时按需创建/销毁沙箱容器的高级场景,例如每次代码执行都启用全新容器实例,执行完毕立即清理,彻底消除状态残留风险。
1、在项目中引入docker-java-core与docker-java-transport-httpclient5依赖
2、定义SandboxSettings内部类,固化image="python:3.12-slim"
3、在SandboxSettings中强制networkEnabled = false
4、设置timeout = 300秒防止无限循环占用资源
5、为每个执行请求生成唯一容器名,格式为hermes-sandbox-{uuid}
6、调用DockerClient.createContainerCmd()传入内存与CPU限制参数
7、执行startContainerCmd.exec()并监听退出状态码
五、禁用危险系统调用并挂载只读文件系统
该方法通过Linux命名空间与seccomp机制进一步加固容器内核层安全,阻止容器内进程执行mount、chroot、setuid等高危syscall,同时防止对宿主机文件系统的意外写入。
1、准备seccomp策略JSON文件sandbox-seccomp.json,仅保留白名单系统调用
2、在docker run或compose配置中引用该策略:security_opt: ["seccomp=sandbox-seccomp.json"]
3、添加read_only: true参数使根文件系统变为只读
4、显式挂载/tmp为可写tmpfs:volumes: ["/tmp:/tmp:rw,size=64m"]
5、移除--cap-add所有能力,确保默认--cap-drop=ALL
6、设置no_new_privileges: true禁止进程提权
7、验证容器内无法执行touch /etc/test或unshare --user

















