别把家门钥匙交出去:八层安全防护与企业级加固
前面三节我们把 Agent 接进群、组了队、连了 GitHub 和数据库。能力越强,风险越大——一个能 rm -rf、能调生产库、能发微信的 Agent,要是授权和隔离没做对,就不是”数字员工”而是”数字炸弹”。
先纠正一个流传甚广的错误:Hermes 不是”六层防御”,官方文档明确是八层(eight layers)。而且 Bitwarden 凭据管理和 iron-proxy 出口防火墙是独立子系统,不在 security 主页面,容易被漏掉。本节一次讲全。
一、八层防御(记牢这个顺序)
▲ Hermes 运行时健康面板:状态、日志与升级回滚入口
┌─────────────────────────────────────────────┐
│ 1. User authorization 用户授权(白名单/配对)│
│ 2. Dangerous command approval 危险命令审批 │
│ 3. File write safety 文件写入安全 │
│ 4. Container isolation 容器隔离 │
│ 5. MCP credential filtering MCP 凭据过滤 │
│ 6. Context file scanning 上下文文件扫描(注入检测)│
│ 7. Cross-session isolation 跨会话隔离 │
│ 8. Input sanitization 输入净化(工作目录白名单)│
└─────────────────────────────────────────────┘每一层都补前一层的漏。下面挑最该动手的几层说。
二、命令审批:别让 Agent 删库跑路
approvals:
mode: smart # smart | manual | off
timeout: 300
cron_mode: deny # deny | approve
single_query_mode: deny
mcp_reload_confirm: true
destructive_slash_confirm: true
deny: # 用户拒绝规则(fnmatch glob,先于 yolo 生效)
- "git push --force*"
- "*curl*|*sh*"smart(默认):辅助 LLM 评估风险,该拦的拦。manual:危险命令总提示你确认。off/--yolo:禁用审批,只在绝对可信的隔离环境用。
硬线阻止列表(永远阻止,yolo 也救不了):
rm -rf /及变体- fork bomb(
:(){ :|:& };:) dd if=/dev/zero of=/dev/sd*- 把未信任 URL 管道给
sh
也就是说,即使你开了 YOLO,这几条红线也踩不动。审批历史可挖:hermes approvals suggest --apply 1,3。
⚠️ 别迷信 YOLO。它只是跳过”确认弹窗”,硬线列表照拦,但很多中等风险操作(比如改生产配置)YOLO 下不会拦——这类要靠
deny规则补。
三、用户授权检查顺序
谁能让 Agent 干活,按这个顺序判定:
平台 allow-all
→ DM pairing(配对)
→ 平台 allowlist(如 FEISHU_ALLOWED_USERS)
→ 全局 GATEWAY_ALLOWED_USERS
→ 全局 allow-all
→ 默认拒绝给个 env 示例:
TELEGRAM_ALLOWED_USERS=123456789,987654321
DISCORD_ALLOWED_USERS=111222333444555666
GATEWAY_ALLOWED_USERS=123456789
# GATEWAY_ALLOW_ALL_USERS=true # 极端谨慎,切勿与有终端权限的 bot 同开DM 配对命令:hermes pairing approve telegram ABC12DEF(revoke / list / clear-pending)。
⚠️
GATEWAY_ALLOW_ALL_USERS=true是核武器,一旦和带终端权限的 bot 同开,等于把 shell 向全网开放。永远别这么干。
四、容器隔离:把 Agent 关进沙箱
容器类后端(docker/singularity/modal/daytona/vercel_sandbox)会跳过危险命令审批——因为容器本身就是安全边界。要这么配:
# Docker 安全标志(tools/environments/docker.py)
--cap-drop ALL --cap-add DAC_OVERRIDE,CHOWN,FOWNER
--security-opt no-new-privileges --pids-limit 256
--tmpfs /tmp:rw,nosuid,size=512m --tmpfs /var/tmp:rw,noexec,nosuid,size=256mterminal:
backend: docker
docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
container_cpu: 1
container_memory: 5120 # MB
container_disk: 51200 # MB
container_persistent: true⚠️ 容器后端跳过审批 ≠ 可以放松镜像管理。务必锁定镜像版本,别用 latest 漂着,否则沙箱边界可能被人利用。
五、Bitwarden 凭据管理(hermes secrets)
API key 别散落在 .env 明文里。用 Bitwarden 集中管:
secrets:
sources: [bitwarden]
bitwarden:
enabled: true
project_id: "..."
preserve_existing: [FEISHU_APP_SECRET, TELEGRAM_BOT_TOKEN] # 即使 override 也保留- bootstrap token(
BWS_ACCESS_TOKEN)存本地.env,真实密钥留 Bitwarden。 bwsCLI 懒安装;注入的凭据会标(from Bitwarden)。- 还支持 1Password(
op://)、任意 command helper(keepassxc-cli/pass/ 自定义脚本输出KEY=VALUE)。
六、iron-proxy 出口防火墙(hermes egress)
远程终端沙箱里,Agent 要调外部 API,但不能把真实 key 带进去。iron-proxy 是单二进制 TLS 拦截代理(ironsh/iron-proxy),由 hermes egress 管理:
hermes egress install [--force]
hermes egress setup [--tunnel-port N] [--from-bitwarden|--no-bitwarden] [--rotate-tokens]
hermes egress start|stop|restart|reload|status|disable|config核心保证:沙箱只持不透明代理令牌,真实 API key 永不离开主机。这点和 Bitwarden 思路一致——密钥集中、边缘只给令牌。
七、个人 vs 生产加固建议
| 场景 | 做法 |
|---|---|
| 个人/开发 | local 后端 + approvals.mode: smart,避免 off/--yolo |
| 生产 | 显式 allowlist(禁 GATEWAY_ALLOW_ALL_USERS);容器后端 + CPU/内存/磁盘限制 |
| 生产 | .env 设 chmod 600;启用 DM 配对;非 root 运行;监控 ~/.hermes/logs/;定期 hermes update |
八、避坑提示
⚠️ “六层”是过时说法,记住是八层。 写方案、跟团队对齐时用官方口径,别被旧文章带偏。
⚠️ Bitwarden / iron-proxy 不在 security 主页。 很多人配完八层就以为齐了,结果密钥还明文躺 .env。这两块单独用 hermes secrets / hermes egress 管。
⚠️ 容器后端跳过审批,必须有镜像锁 + 资源限制兜底。 否则沙箱成了无监管的执行环境。
⚠️ DM 配对比 allow-all 安全得多。 公网暴露的网关优先用 pairing approve 逐人授权,而非放开白名单。
本节能造出什么数字员工
- 生产级客服 Bot:显式 allowlist + 容器沙箱 + 资源限额,敢放心接外部流量。
- 带密钥隔离的研究 Agent:Bitwarden 管 key、iron-proxy 做出口,沙箱里跑也不怕 key 泄露。
- 多租户网关:靠授权检查顺序 + 频道级配置,安全服务多个团队。
下篇预告
(本系列第 09–12 节到此收尾。回顾:网关接入→多 Agent 编排→MCP 工具生态→八层安全。后续可从”部署运维与成本优化""OpenClaw 迁移""语音模式实战”等方向继续深挖,关注公众号不迷路。)
延伸阅读
- 官方文档(安全 / secrets / egress):https://hermes-agent.nousresearch.com/docs
- 中文社区:https://hermesagent.org.cn/docs
- 八层防御各层细节与最新字段以官方文档为准