【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
原创不易,欢迎点赞、收藏、转发

相关推荐
江畔柳前堤13 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术13 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客13 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术14 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO15 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术15 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架15 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab15 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI15 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab16 小时前
【无标题】
人工智能·开源