2. 智能体基础
身份认证与访问控制,说白了就是解决两个问题:「你是谁?」 和 「你能干什么?」。
在智能体系统里,这两个问题比传统Web应用要棘手得多。智能体不是人,它是一段代码,但它能调用API、操作数据库、甚至执行系统命令。如果认证和授权没做好,攻击者只要拿到一个API Key,就能让智能体变成他的提线木偶。
我个人习惯把这一章的内容分成四个模块来落地:API密钥管理、OAuth 2.0集成、RBAC权限模型、最小权限原则。它们不是孤立的,而是一套组合拳。
2.1 API密钥管理:智能体的「身份证」
API密钥是智能体与后端服务通信时最常用的凭证。它就像一把钥匙,但很多团队把这把钥匙直接写死在代码里——嗯,这是我最常见到的安全漏洞之一。
2.1.1 密钥的生命周期管理
我在项目中遇到过,某团队把API Key硬编码在GitHub仓库里,结果被爬虫扫到,一夜之间云账单多了十几万。从那以后,我强制团队遵循以下生命周期规则:
| 阶段 | 操作 | 避坑指南 |
|---|---|---|
| 生成 | 使用足够长的随机字符串(至少32字节),避免可预测模式 | 不要用UUID作为API Key,它只是唯一,不是随机 |
| 存储 | 使用密钥管理服务(如Vault、AWS Secrets Manager) | 绝对不要存到代码仓库、日志文件或环境变量明文里 |
| 使用 | 通过HTTP Header传递,如 Authorization: Bearer <key> |
不要在URL参数里传Key,日志会泄露 |
| 轮换 | 设置有效期(如90天),到期自动轮换 | 我曾经见过一个Key用了三年没换过…… |
| 吊销 | 提供即时吊销接口,一旦泄露立即失效 | 吊销后要清理所有关联的会话和缓存 |
2.1.2 密钥的权限范围
每个API Key都应该绑定一个权限范围(Scope)。你想想看,一个只读报表的智能体,为什么要给它写入数据库的权限?
我曾经在审计一个项目时发现,所有智能体共享同一个「超级管理员」API Key。问原因,回答是「方便」。嗯,方便了攻击者,也方便了安全事故。
// 好的做法:每个Key绑定最小权限
{
"key_id": "sk_live_abc123",
"permissions": ["read:orders", "write:orders"],
"rate_limit": 100,
"expires_at": "2025-06-30T23:59:59Z"
}
// 坏的做法:一个Key走天下
{
"key_id": "sk_live_superadmin",
"permissions": ["*:*"],
"rate_limit": 10000,
"expires_at": null
}
2.2 OAuth 2.0集成:让智能体安全地「代你行事」
OAuth 2.0不是一种认证协议,而是一种授权协议。它解决的核心问题是:智能体如何在不获取用户密码的情况下,代表用户访问资源。
我个人最常用的流程是授权码流程(Authorization Code Flow),配合PKCE(Proof Key for Code Exchange)来防止授权码拦截攻击。
2.2.1 授权码流程(适合服务端智能体)
- 智能体引导用户前往授权服务器,用户登录并同意授权
- 授权服务器返回一个临时的授权码(Authorization Code)
- 智能体用授权码 + 客户端凭证,向授权服务器换取访问令牌(Access Token)
- 智能体使用Access Token访问资源服务器
2.2.2 客户端凭证流程(适合后台智能体)
当智能体代表自己(而不是某个用户)访问资源时,使用客户端凭证流程。比如一个定时任务智能体,每天凌晨拉取报表。
// 客户端凭证流程示例
POST /oauth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id=your_client_id
&client_secret=your_client_secret
&scope=read:reports
2.3 RBAC权限模型:给智能体「划地盘」
RBAC(基于角色的访问控制)是目前最成熟的权限管理模型。它的核心思想是:不直接把权限分配给用户或智能体,而是分配给角色,再把角色分配给主体。
你想想看,如果公司有100个智能体,每个都需要不同的权限组合。没有RBAC,你就要维护100份权限配置,改一个权限就要改100个地方——这简直是运维噩梦。
2.3.1 RBAC的三要素
| 要素 | 说明 | 示例 |
|---|---|---|
| 用户/智能体 | 访问系统的主体 | 订单处理智能体、数据报表智能体 |
| 角色 | 权限的集合 | 订单管理员、报表查看者、系统审计员 |
| 权限 | 对资源的操作 | read:orders, write:orders, delete:orders |
2.3.2 智能体场景下的RBAC设计
我在项目中遇到过,一个智能体被分配了「管理员」角色,结果它因为一个bug开始批量删除用户数据。嗯,这就是角色粒度太粗的后果。
我建议为智能体设计细粒度角色,而不是复用人类用户的角色体系:
// 智能体角色定义示例
{
"roles": [
{
"name": "order_processor",
"permissions": [
"read:orders",
"write:orders",
"read:inventory"
]
},
{
"name": "report_generator",
"permissions": [
"read:orders",
"read:users",
"read:products"
]
}
]
}
2.4 最小权限原则:给智能体「刚刚好」的权限
最小权限原则(Principle of Least Privilege, PoLP)是安全领域的黄金法则。它的意思是:一个主体只拥有完成其任务所必需的最小权限集合。
说白了,就是「够用就行,多一分都不要」。
2.4.1 为什么智能体更需要最小权限?
- 攻击面缩小: 如果智能体只有读权限,即使被攻破,攻击者也拿不到写权限
- 误操作防护: 智能体的代码可能有bug,权限越小,bug造成的破坏越小
- 审计清晰: 权限边界明确,出了问题能快速定位是哪个智能体、哪个操作
2.4.2 落地最小权限的四个步骤
- 任务分析: 列出智能体需要完成的所有任务
- 权限映射: 每个任务需要哪些API、哪些操作
- 权限裁剪: 去掉所有非必需的权限
- 持续审计: 定期检查智能体的实际权限使用情况,回收闲置权限
2.5 本章知识体系总览
下面这张图把四个核心模块的关系梳理清楚了。你可以把它当作一个检查清单,每次设计智能体系统时对照着过一遍。
2.6 避坑总结
最后,分享几个我踩过的坑,希望能帮你少走弯路:
- 「万能Key」陷阱: 我曾经接手过一个项目,所有智能体共用同一个API Key,权限是
*:*。改这个架构花了我两周时间。 - 「角色膨胀」陷阱: 随着业务发展,角色越来越多,权限越来越乱。定期做角色清理,合并冗余角色。
- 「权限只加不减」陷阱: 每次新需求都加权限,但从不回收。建议每季度做一次权限审计,回收90天内未使用的权限。
- 「日志缺失」陷阱: 没有审计日志,出了安全问题根本没法溯源。所有认证和授权操作必须记录日志。