ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Hermes Agent 资源访问控制机制详解:从 config.yaml 到沙箱权限管控

Hermes Agent 资源访问控制机制详解:从 config.yaml 到沙箱权限管控 1. Hermes Agent 资源访问控制到底在管什么Hermes Agent 是 Nous Research 推出的开源 AI Agent 框架它能调用终端、读写文件、跑代码、连 MCP 服务器把「一句话需求」变成一串真实落地的系统操作。能力越强边界问题就越突出它到底能碰哪些目录、能调哪些工具、能起哪些进程、能读哪些环境变量。资源访问控制机制就是回答这四个问题的。如果你正在把 Hermes 往生产或半生产环境里放最关心的通常不是「它能不能跑通」而是「它跑飞了会怎样」。Hermes 的安全设计走的是纵深防御加最小权限路线默认全部拒绝只有你在config.yaml里显式写进去的资源才放行。整条链路从用户接入、工具调用、路径校验一直延伸到容器沙箱里的进程权限裁剪任何一层判定拒绝请求就当场终止不会进入下一层。这套机制适合三类人一是准备用 Hermes 接内部系统的开发者需要把访问边界卡死二是做 Agent 平台、要给多用户隔离资源的工程团队三是已经在跑 Hermes、想搞清楚「为什么我的工具突然被拦了」的运维同学。下面我会把配置骨架和验证动作都给全你可以直接抄着改。2. 落地前先把 TaoToken 这条链路接上Hermes 本身负责「怎么安全地执行」但模型侧的调用凭证和额度管理是另一条线。我习惯把模型接入统一走 TaoToken这样 Agent 的模型调用和权限配置分开管理出问题好定位。TaoToken 官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数配置时别把查询串一起粘进去。具体要拿的东西是 API Key。进控制台后到 API Keys 页面创建建议按用途分 Key比如给 Hermes 单独建一个方便后面按 Key 维度看用量和随时吊销。创建入口在这里https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。拿到 Key 之后Hermes 侧一般通过环境变量注入别写死在config.yaml里因为配置文件经常要提交到仓库或分享给别人排查。推荐做法是export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你要验证模型本身通不通可以先用模型对话页面发一条测试消息确认 Key 有效、模型可选https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。这一步和权限控制是两件事但顺序上建议先确认模型链路 OK再去调沙箱权限否则报错来源会混在一起。长期跑编码类 Agent、需要稳定额度和更高并发的话可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。接入细节和字段说明统一看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。3. 可复制的 config.yaml 权限配置骨架下面这份骨架覆盖了路径白名单、工具集授权、MCP 过滤、审批模式和容器隔离五块。你可以整段拿走把路径和工具名换成自己的。# 全局工作目录约束 agent: workdir: /home/user/agent-workspace # 所有工具的默认基础路径 # 工具级路径白名单 tools: terminal: allowed_paths: - /home/user/agent-workspace/ # 末尾斜杠必须保留 cwd: /home/user/agent-workspace file: allowed_paths: - /home/user/agent-workspace/data/ code_execution: allowed_paths: - /home/user/agent-workspace/sandbox/ # 平台级工具集授权 platform_toolsets: cli: [file, browser, web] # CLI 环境禁用 terminal discord: [file, web] # MCP 服务器过滤 mcp_servers: filesystem: command: npx args: [-y, modelcontextprotocol/server-filesystem, /home/user/agent-workspace/data] enabled: true tools: include: [list_files, read_file] # 白名单优先于黑名单 resources: false # 禁用资源元数据读取 prompts: false # 审批与硬拦截 approvals: mode: auto # off / auto / always hardline_blocklist: - rm -rf / - mkfs - dd if/dev/zero # 容器隔离与资源配额 container: backend: docker cpu: 1 memory: 5g disk: 10g network: none # 默认隔离网络 extra_args: - --no-new-privileges几个关键点单独说清楚。allowed_paths末尾的斜杠不能省省了就可能被../路径遍历绕过比如规则写成/home/user而没带斜杠工具访问/home/user/../other就跳出范围了。agent.workdir是兜底某个工具没单独配allowed_paths时它的访问范围就被压到这个目录下。platform_toolsets是全或无开关没进授权列表的工具根本不会出现在可用工具里。MCP 那块tools.include是白名单和tools.exclude同时存在时白名单优先。resources: false会禁掉list_resources、read_resource这类工具默认就是关的要手动开。容器侧network: none配合--no-new-privileges基本把提权和横向移动的路堵住了。4. 验证请求与成功结果配置写完不算完得实际打一发请求看边界是否生效。下面用 terminal 工具做两个对照测试。先测「允许范围内」的访问预期成功# 在 Hermes 会话里让 terminal 工具执行 ls /home/user/agent-workspace/data预期返回目录列表工具调用日志里能看到路径校验通过。再测「越界访问」预期被拦截cat /etc/passwd预期结果是工具调用被拒绝返回类似path not in allowed_paths的提示且不会真正读到文件内容。如果这条居然成功了说明你的allowed_paths没生效回去检查缩进和末尾斜杠。接着验证 MCP 过滤。让 Agent 调用一个不在白名单里的工具比如write_file# 期望工具未注册调用直接失败预期是工具列表里压根没有write_fileAgent 会告诉你该工具不可用。这一步能确认tools.include白名单在 MCP 握手阶段就生效了。最后验证容器隔离。让 terminal 尝试起一个网络请求curl https://example.com在network: none下预期是连接失败或超时。如果通了检查container.extra_args里是不是被别的参数覆盖了网络配置。验证模型链路是否正常可以回到模型对话页面发一条消息确认https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。权限和模型两条线都通了才算真正落地。5. 本篇常见错排查报错一PermissionError: path outside allowed_paths最常见的原因是allowed_paths末尾漏了斜杠或者路径写的是相对路径。统一改成绝对路径加末尾斜杠。另一个坑是容器内路径和宿主机路径不一致allowed_paths必须写容器内的实际路径不是宿主机的。报错二工具在列表里找不到先查platform_toolsets有没有把该工具归入当前平台。再查 MCP 的tools.include白名单是否包含它。注意platform_toolsets是注册阶段生效tools.include是握手阶段生效两者是互补的缺一个都会导致工具不可见。报错三审批一直不通过approvals.mode设成always时每个高风险操作都要人工确认默认 5 分钟超时。如果你在无人值守环境跑改成auto同时确保hardline_blocklist里的破坏性命令仍然被硬拦截。别为了省事直接设off那样连rm -rf /都拦不住。报错四容器起不来或资源申请失败检查container.cpu、memory、disk的配额是否超过宿主机可用量。--no-new-privileges和权限裁剪是强制的如果你在extra_args里加了冲突参数容器会启动失败。另外非容器化环境本地直跑或 SSH没有容器隔离层路径约束和进程权限裁剪是主要防线配置要更保守。报错五环境变量泄露Hermes 通过_build_safe_env()过滤子进程环境只传PATH、HOME、XDG_*这类基础变量。如果你发现敏感变量被子进程读到了检查是不是在extra_args或 MCP 的command里手动注入了。别在 MCP 配置里写明文密钥走环境变量注入。6. 把边界固化下来权限配置这东西配一次容易长期守住难。我的做法是把config.yaml纳入版本管理每次改动都跑一遍上面那组对照测试确认允许的还能通、该拦的还被拦。容器配额和hardline_blocklist这两块尽量别动它们是最后一道业务线防护。模型侧和权限侧分开管理Key 按用途隔离出问题能快速定位是模型链路还是沙箱链路。需要长期跑编码 Agent 的话Coding Plan 的额度模型更适合持续调用https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。接入字段和配置细节以文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。
返回列表