微信扫码
添加专属顾问
我要投稿
让智能体安全调用企业系统,这套鉴权方案解决了无浏览器交互、多用户隔离等核心痛点。核心内容:1. Agent 鉴权面临的核心挑战与安全痛点2. 基于 sso-cli 与 keychain 的无感登录与安全存储方案3. 多用户隔离、临时环境变量等关键设计实现与策略
在智能体(Agent)通过 Skill 调用企业内部业务系统时,最大的阻碍往往不是接口能力,而是"鉴权"。
本文介绍一套面向 Agent 场景的 CLI/SSO 鉴权方案,围绕 sso-cli、业务 CLI 以及一个私有的 sso-sdk 包,构建起一套 token 不落盘、不对外暴露、多用户隔离、登录过程无感的安全鉴权体系。
文章会从安全痛点出发,逐层拆解 keychain 主密钥、密文文件、飞书 Hook 登录、Agent 轮询授权、临时环境变量等关键设计,并讨论各环节面临的卡点与解决策略。
2026年3月底,飞书开源了飞书CLI,一个多月时间狂揽 1w+ star,将 Agent CLI 这个概念带到了面前。
跟传统 CLI 面向人类不同,Agent CLI 是专门给 AI 使用的命令行工具:它输出结构化数据,拥有明确统一的退出码和错误语义,让大模型能像调用函数一样可靠地把它当成工具。飞书 CLI 把文档、审批、日历等业务能力封装成一个个可组合的命令,第一次系统性地展示了企业系统如何以「Agent 友好」的方式开放。在这个背景之下,企业内部也开始思考,并尝试将业务系统能力封装,通过 Agent CLI 的方式提供给到一众 Agent 框架。
然而,当真正动手把这些业务 CLI 接入 Openclaw、Claude Code 等 Agent 框架时,一个绕不开的障碍立刻出现了:鉴权。在这些框架下,用户通过自然语言驱动 Skill 调用企业内部的业务 CLI,而这些 CLI 最终依赖公司统一的 SSO 单点登录来访问 HTTP API。
在以往的 Web 时代,SSO 鉴权流程天然依赖"人在浏览器前":业务系统跳转至 SSO 平台,用户手动完成认证授权,后续请求携带 Token 进行鉴权。但 Agent 无法完成这一交互式登录,导致大量业务能力无法对智能体开放。
Before(接入前):
Now(接入后):
Agent CLI接入后,SSO鉴权面临三层递进式挑战:
早期实践中常采用"预先人工登录":开发者手动完成 SSO 登录,将长期 Token 写入环境变量、配置文件甚至硬编码,供 Agent 直接读取。
想象一种情况:一个团队共享的智能体沙箱中,产品同事 A 刚完成登录,沙箱中存入了 A 的 Token。紧接着研发同事 B 在同一沙箱发起调用——如果没有用户隔离,B 的请求将沿用 A 的身份。审计日志显示为 A 的操作,而 B 可能越权访问了本无权限的数据。
这些痛点指向同一个结论:必须为 Agent 设计一套原生的、脱离浏览器依赖的、多人隔离且防泄露的 SSO 鉴权体系——既要解决"Agent 如何登录",也要回答"Token 放在哪里才安全"以及"如何确保每一次调用都对应到真实的用户"。
针对这些痛点,我们设计了一套纵深防御的鉴权体系,核心原则只有几条,但它们贯穿了整个实现:
下面我们分层阐述这套体系的具体架构。
整个鉴权体系由四个关键部分构成:
abtest-cli、trade-cli),它们是 Agent 实际调用的工具。这些 CLI 不直接处理 Token,而是依赖一个内部包来获取。整体架构图:
运行时,一次典型的调用流为:
sso-sdk 包获取当前用户的 SSO Token。sso-cli 启动登录流程,向 SSO 平台申请一次性 code,通过飞书卡片让用户授权,随后按间隔时间轮询 SSO 平台换取 Token。sso-cli 加密写入本地。这套流程里最精妙的部分在于 sso-cli 的存储和交互设计,我们逐步拆解。
sso-cli 的职责是:在极不安全假设(沙箱环境可能被任何人读取)下,安全地存储用户的 SSO Token,并支持多用户隔离。它的设计思想是"本地不留存可用明文,即使拿到密文和源码也难以解密"。
sso-cli 首次运行时需要生成一个高熵的主密钥(Master Key),该密钥可以由密钥框架生成,常见的方式可以存储到各个操作系统的原生密钥链中:
这样做的好处是,主密钥不落在任何普通文件中,其读取受操作系统用户权限保护。sso-cli 仅在需要加解密时从 keychain 取出主密钥,用完即从内存中擦除。
在 Agent 的沙箱环境中,我们假定攻击者虽然能读到文件系统,但通常无法直接访问运行中进程的系统密钥链(除非已经提权)。这就提供了第一道强有力的防护。
当用户通过 SSO 登录拿到 Token 后,sso-cli 不会直接存明文。它会将 user -> token 的映射结构序列化,加密后存入本地文件。
没有主密钥,即使拿到密文文件也无法解密;而主密钥被锁在 keychain 中。这样即使沙箱文件被全量窃取,攻击者也无法离线还原用户的 Token。
文件内通过 key 粒度隔离多用户,而非每个用户一个文件。这样做简化了并发控制,也减少了密文数量。
在与 Agent 对话时,每一轮对话对应一个"当前用户"。我们通过一组加密的临时环境变量来标识这个用户,而不是明文的用户名。
具体做法是:由 Agent 框架在启动子进程时,注入一组环境变量,对用户标识进行对称加密后得到 salt。只有持有相同派生密钥的组件(即 sso-sdk 包)才能解密还原出真实的用户标识。
这组环境变量仅在对话生命周期内有效,对话结束后立即销毁,并且:
/proc 的全局视图中(因为是进程私有的环境块)。当多个用户在同一个沙箱中并发操作时,加密文件的读写通过文件锁保护。
这种设计既解决了"多人共用同一凭证"的问题,又保证了并发安全性,且大大增加了攻击者通过环境变量窃取用户身份的难度。
在实现了基础功能后,初版的 sso-cli 登录流程非常生硬:
sso-cli 开始轮询。这不仅打断用户体验,而且依赖用户的主动告知,常因为忘记触发轮询而超时。
Before(旧版登录流程):
Now(Hook 模式):
我们利用飞书机器人能力做了一个 Hook 模式,让整个流程自动化、无感:
sso-cli 被 Agent 调用执行登录时,它会拦截自身的 JSON 输出,生成一张飞书卡片消息,通过飞书 Bot 发送给当前用户。卡片中包含 SSO 登录链接,并且设置为仅本人可见。sso-cli 在后台以 一定时间间隔 轮询 SSO 平台,用一次性 code 换取 Token。sso-cli 会立即:整个流程中,用户唯一需要做的就是点一下飞书卡片,剩下的轮询、存储、清理全部自动完成。这极大地提升了在 Agent 对话中的鉴权体验。
降级方案:如果飞书卡片信息能力不可用,
sso-cli会降级为发送普通文本消息,将登录链接直接展示给用户。此时消息可能持久化在聊天中,但 Token 本身并不在此出现,只是授权链接,风险可控。
传统 SSO 平台仅支持实时 Web 回调授权,无法适配 Agent 的异步场景。本次方案对 SSO 平台进行了关键迭代,引入了 Agent Poll 授权模式,使其成为一种通用的平台能力。
Agent Poll 授权模式流程:
升级后的授权流程如下:
sso-cli 向 SSO 平台请求生成一个一次性登录链接,平台同时返回一个与该链接绑定的短期 code。sso-cli 在一段时间内,间隔轮询 SSO 平台的 token 接口,使用相同的 code 换取 Token。code 标记为已用;同时 code 自身也有一段绝对过期时间。安全设计要点:
sso-cli 将拒绝并终止流程。这一迭代使得 SSO 平台不仅服务于传统的 Web 应用,也正式具备了支撑 Agent 时代各类自动化场景的能力,成为企业内部鉴权基础设施的重要升级。
业务 CLI 的开发者不需要关心主密钥、加密文件、多用户环境变量这些复杂细节。他们只需要在自己的代码中引入公司私有的 sso-sdk 包,然后调用对外暴露的方法即可。
业务 CLI 集成示意图:
sso-sdk 包托管在内部的 Go Module Proxy 上,仓库权限仅对授权业务模块开放。这样:
这是一种编译期访问控制,相比运行时控制更加绝对和前置。
我们会继续将 sso-cli 单独保持为登录与存储的守护工具,而 sso-sdk 包只封装读取和解密。分离的目的是:
内部执行的步骤是:
整个过程不经过任何网络或 IPC,安全且快速。
虽然 sso-sdk 已经通过私有仓库控制了使用权限,但仍然有被逆向分析的风险——拿到业务 CLI 二进制的人可能会提取出 Token 读取逻辑,进而想办法在特定环境下恢复明文。
我们的对抗思路是:将 Token 的获取和加解密逻辑编译为独立二进制对象,再通过某种方式在运行时加载。
.so/.dylib),由主业务 CLI 动态加载调用。plugin 包,甚至将逻辑以 CGO + 静态库的形式内嵌并剥离符号。这样做可以显著提升逆向成本,普通 strings 和静态分析基本失效。不过,我们也清醒地认识到这会带来调试、更新和排障的额外开销,因此这还在权衡阶段,目前主要以私有包 + 仓库权限保证安全边界。
我们通过一套"sso-cli 安全存储 + 飞书无感登录 + 内部私有包控制 + 多用户加密隔离 + SSO 平台 poll 模式"的组合方案,解决了智能体业务 Skill 调用企业内部 SSO 鉴权接口的难题。这套方案的核心收益是:
这套体系已在内部多个 Agent Skill 中落地运行,有效平衡了安全、易用性和开发效率。
未来展望:从"用户授权"走向"人-智能体-能力"三维管控
当前的鉴权体系核心是 "用户是谁"——Agent 只是用户意图的执行者,所有权限判断最终都落在"人"身上。这种模式在智能体能力尚浅、任务边界清晰时运转良好,但我们预判,随着 Agent 自主决策能力和可调用工具集的膨胀,这套以人为单一主体的授权模型将逐渐显露局限。
一个可预见的演进方向是:将"用户身份""智能体身份""功能权限"三者解耦,构建三维管控体系。
这意味着,未来的 SSO 平台可能需要从一个"身份认证与授权服务"逐步演进为 "智能体访问策略引擎"。它不仅要回答"这个 token 是谁的",还要回答"这个调用链路是谁发起、经由哪个智能体、意图是什么、当前风险等级如何",并基于此做出动态的、上下文感知的鉴权决策。
在这个新范式下,我们今天建立的这套安全信道、加密存储和无感登录机制并不会被废弃,反而会成为更上层建筑的可信底座。届时,token 将不再仅携带用户标识,而是同时编码智能体身份、任务范围和约束条件;而我们今天在环境变量加密、主密钥保护和一次性授权码上的实践,也恰好为那个更复杂但更安全的未来,打下了坚实的地基。
注:本文章包含 AI 生成图片内容。
产研团队:大数据技术与产品部、货运研发部、信息安全技术部、信息平台部
笔者介绍:黄燮聪|高级 Agent 工程师。负责大数据前端 A/B 实验平台、智能招聘体系等项目,目前专注于 AI & Agent 应用赋能。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-06-10
Loop Engineering 循环工程又是什么鬼?
2026-06-10
更懂你的ChatGPT来了!通过做梦整理记忆,事实准确率83%
2026-06-10
Anthropic万字长文:当AI开始构建自己,人类该何去何从?
2026-06-10
Claude Fable 5正式发布 - 王者归航。
2026-06-10
什么是循环工程 Loop Engineering?loop 比 prompt 难 10 倍
2026-06-10
cc创始人对谈,Claude Code一周年回顾 :内部经历两次认知跃迁,第三次正在路上
2026-06-10
Anthropic 深夜大更新,Claude 正式进入Fable 时代
2026-06-10
突发!Anthropic深夜发布Claude Fable 5/Mythos 5,屠榜所有基准测试
2026-04-15
2026-04-07
2026-03-13
2026-03-31
2026-04-07
2026-03-17
2026-03-17
2026-03-21
2026-04-24
2026-04-17
2026-06-10
2026-06-10
2026-06-07
2026-06-06
2026-06-03
2026-06-02
2026-06-01
2026-05-26