Hermes Agent 安全四层纵深:最小权限原则从理论到落地的完全指南
逐层剖析 Hermes 的权限防御体系,手把手构建零信任级 AI Agent 安全边界
前言:为什么 AI Agent 比普通应用更需要最小权限?
2026 年 2 月,Nous Research 开源了 Hermes Agent。截至 2026 年 4 月底,它的 GitHub Star 已突破 10 万,在不到 60 天的时间里完成了从 0 到爆发的跨越,成为全球最受关注的 AI Agent 基础设施之一。
飞速增长背后隐藏着一个关键问题:当 AI Agent 能读写文件、执行系统命令、调用 40+ 工具时,它会不会成为你的系统中最脆弱的一环?
2026 年 4 月,CVE-2026-25253 被公开------一个 CVSS 评分高达 8.8 的零点击远程代码执行漏洞,攻击者只需让用户访问一个恶意网页,即可通过 WebSocket 网关静默窃取认证令牌,完全接管用户的 Agent。这一漏洞的曝光再次警示所有 AI Agent 用户:安全不是可选项,而是底线。
Hermes 的设计哲学给出了一套完整的答案------六层纵深防护体系 ,包括命令审批、容器隔离、技能扫描、数据加密等机制。本文将聚焦其中最关键的一条原则:最小权限原则(Principle of Least Privilege,PoLP) 在 Hermes 中的四层落地实践。
第四层
沙箱 + 系统级隔离
Docker沙箱
AppArmor/SELinux
第三层
子 Agent 权限裁剪
delegate_task
受限工具集
第二层
MCP per-server 过滤
allowed_tools
白名单
第一层
Toolset 开关
全局工具
启用/禁用
Hermes Agent 四层纵深防御体系
用户/角色
权限控制
本文将带着四个核心问题展开:
- 第一层:Toolset 开关:如何在 config.yaml 中精准控制 Hermes 能做什么?
- 第二层:MCP per-server 工具过滤:如何为不同的 MCP 服务器设置独立的工具白名单?
- 第三层:子 Agent 权限裁剪:如何确保委派的子 Agent 没有不受控的超能力?
- 第四层:code_execution 沙箱与系统级 AppArmor/SELinux:如何从底层封锁最危险的漏洞?
读完本文,你将拥有一套完整的最小权限配置模版,可以把 Hermes 放进"权限的笼子"里。
一、第一层:Toolset 开关------全局工具的精准禁用
1.1 默认安全:所有工具默认关闭
Hermes 最聪明的设计之一,就是它的默认策略是完全禁用 。所有工具默认关闭,必须显式设为 true 才可调用------这是 Hermes Agent 从设计之初就内建的默认安全策略。
这意味着:你在第一次配置 Hermes 时,它只是一个"会聊天但什么也做不了"的 LLM 外壳。你必须主动声明允许它访问哪些能力。
1.2 config.yaml 的 tools 区块详解
工具启用逻辑集中在 ~/.hermes/config.yaml 中的 tools 区块:
yaml
tools:
# 执行类
shell_execute: false # Shell 命令执行(高风险)
terminal_backend: "host" # 终端后端:host/docker/singularity
file_system: false # 文件系统读写(中高风险)
# 信息类
http_request: false # HTTP 请求(中风险,可能 SSRF)
web_search: false # 网络搜索(低风险)
browser_control: false # 浏览器自动化(高风险)
# 记忆类
session_search: false # 会话检索(低风险,建议开启)
skills_manage: false # 技能管理(中风险)
# 代码执行
code_execution: false # Python/Javascript 代码执行(极高风险)
威胁评估速查表:可以按自己的需求组合启用工具。下表汇总了每类工具的风险等级与适用场景:
| 工具分类 | 风险等级 | 适用场景 | 推荐启用状态 |
|---|---|---|---|
| session_search | 低 | 检索历史对话,提升连贯性 | ✅ 建议开启 |
| http_request | 中 | 调用外部 API、抓取网页 | ⚠️ 需限源 |
| file_system | 中高 | 读写本地文件 | ⚠️ 启用沙箱 |
| shell_execute | 高 | 执行系统命令 | ❌ 高风险慎开 |
| browser_control | 高 | 浏览器自动化 | ❌ 默认关闭 |
| code_execution | 极高 | 执行自定义代码 | ❌ 生产环境禁开 |
禁用某项工具后,Agent 在运行时将完全忽略对应 function calling 请求------不会抛出错误也不会启用回退,只是 Agent 不再拥有这项能力。
1.3 配置文件的权限隔离
除了工具开关,配置文件本身的权限也是防线的重要一环。
Hermes 的配置文件(包括 ~/.hermes/config.yaml 和 .env)在启动时被自动设为 600 权限,这意味着仅文件所有者可读可写 ,能有效防止未授权访问与篡改。需要确保 .gitignore 中明确过滤 .env、.env.local、cli-config.yaml 等实际配置文件,禁止敏感文件进入版本控制。
二、第二层:MCP per-server 工具过滤
2.1 微服务化的权限治理目标
在 AI Agent 与外部系统互联的场景中,Hermes 通过 MCP(模型上下文协议)集成各类外部服务------GitHub、文件系统、PostgreSQL、Slack 等。不同的外部服务应该拥有完全不同的工具准入权限:GitHub MCP 大概率需要 write 权限,而文件系统 MCP 可能只允许读特定的白名单目录。
这种"每个连接拥有独立权限边界"的做法,正是微服务化权限治理的核心思想。
2.2 MCP 服务器的权限拆分
在 ~/.hermes/config.yaml 中,可以通过 mcp_servers 字段配置多个 MCP 服务器,每个服务器单独配置工具访问范围。
2.2.1 基础配置模式
yaml
mcp_servers:
# 文件系统 MCP - 只读模式
filesystem_readonly:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "/data/reports"]
env:
FILESYSTEM_READ_ONLY: "true" # 官方 MCP Server 支持只读模式
# GitHub MCP - 全功能但限制仓库范围
github:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: ${GITHUB_TOKEN}
GITHUB_REPO_ALLOW_LIST: "myorg/analytics,myorg/backup"
2.2.2 使用 allowed_tools 创建严格白名单
MCP 协议层面提供了 allowed_tools 机制,可以按接入场景准确指定 Agent 可用的工具。这是一个严格的白名单------只有列表中的工具可以被调用,其余全部禁止。
yaml
mcp_servers:
postgres:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost/mydb"]
allowed_tools:
- "query"
- "list_tables"
# 不允许 "execute"(DDL操作)和 "delete_record"
github_readonly:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-github"]
allowed_tools:
- "list_issues"
- "get_issue"
- "list_pull_requests"
# 不允许 "create_issue", "merge_pull_request"
2.2.3 同供应商的多环境凭证池隔离
对于调用 OpenAI、DeepSeek、Anthropic 等模型 API 的场景,不应在不同 MCP 实例间混用同一条 API Key。
Hermes v2026.4.3 引入了 Credential Pool 机制,支持为同一供应商配置多组 API Key,并实现自动轮换。当某组凭据返回 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
安全铁律:为每个 MCP 服务器单独配置最小权限密钥,切忌重用主账号的 universal token。据 Shodan 数据显示,大量公开部署的 Agent 因凭证配置不当存在被远程接管风险。
三、第三层:子 Agent 受限工具集
3.1 委派任务的"权力下放"原则
Hermes 支持主 Agent 通过 delegate_task 工具派生子 Agent 执行复杂或独立的子任务。子 Agent 在逻辑上是独立的 Agent 实例------它拥有独立的上下文,执行完成后将结果返回父 Agent。
这意味着一旦主 Agent 被攻破,它委派出去的子 Agent 可能带着"不必要的超能力"去执行本应是受限的任务。所以,必须为不同的子 Agent 定义独立且受限的工具集。
3.2 子 Agent 配置的权限裁剪
在 ~/.hermes/agents/ 目录下,可以为不同的子任务定义专属 Agent 配置文件:
markdown
# agents/analytics-agent.md
---
name: analytics-agent
description: 只读数据分析和报表生成 Agent
allowed-tools:
- http_request
- file_system:[read]
- sql_query
forbidden-tools:
- shell_execute
- file_write
- code_execution
model: openrouter/openai/gpt-4o-mini
system-prompt: |
你是一个数据分析助手。
你只能读取数据、运行 SQL 查询、调用分析 API。
你绝不能删除或修改任何数据。
绝不能执行系统命令或写入文件。
如果用户要求你做任何可能破坏数据的操作,优雅拒绝。
---
在 tools/skills_guard.py 中,可以使用基于用户 ID 或 OpenID 的硬编码白名单校验来实现更深度的细粒度控制:
python
# tools/skills_guard.py 权限校验核心
def check_permission(user_id: str, tool_name: str, tool_args: dict) -> bool:
# 全局黑名单(无论谁调用都禁止)
sensitive_commands = ["rm -rf", "sudo", "chmod 777", "mkfs"]
if any(cmd in str(tool_args) for cmd in sensitive_commands):
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
3.3 利用 OAuth 身份绑定实现组级权限管理
在企业部署中,可以集成飞书、企业微信或钉钉的 OAuth 2.0 认证流转,将部门 / 角色信息同步到检查链中:
- 使用
hermes auth login触发 OAuth 授权流程,获取合法user_id与access_token,并将user_id写入auth.json的user_id字段,access_token存入oauth_token字段并设置 15 分钟自动刷新 - 在
check_permission中调用飞书联系人 API 反查user_id对应的部门与角色 - 根据部门可访问的工具集决策放通与否
对关键敏感操作(如 skills_guard.py 中标记的 code_execution 工具),建议额外加入基于会话的动态提权逻辑------例如 debug 触发 + 验证码确认,并在审计日志中全程留存。
四、第四层:code_execution 沙箱与系统级 AppArmor/SELinux
前三层防线负责"权限决策",但不能割裂地认为它们就足够了。危险命令的执行、代码的逃逸企图需要第四层来物理阻断------这一层分为 Docker 沙箱隔离 和 AppArmor/SELinux 系统级锁定 两个维度。
4.1 Docker 沙箱:容器化终端后端
Hermes 最安全的生产部署模式,是将其配置为在 Docker 容器中执行所有终端操作和代码运行,并设计一套严密的安全约束。
yaml
# ~/.hermes/config.yaml
terminal:
backend: "docker"
docker:
image: "python:3.12-slim" # 轻量镜像,减小攻击面
network_enabled: false # 彻底阻断容器外连能力
memory_limit: "512m" # 内存上限
cpu_quota: 1.0 # CPU 配额
read_only_rootfs: true # 只读根文件系统
privileged: false # 禁止特权模式
security_opt:
- "no-new-privileges:true" # 禁止权限提升
- "seccomp=seccomp-profile.json" # seccomp 系统调用过滤
user: "sandbox" # 非 root 用户运行
4.1.1 Docker 安全约束检查清单
| 配置项 | 推荐值 | 作用 |
|---|---|---|
backend |
docker |
启用 Docker 后端作为终端执行环境 |
network_enabled |
false |
彻底隔离网络,阻断外连风险 |
memory_limit |
512m |
限制内存,防止 fork 炸弹类攻击 |
read_only_rootfs |
true |
根文件系统只读,容器内找不到可写系统目录 |
privileged |
false |
关闭特权模式,阻止容器内启用危险 ptrace、篡改内核功能 |
security_opt |
no-new-privileges:true |
禁止进程运行时提升权限 |
user |
非 root(如 sandbox) |
以普通用户执行,即使容器逃逸也无法获得 root |
资源控制 :memory_limit: "512m" 和 cpu_quota: 1.0 可以约束单个容器无法耗尽宿主机资源。如果执行文件或 SQL 查询需要大量内存,按需上调但保持有界。
容器生命周期管理:每次任务启动全新密封容器,执行完毕立即销毁,彻底消除状态残留的风险。
4.2 AppArmor / SELinux:操作系统级别的防逃逸保险丝
容器本身在默认配置下可能绕过安全约束------某些 Docker 宿主机未启用 User Namespace 隔离,攻击者一旦逃逸容器就可获得宿主机系统权限。AppArmor(Ubuntu 和 Debian 系列)和 SELinux(CentOS/RHEL 系列)是 Linux 系统级别的强制访问控制(MAC)安全模块,可以对进程的访问权限进行更细粒度的限制。
4.2.1 编写 Hermes 专用的 AppArmor 配置文件
在 /etc/apparmor.d/usr.bin.hermes 中写入 Hermes Agent 专用的 profile:
bash
# /etc/apparmor.d/usr.bin.hermes
#include <tunables/global>
/usr/bin/hermes {
# 必要的能力(白名单模式)
capability dac_override,
# 隔离沙箱内的文件访问(仅限于白名单目录)
/data/ r,
/workspace/ rw,
/home/*/.hermes/ rw,
deny /etc/passwd r,
deny /etc/shadow r,
# network 子集控制
network inet stream,
# 进程启动约束
deny /bin/dash px,
deny /bin/bash px,
}
启用并加载该 profile:
bash
systemctl reload apparmor
apparmor_parser -r /etc/apparmor.d/usr.bin.hermes
4.2.2 验证 SELinux 为 Enforcing 状态(适用于 RHEL/CentOS)
bash
# 检查 SELinux 当前状态
getenforce
# 期望输出:Enforcing (不是 Permissive 或 Disabled)
# 查看当前策略
semanage boolean -l | grep hermes
若 getenforce 返回 Permissive 或 Disabled,需进行修复,确保系统级别的访问控制生效。
4.2.3 权限降级运行
永远不要以 root 身份运行 Hermes Agent。即使 Agent 被攻击或配置错误,攻击者也无法立即获取系统最高权限。推荐创建专用的非特权系统用户运行 Hermes:
bash
# 创建 hermes 专用用户(无登录 shell)
sudo useradd -r -s /bin/false hermes
# 将配置文件所有权移交给该用户
sudo chown -R hermes:hermes ~/.hermes
# 以该用户启动 Hermes Gateway
sudo -u hermes hermes gateway
五、实战:配置一个"只读数据分析助手"
让我们把四层原则拼成一个真实场景:假设你需要在团队内部署一个只读数据分析助手,它能够:
- 从只读挂载的 CSV/日志文件目录读取数据
- 执行 SQL 查询(只读数据库)
- 生成报表并推送消息
- 坚决禁止修改文件和执行系统命令
下面是每一层的配置方案。
第四层: 沙箱
第三层: 子Agent
第二层: MCP过滤
第一层: Toolset
用户输入
"分析昨日日志"
"生成报表"
tools
shell_execute: false
code_execution: false
file_write: false
file_read_only: true
mcp_servers
postgres
allowed_tools: query/read
filesystem
mount_points: /data/reports:ro
只读密钥池
analytics-agent
allowed-tools: sql_queryhttp_requestfile_read
forbidden: shell_write/exec
terminal.backend: docker
network_enabled: false
memory_limit: 512m
AppArmor启用
非root运行
5.1 第一层:Toolset 只读微调
yaml
# ~/.hermes/config.yaml
tools:
# 基础能力
file_system: false # 文件系统写完全禁用
file_system_readonly: true # 自定义只读文件系统
shell_execute: false # Shell 命令禁用
code_execution: false # 代码执行禁用
session_search: true # 保留会话检索
http_request: true # 允许调用报表API
核心思路 :在全局层面默认禁用所有写入类工具,仅开启 http_request 和只读能力。
5.2 第二层:MCP per-server 只读过滤
yaml
mcp_servers:
postgres_readonly:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost/analytics"]
allowed_tools:
- "query" # 只允许 SELECT/SHOW/EXPLAIN
- "list_tables"
env:
PGCONNECT_TIMEOUT: 10
PGSSLMODE: "require"
filesystem_readonly:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-filesystem", "/data/reports"]
env:
FILESYSTEM_READ_ONLY: "true" # MCP Server 级别的只读
5.3 第三层:子 Agent YAML 配置
yaml
# agents/analytics-agent.yaml
name: analytics-agent
description: 只读数据分析专家
allowed_tools:
- query
- list_tables
- file_read
- http_request
forbidden_tools:
- file_write
- shell_execute
- code_execution
memory:
enabled: true
persist_frequency: always
5.4 第四层:Docker 沙箱 + AppArmor
bash
# 启动只读分析版 Docker 沙箱
docker run --rm \
--network none \
--memory 512m \
--read-only \
--security-opt no-new-privileges:true \
-v /data/reports:/reports:ro \
-it hermes-sandbox:strict \
hermes agent analytics-agent
在宿主机上启用 AppArmor 并加载专有 profile:
bash
sudo aa-enforce /etc/apparmor.d/usr.bin.hermes
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.hermes
# 最终验证只读的生效性
hermes chat
> 删除 /data/reports/old.log
# Agent 回应:由于权限限制,无法执行此操作。
六、常见问题排查与排障指南
📋 问题检测前:使用 hermes doctor 快速诊断
bash
hermes doctor
该命令可以一次性检查配置文件的语法完整性、权限设置(600 校验)、工具依赖项的安装情况。这是排查安全配置问题的第一步。
| 常见报错 | 原因 | 解决方法 |
|---|---|---|
PermissionError: [Errno 13] Permission denied |
Agent 进程无权限访问目标文件 | 检查目标目录访问权限,并确保第四层沙箱配置的 mount_points 路径指向正确 |
401 Unauthorized 错误频繁出现 |
MCP token 失效或过期 | 使用 Credential Pool 能力配置多组备用密钥,并定期轮转 |
| AppArmor 拦截 Hermes 进程 | profile 未配置必要的系统能力白名单 | 修改 /etc/apparmor.d/usr.bin.hermes 添入 capability dac_override 等必须的能力 |
fork: retry: Resource temporarily unavailable |
内存限制过低 | 适当提升 memory_limit 至 1G 或 2G |
| 子 Agent 执行任务时提示工具不可用 | 子 Agent 权限配置过严 | 检查 agents/*.yaml 中的 allowed_tools 列表,补充必要的最小集 |
| Agent 被攻击后留下异常痕迹 | 审计日志未开启 | 启用 audit_enabled: true,检查 log_level: debug 以记录所有操作链路 |
七、总结:四层防御,让 AI 只做你想让它做的事
Hermes Agent 的四层最小权限安全体系,核心可以用下面这张分层防御架构图概括:
┌─────────────────────────────────────────────────────────────────┐
│ Hermes 四层最小权限防御体系 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 用户 → 消息网关/Gateway → 身份认证 → 权限过滤 → 安全执行 │
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐
│ │ 第一层:Toolset 开关 │ │ 第二层:MCP per-server 过滤 │
│ │ config.yaml 全局禁用/启用 │ │ allowed_tools 白名单 │
│ │ 默认全部关闭,显式开启 │ │ 每个 MCP Server 独立权限 │
│ └─────────────────────────────┘ └─────────────────────────────┘
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────────────────┐ ┌─────────────────────────────┐
│ │ 第三层:子 Agent 权限裁剪 │ │ 第四层:沙箱+系统级隔离 │
│ │ delegate_task 受限工具集 │ │ Docker + AppArmor/SELinux │
│ │ skills_guard.py 黑白名单校验 │ │ 非 root 运行 + 内存限制 │
│ └─────────────────────────────┘ └─────────────────────────────┘
│ │
└─────────────────────────────────────────────────────────────────┘
| 层级 | 核心机制 | 关键配置 | 防御目标 |
|---|---|---|---|
| 第一层 | Toolset 开关 | config.yaml 的 tools 区块 |
阻止粗略权限暴露------Agent 根本不具备某类能力 |
| 第二层 | MCP per-server 过滤 | allowed_tools 与 Credential Pool |
每个接入系统的工具细粒度白名单与凭证独立 |
| 第三层 | 子 Agent 权限裁剪 | delegate_task + AGENTS.md |
委派任务时消除"权力膨胀" |
| 第四层 | 沙箱 + 系统级隔离 | Docker + AppArmor/SELinux | 漏洞利用后的纵深物理隔离 |
给读者的最终建议:
- 📌 从生产第一天就遵守"四位一体"的最小权限原则,不要等攻击发生后再补救
- 📌 定期审计
~/.hermes/agents/*.yaml中的allowed_tools和forbidden_tools列表 - 📌 至少每季度轮换一次 Credential Pool 中的 API 密钥
- 📌 监控审计日志(
log_level: debug)和云端部署的堡垒机告警,形成运维闭环 - 📌 对于非核心场景,如果难以把握四层配置的平衡,优先使用更严格的策略(宁可启用不了某些工具,也不要过度授权)
真正的"安全 AI Agent"不是建立在信任之上,而是建立在边界最小化 之上------你知道 AI 不能做什么,远比知道它能做什么更重要。
📌 延伸阅读
- Hermes Agent GitHub 官方仓库
- 40+ 工具、7 种执行后端:Agent 的"手脚"是如何安全伸出去的?
- Hermes Agent 容器安全最佳实践:镜像加固与运行时防护
- 自主智能体 Hermesagent 开源:生产环境下的安全架构深度剖析
💬 你配置 Hermes 时遇到的最大权限问题是什么?欢迎在评论区分享解决方案!
本文作者 :[RickyIT]
原创不易,欢迎点赞、收藏、转发