加载中...
加载中...
Agent要替用户操作Gmail、发GitHub PR、查数据库——但它凭什么代表你?破解Agent身份认证三大难题:OAuth2委托授权(让用户主动授权而不是给密码)、API Key安全注入(密钥和代码分离)、Confused Deputy攻击防范(阻止Agent被恶意利用)。
Agent要帮你做事(读邮件、发PR、查数据库),但它不能直接用你的密码——必须通过一套身份认证和授权体系来「代表你」安全地访问外部系统。核心三件事:① 怎么拿到权限(OAuth2委托授权,用户点头才算)② 怎么保管权限(API Key不进代码,走Secrets Manager)③ 怎么防止滥用(权限最小化 + 危险操作二次确认,不让Agent变成「拿了钥匙的疯子」)。
**1. OAuth2 委托授权(Authorization Code + PKCE)——「让用户主动点头」**
Agent作为OAuth2客户端,不能直接拿用户的用户名密码登录第三方服务(这是安全大忌)。正确做法是引导用户走OAuth2授权码流程:
**2. API Key 安全注入——「密钥和代码永不碰面」**
Agent运行时需要调用第三方API(OpenAI、GitHub、SerpAPI等),每个都需要API Key。这些Key如果写进system prompt、配置文件或代码里,就埋下了定时炸弹:
**3. Confused Deputy 攻击防范——「Agent不是你想用就能用」**
Confused Deputy问题是指:Agent本身拥有合法授权(比如有删GitHub仓库的权限),但被恶意用户诱导去滥用这个权限(用户说「帮我清理一下不需要的仓库」,Agent把全部仓库都删了)。三道防线:
**1. Token 存储不当导致泄露——「access token 存哪里?」**
最大的坑是把用户的OAuth2 access token存在客户端localStorage或明文日志里。正确做法:① access token只存在服务端内存/Redis中,永不过客户端 ② 客户端只持有一个opaque session cookie,通过它换取服务端的token ③ 日志输出时自动脱敏——任何匹配Bearer xxx或sk-xxx模式的字符串自动替换为[REDACTED]。实战出血教训:某Agent产品早期把用户GitHub Token输出到LangSmith trace里,几十个Token全部泄露,只能全部revoke。
**2. 「权限一把梭」——Scope太大,Agent变成超级用户**
开发者图省事,申请OAuth2 scope时直接要了`repo`(GitHub所有仓库读写权限)而不是`public_repo`(仅公开仓库写权限),结果Agent在测试时把用户的私有仓库内容误上传到公开仓库。教训:① 严格按照「最小权限原则」申请scope,一个不多要 ② 每个scope都要有书面理由——「为什么Agent需要这个权限?」③ 定期做权限审计,收回不再需要的scope。如果Agent只需要读某个org的公开issue,那就只申请`read:org`,不要顺手点一个`repo`。
**3. Confused Deputy 误伤——过度保守导致Agent什么都干不了**
为了防止Agent乱操作,开发者设了太多确认弹窗——每次工具调用都弹窗,用户被烦到直接全部点「允许」,确认机制形同虚设。正确做法:① 只对高危操作弹确认(写入、删除、发消息、付费API调用)② 确认弹窗要展示具体操作内容,不是一句笼统的「Agent要执行一个操作,允许吗?」——要展示「Agent将调用github.create_issue,参数:repo='org/backend', title='Fix login bug'」③ 支持「信任本次会话」模式——用户确认一次后,本次会话内同类操作自动放行,不要每次都弹
「分享到微信」:手机浏览器打开时一键调起系统分享面板,选择微信即可分享到朋友圈或聊天。电脑上回退为复制文案。
暂无留言,来说两句吧