把 agent 的 key 配好、跑通第一个任务的时候,我是有点得意的。
它自己读文件、自己改、自己跑测试,一气呵成。我端着杯子在旁边看,像个刚把徒弟带出师的老师傅,只差没拍拍它肩膀说一句“以后这片就交给你了”。
得意了大概四十分钟。
第四十一分钟我反应过来一件事。
这把 key 知道我是谁。它不知道我今天要它干嘛。
搁人身上,这两件事勉强能凑合——你老板也不清楚你今天具体在忙什么,工资照样发。搁 agent 身上,这就不是凑合,这是事故的胚胎。
一张 key 上挂的东西通常只有两样:这是谁,这个谁最多能碰到什么范围。
任务内容不在上面。派活的人不在上面。这活是从一条正经告警里长出来的,还是从某条日志里夹带的私货里长出来的,更不在上面。
于是同一把钥匙,“帮我查一下支付服务这一小时的日志”和“帮我把支付服务的日志顺手处理掉”,权限范围一模一样。
它不区分。
它凭什么区分。我们从来没给过它区分的依据,转头又嫌它不分。
钥匙只认锁,不认动机。
十月十四号 dev.to 上那篇《An Agent's Plan Isn't Permission》,我看到标题第一秒就有点想笑。“plan 不是 permission”,翻成人话就是:它打算干什么是它的事,它能不能干是另一套系统的事——这两件事我们一直以来当一件事办。
文章里那个客服 agent 的例子我特别喜欢:工具在技术上能够摸到 HR 记录,但一个面向客户的任务,凭什么因此获得这类数据?
凭什么。问得好。好到我意识到我们平时的答案其实是“凭它应该不会吧”。
门是开着的,门不管你想不想进。
这句我本来想当吐槽写,写完发现它不构成吐槽,它就是现状描述。我们给新同事开工牌,从来是一张能刷全楼所有门的卡,然后口头交代一句“你应该只进会议室哦”。交代完大家都很安心,安心得毫无道理。
文章里那套基于意图的授权,说白了就是把“这次任务要干什么、谁派的、他本人有没有这个权限、这个 agent 被允许扮演什么角色、公司策略怎么说”这几件事,在放行之前凑齐了再决定。
听着像机场安检,其实是把安检从登机口挪到了值机柜台——晚是晚了点,但至少人还在你面前。
支付服务告警那段写得挺好看:编排器提调查请求,授权服务看一眼已认证的触发源、看一眼 agent 的角色、看一眼连 agent 自己都改不了的那份策略,然后批给它读前一小时日志的权限。
注意这个粒度——前一小时。不是这个服务,不是这个库,是前一小时。
我看到这种粒度总是又敬佩又一凉,因为我知道我们线上那套东西给的是“这个服务”,还带个星号。星号的意思是:细节别问。
调查中途冒出指向认证服务的新线索那一段更妙:agent 可以自己申请额外权限,策略可以自动放行也可以转人工,但在授权到账之前,runtime 会在门口把它拦住。
runtime 拦截这一下才是真活儿。
策略写得再漂亮,没有东西在门口站着,那也只是一份事后可以用来说明“我们想过”的文档。
这话有点狠,我不打算改。但承认一下:我自己写过的策略文档里,至少有一半属于这种纪念品。
委派那条我读了两遍——权限只能收窄,不能扩大;接活的 agent 用自己可验证的身份,只拿完成子任务需要的那部分,且受限于它自己的权限集合。
之所以读两遍,是因为现实里正好是反的。
“你先拿我的 token 顶着”——这句话我在不止一个项目里听过,说的人语气还很热情,热情到你不好意思提醒他这不太对。人类交接工作的默认动作,是把权限往下灌,像倒水,能倒多少倒多少,反正都是自己人。
所以“委派只能收窄”这条,在我看来不像现状描述,倒像许愿。许愿也得有个方向,这条方向是对的。
权限在人类手里是遗产,在 agent 手里才第一次变成预算。遗产是可以继承的,预算花完就没了——两样东西挂在同一个 token 上,气质完全不一样。
至于“软件工厂”那套——agent 不光执行任务,还自己提任务,编排器盯着事件和扫描结果,没工单也能认领缺陷、派 agent 去查、去提修复方案——我第一反应是:这不就是公司里那位最爱提需求的同事,现在不但提需求,还能自己给自己批预算。
文章说得很克制:识别任务的能力,不等于有权分配这个任务所需的访问。翻译过来是,你能看见这个坑,不代表你有权跳进去。
打住,再说下去要变成架构讨论了,那不是我想讲的。
我想讲的是最后那条:管控不能只挂在访问权限上。一个 agent 完全可以在权限范围内,把正事干得很糟——发起几千次无谓请求,或者提交一个能过评审、一上生产就失败的变更。
这才是真实的恐怖故事。
不越权的 agent 不可怕,太勤奋的 agent 才可怕。前者是敌人,你能拉黑;后者是自己人,你不大好意思拦。
所以得有预算卡住资源、有检查卡住变更、有审计记录放在它摸不到的地方、有一键撤销让运维半夜还能踩刹车。
越权需要恶意,失控只需要热情。前者罕见,后者是每日。热情这东西没有恶意,但它有惯性。
【关于本次事故的初步定性】
直接原因:一把不知道任务内容的 key。
根本原因:我们习惯把“谁会干什么”,寄托在“谁应该不会干什么”上。
(友情提示:以上案例不涉及任何真实工位纠纷。那把 key 现在还开着,等我哪天想明白了再去收——你猜我会不会忘 🫠)
