在个人或工作机器上运行 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。

INFO

水面之下还有更多——所有支持 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 恢复单个文件
TIP

恢复前用 /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

另见 {#see-also}

  • 安全——完整的纵深防御参考:每种审批模式、容器加固标志、网关授权、MCP 凭据过滤
  • 检查点与回滚——配置、存储维护和恢复工作流
  • 工具与工具集——所有终端后端及其配置
  • 配置——完整的 config.yaml 参考