English SAFA iconSAFA

为什么你的 AI Agent 永远不该拿到 SSH 密钥

AI Agent 开始做运维了——跑诊断、重启服务、查数据库。最常见的直觉是把密钥或密码交给 Agent。这个直觉恰恰是错的方向。下面这个访问模式,既让 Agent 有用,也让凭据够不着。

SAFA — 面向智能体的安全访问层2026-08-19github.com/juju-w/safa看真实排查

问题:Agent 开始做运维了,访问模型却不对

2025-2026 年,编程 Agent 和运维 Agent 不再是新鲜事。Claude Code、Codex 和同类工具经常 SSH 上服务器、跑 kubectl、tail 日志、查数据库。让 Agent 碰基础设施的标准 onboarding 方式是:把主机地址贴给它、把用户名贴给它、让它指向你的私钥、让它用你的 ssh config。

这相当于因为承包商说要看看恒温器,就把大楼的总钥匙交给他。请求本身合理,凭据却严重超配——而且数字钥匙不像物理钥匙:它可复制、可复用、可被引用

非人类身份(NHI)安全是增长最快的安全细分之一:Agent 持有的每一个凭据,都是攻击者能通过一次提示注入窃取、复用或外泄的凭据。

业界研究也指向同一结论。Anthropic 发布了关于自己 Agent 如何被沙箱化、凭据如何被挡在模型之外的系统性 containment 工作;NCC Group 对主流编程 Agent 的安全审计逐一标出了凭据处理缺口;浏览器 Agent 的研究展示了它们如何频繁弄丢 Cookie 与会话令牌。贯穿始终的一条线是一致的:可复用秘密一旦进入模型视野,就是负债,不是能力。

为什么"把钥匙交给 Agent"必然失败

失败模式不是假设,而且会叠加:

模式:把 Agent 与秘密分离

SAFA(Secure Access for Agents)是一个开源实现,只围绕一个想法:Agent 从不持有可复用凭据;它持有安全别名和意图,本机原生边界完成其余一切。

架构把权力分散到多个进程,任何一个面向 Agent 的组件都无法同时解释请求并解析秘密:

组件职责凭据权
safa CLI解析 Agent 命令,编码一份规范 TOON 结果
safa-broker解析受保护记录、执行策略、授权、连接、脱敏Keychain / 保险箱持有者
safa-askpass投递一次子进程绑定的短时 SSH 秘密仅一次性
safa-trusted-setup本地认证后收集隐藏的受保护字段无持久存储

具体地,Agent 只与安全别名打交道(如 nas.primary),永远不是 IP 或用户名。每一个远程动作都要过白名单:精确、经过评审的只读命令参数(dfuptimefreepssystemctl is-activedocker ps/stats)。其余一律以稳定的结构化错误拒绝——没有灰色地带,格式字符串差一个字符同样被拒。

面向 Agent 的 CLI 说TOON(schema dev.safa.cli/v2):为 Agent 设计的规范结构化文本(AXI 原则)。每次成功、空状态、拒绝与错误,都是 stdout 上的一份机器可读文档;stderr 只留给脱敏诊断。远程 stdout/stderr 是不可信数据,永远不是指令。

授权是规则,不是例外

SAFA 不只是拦截——它把关。高特权动作要求用户在 Mac 前。这是预览版已经在做的事,不是路线图承诺:

不变式:sudo 密码、SSH 密钥、保险箱密钥——它们永远不出现在 Agent 的 argv、环境、stdin、stdout、stderr、聊天记录或审计记录里。永远。凭据只存在于 Broker 边界内,存续时间为一次有界操作。

真实证据,不是营销演示

真实演示是一次对真实注册资源的真实录制会话,逐步回放并附带真实 TOON 输出。那次会话中,Agent:

回放里的每个数字都是原样。Agent 从未看到 IP、用户名或密钥。

它站在哪里

SAFA 占的是一个具体、仍然稀少的生态位:本地优先、开源、Agent 原生的基础设施访问。企业零信任平台(Teleport 的 agentic identity、P0 的授权控制面、BastionZero、Apono)用服务器、租户和部署团队解决类似问题。云厂商在推 Agent 身份原语(Entra Agent ID、AWS AgentCore)。SAFA 是个人规模的、可审查的实现:Skill 教任何有能力的 Agent 这套工作流,原生 Runtime 是你自己 Mac 上的真实安全边界,契约、一致性夹具与威胁模型全部公开。

它也是一个诚实的预览版:目前仅 macOS、今天只有非 sudo 只读执行、带作用域批准的 sudo 已规格化待交付、数据库/对象存储/缓存适配器已登记但尚未可操作。真正要紧的保证——没有凭据返回路径、失败关闭的校验、不可信的远程输出、明确的操作范围——从第一次提交就设计在内,不是后来补的。

开始使用

在 macOS 上:npx skills add juju-w/safa --skill safa,登记一次资源,然后直接提问。见产品架构解释真实排查

看真实排查 在 GitHub 查看

FAQ

应该把 SSH 密钥交给我的 AI Agent 吗?

不应该。可复用凭据会进入聊天记录和模型上下文,授予一个不可审计的宽泛会话,还能被提示注入窃取。把秘密留在原生边界内,给 Agent 别名和有界、经批准的动作。

SAFA 如何让凭据远离 Agent?

进程分离:CLI 没有凭据权,Broker 拥有策略/凭据/传输,窄权限助手负责凭据投递与可信配置。Agent 只拿到安全别名和有界 TOON 证据。

SAFA Agent 能做什么?

白名单只读诊断自动执行。提权与受保护操作由 macOS 用户在场批准(Touch ID)把关。预览版拒绝 sudo;带作用域、经批准的 sudo 是已规格化的下一能力。

SAFA 是开源的吗?

是——MIT 协议。Skill/契约在 github.com/juju-w/safa,原生 Swift/macOS Runtime 在 github.com/juju-w/safa-runtime。当前是 macOS 源码预览。