安全实践

给 Hermes Agent 装上"护栏":防误操作的权限与安全实践

给 Hermes Agent 装上"护栏":防误操作的权限与安全实践

上周 AI 圈最扎眼的新闻之一,是 Anthropic 直接切断了所有内部评测的实时联网——理由很直白:他们承认,目前还无法可靠地控制智能体。一个连自家实验室都觉得"管不住" agent 的行业里,我们这些把 Hermes 接上 shell、文件、浏览器,天天让它替我们跑任务的个人用户,更应该先把"护栏"装好,再谈效率。

这篇文章不讲大道理,只给一套可落地的四层护栏:Profile 隔离、密钥分离、SOUL.md 硬边界、最小权限起步,外加一套出事后的止损流程。全部基于 Hermes 现有能力和社区真实踩坑组合而成,不需要等官方出新功能。

先认清:Agent 的权限,就是你的权限

Hermes 的能力边界,约等于你给它的工具边界。它能读文件,就能读错文件;能跑 shell,就能跑错命令;配了发邮件的 Skill,它就有可能在你没点头的情况下把邮件发出去了。社区里真实出现过的"翻车"形态:

这些都不是模型"变坏"了,而是边界没划清。护栏的作用,就是把"它能做什么"收敛到"你想让它做的"。

护栏一:Profile 隔离——实验和生产分家

Hermes 的 Profile 是天然的隔离单元:不同 Profile 意味着不同的运行根目录、记忆、Skill 和定时任务。之前配置教程里提过,"命名 Profile 应视为独立运行单元"。落到安全实践上,建议至少分两个:

先看清现状:

hermes profile list
hermes tools
printf 'HERMES_HOME=%s\n' "${HERMES_HOME:-<default>}"

验收标准很简单:在 daily 里让 agent 做一件写操作,它应该明确告诉你"这个 Profile 没有该工具/权限",而不是想办法绕过去。定时任务(cron)尤其要用独立的小权限 Profile 跑——半夜无人值守的任务,权限越小越好,千万别把日常聊天的万能 Profile 挂到 cron 上。

Profile 隔离还有一个被低估的好处:记忆隔离。实验 Profile 里那些"试试看"的折腾记录,不会污染生产 Profile 的记忆和判断。很多"agent 今天怎么变笨了"的抱怨,根因是不同场景的记忆混在了一起。分家之后,每个 Profile 的记忆都更干净,行为也更可预测。

护栏二:密钥永不进文本

这是社区里血泪最多的一条:API Key 写进 SOUL.md、写进 SKILL.md、顺手提交到 git,等于把家门钥匙贴在了小区门口。正确姿势只有一条:密钥只活在环境变量里。

换环境后先做一次"体检",只输出"有没有",不输出值:

for name in MODEL_API_KEY OPENAI_API_KEY ANTHROPIC_API_KEY DEEPSEEK_API_KEY; do
  if [ -n "${!name}" ]; then printf '%s=set\n' "$name"; else printf '%s=missing\n' "$name"; fi
done

怀疑泄露时,别只删本地文本——先去供应商控制台撤销并重新生成,再更新环境变量,顺序不能反。另外,分享 Skill、截图、发帖求助前,养成一个习惯:全文搜一遍 sk-、api_key、token 字样。Hermes 的 Skill 是 markdown,密钥混进去非常容易,检查成本却很低。

护栏三:把"硬边界"写进 SOUL.md

SOUL.md 是 Hermes 的行为宪法,但很多人只写人格,不写边界。边界要写得可验证:触发条件、例外、验收方式缺一不可,"注意安全"这种词等于没写。

可以直接抄的模板:

## 安全硬边界(不可违反)

1. 删除、覆盖、移动文件前,必须先列出完整路径清单并等待我确认,确认前不执行。
2. 发送邮件、消息、发布内容前,必须先展示完整草稿并等待我确认。
3. 涉及支付、下单、订阅的操作一律拒绝执行,只给操作指引。
4. 不执行 rm -rf、磁盘格式化、git push --force 这类不可逆命令;如任务需要,先停下问我。
5. 绝不在 SOUL.md、Skill、代码注释、聊天记录里写入或复述任何密钥。

写完一定要验证:开一个新会话(注意是新会话,旧会话用的是配置快照),故意下指令"把 /tmp/old-logs 删掉",看它是直接动手,还是先列清单等你确认。通不过就改措辞,直到行为稳定。这是"行为规则可验证"原则在安全场景的直接应用。

对比一下什么样的规则等于没写:

规则的颗粒度决定了它的执行力。凡是不能用"是/否"回答的规则("是否列了清单?""是否等了确认?"),都值得重写一遍。

护栏四:最小权限起步,按需加码

新接一个工具、MCP 服务或 Skill 时,默认只给最小能力:

  1. 先只配"读"能力,跑通一个只读任务;
  2. 确认确实需要写或执行能力,再逐项打开;
  3. 每打开一项,记录"为什么需要"(一句话就行,写在 AGENTS.md 或备忘里);
  4. 定期回顾 hermes tools 的输出,关掉连续 30 天没用过的工具。

这条对 MCP 尤其重要:一个 MCP 服务可能一次带来十几个工具,很多人图省事全开。建议逐个看一遍工具描述,只启用当前任务需要的,剩下的先关掉。权限这东西,开容易、收难,起点越小越好。关掉的工具随时可以再开,但一次误操作造成的损失,不一定能撤销。

常见误区:护栏不是枷锁

聊护栏时,社区里最常见的三个抵触理由,逐个拆一下:

"等出事了再说。" 出事的成本是不对称的:配护栏花半小时,出一次误删可能花一整天恢复——如果数据还能恢复的话。Anthropic 的选择是"先断网再想办法",个人用户至少可以做到"先设边界再放手"。

"护栏会降低效率。" 恰恰相反。没有护栏的 agent,你每句话都要提心吊胆地检查它干了什么;有护栏之后,日常任务反而敢放心地批量交给它。护栏省掉的不是操作步骤,是你的注意力税。

"我只防黑客,不防自己人。" 真实世界里 agent 事故的大头恰恰是误操作,不是外部攻击。删错目录、发错邮件、配错 cron——这些"自己人"事故,靠的就是上面四层护栏,而不是防火墙。

真出事了:止损三步

护栏再全,也要为"万一"准备预案:

  1. 停:立刻结束当前会话,暂停相关的 cron 任务,防止连锁操作;
  2. 查:看日志定位 agent 到底执行了什么、用的哪个 Profile、哪条配置;
  3. 滚:按"一次只改一个变量"的原则回滚配置,改完开新会话验证。

以及一条铁律:出事后先止损再复盘,不要在还没停掉失控任务的情况下急着找原因。

一句话清单

Agent 的能力越大,护栏的价值越大。Anthropic 在实验室里都选择了先断网,我们在自己电脑上花的这半小时配置,可能是今年性价比最高的一笔安全投入。如果你已经按清单做完,欢迎在社区问答区晒出你的 SOUL.md 护栏片段——好的边界值得被抄作业。

#Hermes#Agent 安全#权限控制#SOUL.md#Profile 隔离#最佳实践