Hermes Agent安全代码执行需配置Docker沙箱:一、修改config.yaml启用docker后端并禁网络、限资源;二、用docker-compose.yml统一约束;三、构建非root最小镜像;四、启用no-new-privileges等安全选项;五、强制network=none或最小化端口暴露。
☞☞☞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
4、执行用户切换:USER sandbox
5、设置工作目录:WORKDIR /workspace
6、声明入口点为非交互式执行脚本:ENTRYPOINT ["python", "-m", "hermes.exec.sandbox"]
7、构建镜像:docker build -t hermes-sandbox:strict .
四、启用容器安全强化选项
通过Docker运行时参数强制限制容器权限,防止恶意进程获取额外特权,是基础且关键的加固手段。该机制在tools/environments/docker.py中默认启用,可有效阻断常见逃逸路径。
1、确认Docker容器启动时包含--security-opt no-new-privileges参数
2、检查tools/environments/docker.py中resource_args.append("--security-opt no-new-privileges")是否被注释或移除
3、若使用自定义Dockerfile,需在FROM指令后立即添加USER nonroot:nonroot声明
4、验证容器内进程实际运行用户:进入容器执行id -u,输出应为非零数值
五、强制网络隔离与端口最小化暴露
禁用不必要的网络连接可大幅缩小攻击面,尤其适用于仅需本地计算、无需外部通信的任务场景。默认策略已在tools/environments/docker.py中通过--network=none实现。
1、在任务配置文件(如environments/benchmarks/terminalbench_2/default.yaml)中显式设置network: none
2、如需有限网络能力,改用--network=bridge并配合-p仅映射必需端口,例如-p 30001:80
3、对敏感服务端口(如TLS邮件端口),确保backend.encryption.type="tls"已在对应技能配置中启用
4、禁用所有动态端口扫描行为,在终端环境管理模块中将随机端口范围锁定为30000-32767以缩短暴露窗口


















