给 Hermes Agent 装上"护栏":防误操作的权限与安全实践
上周 AI 圈最扎眼的新闻之一,是 Anthropic 直接切断了所有内部评测的实时联网——理由很直白:他们承认,目前还无法可靠地控制智能体。一个连自家实验室都觉得"管不住" agent 的行业里,我们这些把 Hermes 接上 shell、文件、浏览器,天天让它替我们跑任务的个人用户,更应该先把"护栏"装好,再谈效率。
这篇文章不讲大道理,只给一套可落地的四层护栏:Profile 隔离、密钥分离、SOUL.md 硬边界、最小权限起步,外加一套出事后的止损流程。全部基于 Hermes 现有能力和社区真实踩坑组合而成,不需要等官方出新功能。
先认清:Agent 的权限,就是你的权限
Hermes 的能力边界,约等于你给它的工具边界。它能读文件,就能读错文件;能跑 shell,就能跑错命令;配了发邮件的 Skill,它就有可能在你没点头的情况下把邮件发出去了。社区里真实出现过的"翻车"形态:
- 让 agent"清理一下无用的日志",它把带日期的备份目录一起删了;
- cron 半夜跑批处理,用了旧配置快照,把生产目录当成了测试目录写;
- SOUL.md 里顺手写了 API Key,之后分享 Skill 时把密钥一起发出去了。
这些都不是模型"变坏"了,而是边界没划清。护栏的作用,就是把"它能做什么"收敛到"你想让它做的"。
护栏一:Profile 隔离——实验和生产分家
Hermes 的 Profile 是天然的隔离单元:不同 Profile 意味着不同的运行根目录、记忆、Skill 和定时任务。之前配置教程里提过,"命名 Profile 应视为独立运行单元"。落到安全实践上,建议至少分两个:
daily(日常):只配读文件、联网搜索这类低风险工具;ops(运维):才给 shell 执行、文件写入、消息发送等高风险工具。
先看清现状:
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 删掉",看它是直接动手,还是先列清单等你确认。通不过就改措辞,直到行为稳定。这是"行为规则可验证"原则在安全场景的直接应用。
对比一下什么样的规则等于没写:
- ❌ "删除文件时请小心"——"小心"无法验证,agent 删之前觉得自己挺小心的;
- ✅ "删除前列出完整路径清单并等待我确认"——行为可观测,违没违反一目了然。
规则的颗粒度决定了它的执行力。凡是不能用"是/否"回答的规则("是否列了清单?""是否等了确认?"),都值得重写一遍。
护栏四:最小权限起步,按需加码
新接一个工具、MCP 服务或 Skill 时,默认只给最小能力:
- 先只配"读"能力,跑通一个只读任务;
- 确认确实需要写或执行能力,再逐项打开;
- 每打开一项,记录"为什么需要"(一句话就行,写在 AGENTS.md 或备忘里);
- 定期回顾
hermes tools的输出,关掉连续 30 天没用过的工具。
这条对 MCP 尤其重要:一个 MCP 服务可能一次带来十几个工具,很多人图省事全开。建议逐个看一遍工具描述,只启用当前任务需要的,剩下的先关掉。权限这东西,开容易、收难,起点越小越好。关掉的工具随时可以再开,但一次误操作造成的损失,不一定能撤销。
常见误区:护栏不是枷锁
聊护栏时,社区里最常见的三个抵触理由,逐个拆一下:
"等出事了再说。" 出事的成本是不对称的:配护栏花半小时,出一次误删可能花一整天恢复——如果数据还能恢复的话。Anthropic 的选择是"先断网再想办法",个人用户至少可以做到"先设边界再放手"。
"护栏会降低效率。" 恰恰相反。没有护栏的 agent,你每句话都要提心吊胆地检查它干了什么;有护栏之后,日常任务反而敢放心地批量交给它。护栏省掉的不是操作步骤,是你的注意力税。
"我只防黑客,不防自己人。" 真实世界里 agent 事故的大头恰恰是误操作,不是外部攻击。删错目录、发错邮件、配错 cron——这些"自己人"事故,靠的就是上面四层护栏,而不是防火墙。
真出事了:止损三步
护栏再全,也要为"万一"准备预案:
- 停:立刻结束当前会话,暂停相关的 cron 任务,防止连锁操作;
- 查:看日志定位 agent 到底执行了什么、用的哪个 Profile、哪条配置;
- 滚:按"一次只改一个变量"的原则回滚配置,改完开新会话验证。
以及一条铁律:出事后先止损再复盘,不要在还没停掉失控任务的情况下急着找原因。
一句话清单
- [ ] 日常 / 运维 Profile 分开,cron 用独立小权限 Profile
- [ ] 密钥只在环境变量,不进 SOUL.md、Skill、git、截图
- [ ] SOUL.md 有可验证的硬边界,并用新会话实测过
- [ ] 新工具默认最小权限,按需逐项打开并记录原因
- [ ] 出事预案:停会话、停 cron、查日志、回滚配置
Agent 的能力越大,护栏的价值越大。Anthropic 在实验室里都选择了先断网,我们在自己电脑上花的这半小时配置,可能是今年性价比最高的一笔安全投入。如果你已经按清单做完,欢迎在社区问答区晒出你的 SOUL.md 护栏片段——好的边界值得被抄作业。