去年春天,我在四个地方发现了同一把API密钥。一个定时任务里、一个Slack机器人里、一个代码审查代理里,还有同事早已忘记的一个笔记本里。这把密钥属于一个人类,它能读这个人能读的一切,也能写大部分内容。
当时还没出事。直到我问了一个简单的问题:上周二那次删除,是这四个里的哪一个干的?我答不上来。日志上写着:人类干的。
![]()
这就是本文要解决的问题。给每个AI代理一个独立身份、一个独立令牌、一份它能做的事的短清单。读完你会得到一个可运行的脚本:创建代理、拒绝错误调用、记录每一次决策、单独吊销一个代理而不影响其他代理。
共享人类密钥的三个坑
一把共享的人类密钥有三个问题,而且它们会叠加。
- 爆炸半径等于这个人的全部权限。一个只需要读拉取请求的代码审查代理,继承了所有内容的写权限。
- 你没法单独吊销一个代理。轮换密钥,四个进程同时挂掉。你只能等,而暴露的密钥还活着。
- 审计记录在撒谎。每一行都写着那个人的名字。合规问题和自己的调试,全都撞墙。
按代理分配身份能同时解决这三个问题。每个代理持有一个令牌,对应一行记录、一个所有者、一份权限清单。用户创建代理,代理在行动前调用授权接口,每一次决策都落进审计记录。
有一个区别要早点分清:代理不是用户。它没有邮箱、没有密码、没有会话、没有OAuth账号。它只有一个持有者令牌和一组权限。如果你发现自己正在给一个代理接密码重置流程,那你需要的是用户,不是代理。
一个代理一个岗位
我遵循的规则是:一个代理对应一个岗位,而不是对应一个人。夜间的拉取请求审查器和退款机器人不该共用身份,哪怕它们是同一个人搭建的。
创建代理时,令牌以 kv_ 开头,后面是32个随机字节的base64url编码,总共46个字符。系统只存SHA-256哈希值。整库导出也拿不到一个可用的令牌。
代价是:明文你只能在创建时看到一次。在进程退出前把它放进密钥管理器,否则就得轮换换一个新的。事后无法找回。
代理类型字段有三个取值。自主型代理自行运行,除非权限约束要求审批,否则没有审批环节,定时任务和无人值守的场景属于这一类。
配置里有两个设置值得留意。auditAll 记录每一次授权调用,默认开启。tokenExpiry 设定新代理的存活时长,默认24小时意味着你忘掉的代理明天就自动失效。我喜欢这个默认值——被遗忘的凭证应该过期,而不是一直挂着。
还有一个前提必须诚实面对:你系统里的代理,调用的是你控制的工具。授权库给你的是决策点,你的代码必须在行动前先问它。如果一个代理能拿着自己的凭证直接连上数据库,那世界上没有任何权限清单能拦住它。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.