【Hermes:安全、权限与生产环境】38、Hermes Agent 安全四层纵深:最小权限原则从理论到落地的完全指南

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.localcli-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 认证流转,将部门 / 角色信息同步到检查链中:

  1. 使用 hermes auth login 触发 OAuth 授权流程,获取合法 user_idaccess_token,并将 user_id 写入 auth.jsonuser_id 字段,access_token 存入 oauth_token 字段并设置 15 分钟自动刷新
  2. check_permission 中调用飞书联系人 API 反查 user_id 对应的部门与角色
  3. 根据部门可访问的工具集决策放通与否

对关键敏感操作(如 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 返回 PermissiveDisabled,需进行修复,确保系统级别的访问控制生效。

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.yamltools 区块 阻止粗略权限暴露------Agent 根本不具备某类能力
第二层 MCP per-server 过滤 allowed_tools 与 Credential Pool 每个接入系统的工具细粒度白名单与凭证独立
第三层 子 Agent 权限裁剪 delegate_task + AGENTS.md 委派任务时消除"权力膨胀"
第四层 沙箱 + 系统级隔离 Docker + AppArmor/SELinux 漏洞利用后的纵深物理隔离

给读者的最终建议

  1. 📌 从生产第一天就遵守"四位一体"的最小权限原则,不要等攻击发生后再补救
  2. 📌 定期审计 ~/.hermes/agents/*.yaml 中的 allowed_toolsforbidden_tools 列表
  3. 📌 至少每季度轮换一次 Credential Pool 中的 API 密钥
  4. 📌 监控审计日志(log_level: debug)和云端部署的堡垒机告警,形成运维闭环
  5. 📌 对于非核心场景,如果难以把握四层配置的平衡,优先使用更严格的策略(宁可启用不了某些工具,也不要过度授权)

真正的"安全 AI Agent"不是建立在信任之上,而是建立在边界最小化 之上------你知道 AI 不能做什么,远比知道它能做什么更重要。

📌 延伸阅读

💬 你配置 Hermes 时遇到的最大权限问题是什么?欢迎在评论区分享解决方案!

本文作者[RickyIT]
原创不易,欢迎点赞、收藏、转发

相关推荐
旦莫1 小时前
AI驱动的纯视觉自动化测试:知识库里应该积累什么知识内容
人工智能·python·测试开发·pytest·ai测试
dfsj660112 小时前
第四章:深度学习革命
人工智能·深度学习
张伯毅2 小时前
如何构建一个生产级 AI Agent CLI —— 以 Claude Code 架构探索
人工智能·架构
知识领航员2 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
cskywit2 小时前
【CVPR2024】用Diffusion“造”遥感分割数据:SatSynth论文解读
人工智能·深度学习·计算机视觉
virtaitech2 小时前
算力浪费与算力饥渴并存,OrionX社区版免费开放能否破解这一困局?
大数据·人工智能·gpu算力
火山引擎开发者社区2 小时前
业务团队也能“手搓”应用?火山 Supabase 助力猿辅导对话式 Agent 落地
人工智能
薛定e的猫咪2 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法
happyprince2 小时前
03-FlagEmbedding 推理模块深度分析
人工智能