运行 Hermes 前的生命线:安全审计清单与 11 个必须检查的配置项
一步一锁,从终端后端到 API 预算上限,手把手挨项核查你的生产级安全防线
前言:为什么 AI Agent 的安全审计比任何软件都重要?
截至 2026 年 4 月底,Hermes Agent 的 GitHub Star 已突破 12 万,成为全球增长最快的开源 AI Agent 框架。但伴随高活跃度而来的,是一系列不容忽视的安全风险。
2026 年 4 月,CVE-2026-25253 被公开披露------一个 CVSS 评分高达 8.8 的零点击远程代码执行漏洞。攻击者只需诱导用户访问一个恶意网页,即可通过 WebSocket 网关静默窃取认证令牌,完全接管用户的 Agent 实例并执行任意恶意操作。
同一时期,漏洞库新增了 CVE-2026-25138(权限提升)和 CVE-2026-25174(日志注入)等多条相关条目,CVE-2026 编号已累计超过 250 条。更值得警惕的是,2026 年 4 月的安全压测实验发现,在未做安全加固的配置下,Hermes 暴露在公网仅 5 步即可被完全控制,综合风险等级达到 CRITICAL 级别,CVSS 评分高达 9.1。
然而,根据对社区公开配置的抽样分析,截至 2026 年 4 月,运行 Hermes 的用户中,仍有大量用户使用默认的非安全配置,甚至将 Token 硬编码在 GitHub 仓库中。
本文将从 11 个关键配置维度 重新审视 Hermes 的安全基线,提供一个生产级的"秒针式"审计清单。在与系列第 38 篇(四层最小权限原则)的宏观架构相比,本篇更聚焦于实用性核查------逐条展开应当检查什么、如何检查、怎样修复。
一、系统化审计清单全景图
在进入逐条深度解析之前,先用一张图概览全部 11 个审计维度及其相互关联,以便建立全局认知:
密钥与预算管控
配置文件与权限
检查组 10: Skill 自改进审计
谨慎验收新技能
检查组 8: API 调用预算上限
用量及费用限制
检查组 7: API 环境变量隔离
独立密钥
高危执行层
检查组 9: 审计日志记录
全链路日志
检查组 4: code_execution 沙箱
Docker/AppArmor
检查组 3: MCP per-server 工具过滤
allowed_tools 白名单
检查组 2: Toolset 最小化
精确开关
检查组 5: 子 Agent 工具集修正
受限工具配置
部署前基础环境
检查组 6: 一次会话最大工具调用次数
调用量上限
检查组 1: Terminal Backend 安全
Local 模式
Docker 沙箱
SSH 远程
E
建议按图中 4 个大阶段(基础环境 → 配置文件与权限 → 高危执行层 → 密钥与预算)来逐步排查,不要跳跃。每检查一项,直接修改 config.yaml 或启动参数,并记录在审计日志中。
二、第 1 项:terminal 后端是否为 docker / ssh?
2.1 为什么必须优先检查这一项?
Hermes 通过 terminal 模块执行系统命令。如果后端直接设为 local,Agent 等于直接搏命在宿主机上运行------命令注入导致的 rm -rf 可以直接删除你的根目录。
2.2 三种终端的风险对照
| 后端模式 | 安全等级 | 适用场景 | 风险摘要 |
|---|---|---|---|
local |
❌ 高危 | 开发调试,可控本地 | 宿主机权限执行,命令注入直接清零系统文件 |
ssh |
⚠️ 中等 | 远程管理可信服务器 | 密钥被盗即受控,相当于 SSH 跳板 |
docker |
✅ 推荐 | 生产级隔离执行 | 沙箱隔离防提权,但需配合 min 限制、禁用网络等安全加固 |
2.3 快速核查
yaml
# ~/.hermes/config.yaml
terminal:
backend: "docker" # ✅ 生产环境必须设为 docker(或 ssh 并配合专用账户)
docker:
image: "python:3.12-slim"
network_enabled: false # ❗网络隔离核心------必须为 false
memory_limit: "512m"
cpu_quota: 1.0
read_only_rootfs: true # 根文件系统只读,降低容器内代码改系统文件的可能
privileged: false
security_opt:
- "no-new-privileges:true"
user: "sandbox"
关键防御配置 :network_enabled: false 是关键防护,彻底阻断容器外连能力。若允许容器访问网络,无论其他配置如何,隔离的安全性都会被大幅削弱。
🔥 典型致灾场景 :
backend: local+shell_execute: true,用户只要对 Agent 说delete my folder,Agent 可能直接执行rm -rf导致宿主机数据丢失。这条必须设为 docker 或禁用 shell 调用。
三、第 2 项:Toolset 是否最小化?
3.1 默认全部关闭,仅必须项手动开启
Hermes 的默认安全策略是所有工具默认 false,但用户往往不加思考地全部打开,这是最大的安全风险来源之一。
3.2 工具风险等级对照表
| tools 条目 | 默认值 | 风险等级 | 推荐状态 | 原因 |
|---|---|---|---|---|
shell_execute |
false | 🔴 极高 | 生产环境保持 false | 最高危命令入口,除非被沙箱层完全包裹 |
code_execution |
false | 🔴 极高 | 生产环境保持 false | 执行任意代码,应关闭或由沙箱隔离 |
file_write |
false | 🟡 中高 | 严格审批 | 用户显式需要时再打开,且设置只读限制 |
file_system |
false | 🟡 中 | 按需加载 | 提供文件读写能力,建议随 MCP 限目录 |
http_request |
false | 🟡 中 | 按场景 | 针对白名单域名发起 HTTP |
web_search |
false | 🟢 低 | 可选 | 轻度风险 |
session_search |
false | 🟢 低 | 建议开启 | 仅检索自己的对话历史 |
3.3 核查命令
bash
hermes tools | grep -E "shell_execute|code_execution|file_write|file_system"
若 shell_execute 或 code_execution 的输出显示为 true,应立即返回配置将其改为 false。
四、第 3 项:MCP per-server 工具过滤是否配置?
Hermes 通过 MCP(模型上下文协议)接入 Filesystem、Postgres、GitHub 等外部服务器。每个 MCP 服务器必须单独配置工具白名单,限制 Agent 可调用的具体工具集合。
4.1 per-server 工具过滤配置实例
yaml
# ~/.hermes/config.yaml
mcp_servers:
filesystem:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "/home/hermes/workdir"]
allowed_tools: # ✅ 白名单,core
- "filesystem_list_directory" # 只允许列出目录
- "filesystem_read_file" # 只允许读取文件
blocked_tools: # ❌ 可选,明确禁止高危操作
- "filesystem_write_file"
- "filesystem_delete_file"
postgres:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-postgres"]
env:
DATABASE_URL: ${env:POSTGRES_URL}
allowed_tools:
- "query_readonly_sql" # 自定义工具:仅 SELECT
- "list_tables"
# 不允许 execute_ddl、delete_rows 等
github:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: ${env:GITHUB_READONLY_TOKEN}
allowed_tools:
- "list_issues"
- "get_issue"
- "list_pull_requests"
4.2 多环境凭证隔离
从 v2026.4.3 开始,Hermes 支持同供应商多个 API 密钥的自动轮换(Credential Pools),可以采用 least_used 分配策略,某个密钥触发 401 时自动切换至下一组凭证。
yaml
model:
provider: openai
credentials:
- key: ${OPENAI_KEY_TEAM_A}
quota_limit: 1000000
- key: ${OPENAI_KEY_TEAM_B}
quota_limit: 500000
rotation_strategy: least_used
五、第 4 项:code_execution 沙箱是否启用?
code_execution 是 Hermes 中风险最高的工具------执行任意 Python 或 JS 代码的能力在缺乏沙箱隔离时等同于系统后门。
5.1 Docker 沙箱启用示例
yaml
# ~/.hermes/config.yaml
terminal:
backend: "docker"
docker:
image: "sandbox:minimal"
network_enabled: false
memory_limit: "512m"
cpu_quota: 1.0
read_only_rootfs: true
privileged: false
security_opt:
- "no-new-privileges:true"
seccomp_profile: "seccomp-strict.json" # 系统调用过滤
user: "nobody"
5.2 白名单系统调用过滤器
json
{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": ["SCMP_ARCH_X86_64"],
"syscalls": [
{"names": ["read", "write", "exit", "exit_group"], "action": "SCMP_ACT_ALLOW"},
{"names": ["execve", "fork", "clone", "ptrace"], "action": "SCMP_ACT_ERRNO"}
]
}
5.3 AppArmor / SELinux 系统级兜底
在宿主机层面提供额外防护:
bash
# 启用 Hermes 专用 AppArmor 配置文件
sudo aa-enforce /etc/apparmor.d/usr.bin.hermes
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.hermes
⚠️ 官方 v2026.3.28 前后版本的 Docker 默认安全基线薄弱。如果未经以上加固,攻击者可在 30 秒内逃逸容器并获得宿主机的 root 权限------这不是危言耸听。code_execution 在没有子沙箱的情况下必须保持
false。
六、第 5 项:子 Agent 工具集是否受限?
主 Agent 可通过 delegate_task 派生子 Agent,但子 Agent 最多并行 3 个且各自拥有不同工具集与独立上下文。子 Agent 的默认权限不应超过父 Agent。
6.1 子 Agent 工具受限配置(AGENTS.md)
yaml
# ~/.hermes/agents/AnalystAgent.yaml
name: AnalystAgent
description: 只读分析子 Agent
allowed_tools:
- "http_request"
- "file_read"
- "sql_query"
forbidden_tools:
- "shell_execute"
- "file_write"
- "code_execution"
config:
memory: {enabled: false}
budget_pool: "analyst-pool"
max_tool_calls: 10
6.2 skill / tools_guard.py 权限白名单机制
python
# tools/skills_guard.py
RESTRICTED_USERS = ["analyst-001", "guest-*", "bot-*"]
ADMIN_USERS = ["admin-001"]
def check_permission(user_id: str, tool_name: str, tool_args: dict) -> bool:
if any(cmd in str(tool_args) for cmd in ["rm -rf", "sudo", "chmod 777"]):
raise PermissionDeniedError("禁止调用高危命令") # 全局拒绝
if user_id in RESTRICTED_USERS:
allowed_tools = ["file_read", "web_search"]
if tool_name not in allowed_tools:
return False
if user_id in ADMIN_USERS:
return True
return False
七、第 6 项:是否限制了单次对话的最大工具调用次数?
单个 Agent 的一个 turn 通常会触发 20-50 次工具调用(规划、选择工具、执行、检查、总结等)。若无上限,可能导致失控循环、Token 溢出甚至恶意循环攻击。
7.1 配置最大工具调用次数
yaml
# ~/.hermes/config.yaml
loop:
enabled: true
max_iterations: 10 # 单次对话最大工具调用轮次
max_tool_calls: 30 # 单轮最多工具调用次数
timeout_seconds: 300 # 超时自动终止循环
gateway:
runtime:
request_max_turns: 50 # 网关层最大轮次(含所有子 Agent)
per_request_budget_cost: 0.20 # 单次会话预算上限(美元)
八、第 7 项:API key 是否使用环境变量而非明文?
8.1 密钥管理的五项强制策略
直接写在 config.yaml 硬编码是泄露的主要来源。正确方案:
- ✅ 使用
.env文件 :所有密钥写入~/.hermes/.env,config.yaml只通过${env:VAR_NAME}引用 - ✅ OAuth + Token 刷新:通过 OAuth 2.0 + off‑session refresh token 机制定期轮换
- ✅ Credential Pools:同一供应商配置多组 API Key,自动 least_used 轮换与 401 故障转移
- ✅ Git 封锁敏感文件 :
.gitignore必须明确禁止.env、.env.local、cli-config.yaml入版本库 - ✅ 日志自动脱敏 :API 密钥等敏感信息被自动正则匹配替换为
sk-********形式
8.2 应用 Credential Pools(v2026.4.3+)
yaml
# config.yaml
model:
provider: openai
credentials:
- key: ${env:OPENAI_KEY_TEAM_A}
quota_limit: 5000000
- key: ${env:OPENAI_KEY_TEAM_B}
quota_limit: 3000000
rotation_strategy: least_used # 轮换策略
⚠️ 如果某个 API 密钥被轮换至耗尽,
least_used法会继续分配余量,防止服务中断,但仍需时刻监控各池用量。
九、第 8 项:是否设置了模型调用预算上限?
缺少预算控制是云成本失控的主因。
9.1 多层级费用限制方法
方法 1:API Key 级别消费上限(服务商侧)
登录 API 提供商控制台,为 Hermes 分配独立 API 密钥并设定月度限额:开发环境 5/月,测试环境 10/月,生产环境 ≤ 预估用量的 150%。
方法 2:请求前费用预检中间件
python
# tools/fee_guard.py 核心示例
def pre_check_fee(input_tokens, max_tokens, model):
unit_cost = PRICE_TABLE[model] # $/1M tokens
input_cost = (input_tokens / 1_000_000) * unit_cost
output_cost = (max_tokens / 1_000_000) * unit_cost
estimated = input_cost + output_cost
if estimated > MAX_REQ_COST:
raise ValueError(f"请求估算费用 ${estimated:.4f} 超过上限")
return True
# process_request() 在发送到 LLM 之前调用本函数
方法 3:配置 token 用量预警阈值
bash
hermes_hudui --enable-token-limit --daily-limit 10000
# 或启用服务端管理工具进行施压
运行 hermes_hudui 访问 http://127.0.0.1:3001,COSTS 面板实时显示用量------这是费用控制的前提。
方法 4:预算池分池管控(团队场景)
yaml
# config/budget_pools.yaml
doc_analyzer_pool: {monthly_cap: 120, reset_day: 1}
code_gen_pool: {monthly_cap: 300, reset_day: 1}
十、第 9 项:日志是否记录所有工具调用?
审计日志是事后追溯问题的唯一可靠来源。
10.1 启用高细粒度审计
yaml
# ~/.hermes/config.yaml
audit:
enabled: true
level: "full" # none/minimal/normal/full
include_headers: false # 避免敏感标头泄露
exclude_fields: ["api_key", "authorization"]
log_destination: "/var/log/hermes/audit.log"
retention_days: 90
gateway:
audit_log_tools: true
10.2 覆盖必须记录的维度
| 审计项 | 说明 | 强制性 |
|---|---|---|
| 每个工具调用的参数 | 命令参数 + 执行结果 | ✅ 必须 |
| sub‑agent 委派链路 | 委派者 → 目标 Agent → 最终输出 | ✅ 必须 |
敏感操作 *(改文件、执行 shell 等) |
完整参数 + 执行结果 | ✅ 必须 |
| cron 任务触发记录 | 表达式 + 执行结果 | 推荐 |
| Skill 自改进记录 | 原版本 → 新版本 | 推荐 |
10.3 定期巡检审计日志
bash
# 排查一次会话超过 50 次工具调用
grep "tool_call" /var/log/hermes/audit.log | jq 'group_by(.session_id) | map({session_id: .[0].session_id, tool_count: length}) | .[] | select(.tool_count > 50)'
# 分析一周内哪类工具调用最多
grep "tool_name" /var/log/hermes/audit.log | sort | uniq -c | sort -nr
十一、第 10 项:是否定期审计 Skill 自改进的内容?
Hermes 的"自进化"能力通过 GEPA 算法 + DSPy 框架持续优化已有的 Skills。Skill 的自动生成和自我修复(patch 操作)是巨大优势,但如果不定期审计,可能无意中引入了安全缺口。
11.1 Skill Patch 手动审核机制
bash
# 列出近期被自动生成或更新的 Skill
ls -la ~/.hermes/skills/ | grep -E "SKILL\.md$"
# 查看 Skill 具体内容
cat ~/.hermes/skills/your_skill.md | head -50
# 移除可疑 Skill
rm ~/.hermes/skills/suspicious_script.md
11.2 安全策略
| 动作 | 安全要求 |
|---|---|
| 自动生成 Skill | ✅ 允许,但需记录生成上下文 + 审计平台 |
| GEPA 主动进化 | ⚠️ 需人工 review 修改内容,设 review 闸门 |
| 修复 patch 操作 | ❗ 高危操作,必须强制 fallback 机制 + 审批链路 |
十二、模板:全栈最小权限生产级 config.yaml 样板
yaml
# ~/.hermes/config.yaml --- 安全基线 v2.0 (As of April 2026)
# 基于最新 Hermes 运行安全审计清单整理,替换为适合你自己的版本
terminal:
backend: "docker" # ✅ 生产环境必须为 docker
docker:
image: "python:3.12-slim"
network_enabled: false
memory_limit: "512m"
cpu_quota: 1.0
read_only_rootfs: true
privileged: false
security_opt: ["no-new-privileges:true"]
user: "sandbox"
tools:
# 高危工具优先 false(极高)
shell_execute: false # ❌ 保持 false
code_execution: false
# 按需打开的基础工具:
file_system: false
http_request: true
session_search: true
# 其他工具
loop:
max_iterations: 10
max_tool_calls: 30
timeout_seconds: 300
mcp_servers:
filesystem:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "/data/hermes"]
allowed_tools: ["filesystem_list_directory", "filesystem_read_file"]
model:
provider: openai
credentials:
- key: ${env:OPENAI_KEY_A}
quota_limit: 1000000
- key: ${env:OPENAI_KEY_B}
quota_limit: 1000000
rotation_strategy: least_used
budget: {daily_limit: 50, monthly_limit: 1000}
audit:
enabled: true
level: "full"
log_destination: "/var/log/hermes/audit.log"
十三、总结:安全审计闭环
| 序号 | 检查项 | 核心防范目标 | 存放位置 |
|---|---|---|---|
| 1 | terminal 后端 | 命令注入 → 沙箱 | terminal.backend |
| 2 | Toolset 最小化 | 功能越权 | tools 区块 |
| 3 | MCP per-server 过滤 | 外部服务越权 | mcp_servers/*.allowed_tools |
| 4 | code_execution 沙箱 | 任意代码执行 | terminal.docker |
| 5 | 子 Agent 受限工具 | 委派任务权限膨胀 | agents/*.yaml |
| 6 | 最大工具调用次数 | DoS & 循环 | loop.max_tool_calls |
| 7 | API 环境变量隔离 + Credential Pools | 密钥泄露 | .env + credentials |
| 8 | API 调用预算上限 | 成本失控 | model.budget / fee_guard |
| 9 | 审计日志 | 事后追溯 | audit.enabled |
| 10 | Skill 自改进审计 | 恶意知识注入 | 手工 review |
| 11 | 系统级权限/隔离 | 容器逃逸 | AppArmor / SELinux / seccomp |
每季度至少运行一次 hermes doctor --security-audit(或手工按上述清单审查),将确认项标记至审计报告。AI Agent 的安全防线不是一次性配置完就能一劳永逸的------每个变更、新集成的 MCP、自动生成的 Skill,都可能成为新的潜在突破口。
信任来自约束。让我们从今天开始,一起打造"越可控,越强大"的智能体未来。
💬 你排查过哪些高危安全配置?欢迎在评论区分享你的"安全经验贴"------公开的每一次困境,都是整个社区的坚盾。
本文作者 :[RickyIT]
原创不易,欢迎点赞、收藏、转发