AI Agent 开始做运维了——跑诊断、重启服务、查数据库。最常见的直觉是把密钥或密码交给 Agent。这个直觉恰恰是错的方向。下面这个访问模式,既让 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 与会话令牌。贯穿始终的一条线是一致的:可复用秘密一旦进入模型视野,就是负债,不是能力。
失败模式不是假设,而且会叠加:
SAFA(Secure Access for Agents)是一个开源实现,只围绕一个想法:Agent 从不持有可复用凭据;它持有安全别名和意图,本机原生边界完成其余一切。
架构把权力分散到多个进程,任何一个面向 Agent 的组件都无法同时解释请求并解析秘密:
| 组件 | 职责 | 凭据权 |
|---|---|---|
safa CLI | 解析 Agent 命令,编码一份规范 TOON 结果 | 无 |
safa-broker | 解析受保护记录、执行策略、授权、连接、脱敏 | Keychain / 保险箱持有者 |
safa-askpass | 投递一次子进程绑定的短时 SSH 秘密 | 仅一次性 |
safa-trusted-setup | 本地认证后收集隐藏的受保护字段 | 无持久存储 |
具体地,Agent 只与安全别名打交道(如 nas.primary),永远不是 IP 或用户名。每一个远程动作都要过白名单:精确、经过评审的只读命令参数(df、uptime、free、ps、systemctl is-active、docker ps/stats)。其余一律以稳定的结构化错误拒绝——没有灰色地带,格式字符串差一个字符同样被拒。
面向 Agent 的 CLI 说TOON(schema dev.safa.cli/v2):为 Agent 设计的规范结构化文本(AXI 原则)。每次成功、空状态、拒绝与错误,都是 stdout 上的一份机器可读文档;stderr 只留给脱敏诊断。远程 stdout/stderr 是不可信数据,永远不是指令。
SAFA 不只是拦截——它把关。高特权动作要求用户在 Mac 前。这是预览版已经在做的事,不是路线图承诺:
safa resource show ALIAS --details,含端点、端口、用户名、盘点信息)会触发 macOS 用户在场提示(Touch ID / 密码)。用户批准后才返回详情,且该值不会作为 Agent 进一步复用凭据的原料。approval_not_in_mvp 拒绝。已规格化的下一能力(002-sudo-execution)把拒绝换成有作用域的批准:用户在 Mac 上核对目标、命令、意图与风险,批准一次(或授予短时、可撤销的命令族),Broker 在自家边界内注入 sudo 凭据执行——随即隔离特权子进程的 stdin,密码永远不进 argv、环境、输出或审计记录。真实演示是一次对真实注册资源的真实录制会话,逐步回放并附带真实 TOON 输出。那次会话中,Agent:
df、uptime、free、ps),找到了真正的信号:swap 已用 95%(10 GiB 用了 9.5 GiB),而内存仍有富余——一次未回收的历史内存峰值,正是"NAS 变慢"报告的真实原因;inactive,因为它们是厂商栈/容器管理的),而不是编造结论;sudo、对白名单外命令、对未注册资源分别被拒——全部是稳定、可解析的错误。回放里的每个数字都是原样。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,登记一次资源,然后直接提问。见产品、架构解释与真实排查。
不应该。可复用凭据会进入聊天记录和模型上下文,授予一个不可审计的宽泛会话,还能被提示注入窃取。把秘密留在原生边界内,给 Agent 别名和有界、经批准的动作。
进程分离:CLI 没有凭据权,Broker 拥有策略/凭据/传输,窄权限助手负责凭据投递与可信配置。Agent 只拿到安全别名和有界 TOON 证据。
白名单只读诊断自动执行。提权与受保护操作由 macOS 用户在场批准(Touch ID)把关。预览版拒绝 sudo;带作用域、经批准的 sudo 是已规格化的下一能力。
是——MIT 协议。Skill/契约在 github.com/juju-w/safa,原生 Swift/macOS Runtime 在 github.com/juju-w/safa-runtime。当前是 macOS 源码预览。