在个人或工作机器上运行 Hermes
你即将在自己日常使用的机器上运行一个智能体——个人笔记本或雇主管理的工作站。安全姿态该是什么?
简短回答:默认值已做了大部分工作。Hermes 以安全为默认交付,采用纵深防御模型,覆盖命令审批、文件写入安全和凭据处理。本页走查开箱即用的保护、在共享或工作机器上要收紧哪些开关,以及出错后如何回退。这里的每项控制都在安全指南中有深入论述。
默认已保护什么 {#what-the-defaults-already-protect}
全新安装、零配置——这些保护已生效:
危险命令需要审批。 执行任何命令前,Hermes 对照一份精心整理的危险模式清单检查它——递归删除、写入 /etc/、磁盘操作、管道到 shell 等。默认 approvals.mode: smart 用一个辅助 LLM 评估风险:低风险命令仅对该次自动批准,真正危险的命令自动拒绝,不确定的情况升级为人工提示。
审批提示失败即关闭。 若你在超时内(默认 300 秒)未响应审批提示,命令被拒绝。离开座位绝不会静默批准任何东西。
一条强硬黑名单是常开的底线。 某些命令——rm -rf /、fork 炸弹、清零物理磁盘——无论审批模式、--yolo 还是显式"始终允许"都被拒绝。黑名单在审批层看到命令之前就触发,且没有覆盖开关。
对敏感路径的文件写入被阻断。 write_file 和 patch 工具不能触碰 OS 凭据库(~/.ssh/、~/.aws/、~/.kube/、/etc/sudoers、~/.netrc)、Hermes 凭据库(auth.json、.env、配对数据),或磁盘上任何位置的项目机密文件(.env、.env.local、.envrc)。被阻断的写入立即返回错误——没有审批提示,也无法从聊天 UI 覆盖。
输出中的机密被脱敏。 security.redact_secrets 默认开启:工具输出中形似 API key、令牌和密码的模式在进入会话上下文和日志前被脱敏。
你的数据只去你指定的地方。 API 调用只发往你配置的 LLM 提供商。Hermes Agent 不收集遥测、使用数据或分析。你的对话、记忆和技能本地存储在 ~/.hermes/。见 FAQ。
水面之下还有更多——所有支持 URL 的工具都有 SSRF 防护、MCP 子进程的过滤环境、上下文文件的提示词注入扫描。安全页记录了每一层。
为共享或工作机器收紧 {#tightening-for-a-shared-or-work-machine}
在一台有雇主数据、生产凭据或他人文件的机器上,把这些叠加在默认之上。
把审批切为手动 {#switch-approvals-to-manual}
smart 模式自动批准低风险命令。若你想亲自看到每条被标记的命令:
approvals:
mode: manual
手动模式在执行被标记命令前总是提示你。
添加你自己的拒绝规则 {#add-your-own-deny-rules}
approvals.deny 是一个 glob 模式清单,无条件阻断匹配的终端命令——即使在 --yolo、/yolo 或 mode: off 下也一样。它是内建强硬黑名单的用户可编辑对应物。用它声明这台机器上绝不能运行的东西:
approvals:
deny:
- "git push --force*"
- "*curl*|*sh*"
- "dd if=* of=/dev/*"
模式为大小写不敏感的 fnmatch glob,对整条命令文本匹配,且匹配会在危险模式检测器所用的同一组归一化/去混淆变体上运行,因此简单的引号花招绕不过规则。模式务必加引号——裸的前导 * 是 YAML 解析错误。变更立即生效,无需重启。详情:用户自定义拒绝规则。
沙箱化文件写入 {#sandbox-file-writes}
HERMES_WRITE_SAFE_ROOT 把 write_file 和 patch 限制在你列出的目录前缀内——任何超出的内容被硬阻断。Unix 上多个根用 : 分隔:
export HERMES_WRITE_SAFE_ROOT=/path/to/project:/home/you/.hermes
安全根内的敏感路径仍被阻断——把它指向 $HOME 并不允许写 ~/.ssh/id_rsa。
:::caution
不要随意把它加进 ~/.hermes/.env。若你只把它设为项目目录,智能体就不能写 ~/.hermes/cron/jobs.json、profile 技能或该前缀之外的其他 Hermes 状态。像上面那样把你的 Hermes home 作为第二个根包含进来。
:::
把命令执行移出主机 {#move-command-execution-off-the-host}
最强的隔离是根本不在你的机器上运行命令。终端工具支持多种后端:
| 后端 | 隔离 |
|---|---|
local | 无——在主机上运行(危险命令检查适用) |
docker | 容器——容器本身即安全边界 |
ssh | 远程机器——把执行留在另一台服务器 |
terminal:
backend: docker
docker_image: "nousresearch/hermes-sandbox:desktop"
docker_forward_env: [] # 仅显式白名单;留空则把机密挡在容器外
每个 Docker 容器都以加固设置运行——丢弃所有 Linux capability(仅最小加回集)、no-new-privileges、进程数限制和限大小的 tmpfs 挂载。用容器后端时,容器内的破坏性命令伤不到主机,这正是那里跳过危险命令检查的原因。
ssh 则在 config.yaml 设 terminal.backend: ssh,并在 ~/.hermes/.env 用 TERMINAL_SSH_HOST、TERMINAL_SSH_USER、TERMINAL_SSH_KEY 提供主机信息。见网络隔离。
若开了消息:白名单与配对 {#if-messaging-is-on-allowlists-and-pairing}
在这台机器上跑网关?默认已是拒绝:若未配置白名单且未设 GATEWAY_ALLOW_ALL_USERS,所有用户被拒绝。保持显式:
# ~/.hermes/.env
TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789
或用 DM 配对代替硬编码 ID:未知用户收到一次性配对码,你在 CLI 用 hermes pairing approve <platform> <code> 批准。在你在意的机器上绝不要设 GATEWAY_ALLOW_ALL_USERS=true。
回退层:检查点与 /rollback {#the-undo-layer-checkpoints-and-rollback}
审批闸门阻止损害;检查点逆转损害。启用后,Hermes 在破坏性操作前自动给你的项目打快照——write_file、patch,以及 rm、mv、sed -i、git reset 等破坏性终端命令——存入 ~/.hermes/checkpoints/store/ 下的影子 git 库。你真实的项目 .git 绝不被触碰。
检查点是可选加入。按会话启用:
hermes chat --checkpoints
或全局:
checkpoints:
enabled: true
然后在会话中:
| 命令 | 说明 |
|---|---|
/rollback | 列出所有检查点及变更统计 |
/rollback diff <N> | 预览自检查点 N 以来改了什么 |
/rollback <N> | 恢复到检查点 N(同时撤销上一个聊天轮次) |
/rollback <N> <file> | 从检查点 N 恢复单个文件 |
恢复前用 /rollback diff <N> 预览,并把检查点与 git worktree 组合获得最大安全——每个 Hermes 会话在自己的 worktree 里,检查点作为额外一层。
这个威胁模型是什么——以及不是什么 {#what-this-threat-model-is--and-isnt}
对这些控制防的是什么要清醒。正如安全指南所言:
拒绝规则是防范"诚实但出错"智能体的护栏,与危险模式检测器是同一威胁模型。它们不是防范蓄意对抗进程的沙箱——那要用隔离后端(Docker、Modal)或受限出口环境。
文件写入守卫同理:它们只适用于 write_file 和 patch,而 terminal 工具以同一 OS 用户运行。拒绝清单减少意外损害并给模型一个明确的停止信号;它不把一个敌对或已失陷的智能体沙箱化。若你的需求是收容而非护栏,答案是隔离终端后端——那才是为此设计的边界。
一份谨慎的起始配置 {#a-cautious-starting-config}
上面所有内容组装起来。在 ~/.hermes/config.yaml 中按口味调整:
approvals:
mode: manual # 亲自看到每条被标记的命令
timeout: 300 # 未应答的提示被拒绝(失败即关闭)
deny: # 绝不运行清单——连 /yolo 也扛得住
- "git push --force*"
- "*curl*|*sh*"
- "dd if=* of=/dev/*"
security:
redact_secrets: true # 已是默认;此处写明以清晰
checkpoints:
enabled: true # 破坏性操作前打快照
terminal:
backend: docker # 或 ssh——把执行移出主机
docker_forward_env: [] # 容器内不放主机机密
在 ~/.hermes/.env 中,若你想要写入沙箱:
HERMES_WRITE_SAFE_ROOT=/path/to/project:/home/you/.hermes