3. Agent身份认证机制
3.1 模块边界
身份认证是 Agent 操作权限控制的第一个安全关口,其职责是确认请求方“你是谁”。该模块位于 Agent 与权限策略引擎之间,向上承接 Agent 注册与身份申明,向下输出经过认证的身份上下文(Subject 与 Claims)。模块边界清晰:
- 输入:Agent 携带的身份标识 + 凭证,以及可选的附带环境信息(IP、设备指纹等)。
- 输出:认证通过的
AuthenticatedIdentity对象,包含身份 ID、角色、属性集合以及可信等级。 - 外部依赖:信任锚点(CA 根证书 / OIDC Issuer / 区块链锚点)、凭证存储(KMS / 硬件安全模块)。
- 不负责:授权决策、会话管理、审计日志记录(这些由后续章节覆盖)。
核心原则:身份认证必须独立于授权,且认证结果应携带足够的可信度信息供下游策略引擎评估。
3.2 系统分层与组件职责
身份认证在 Agent 权限控制架构中处于基础层,通常分为三层:
| 层 | 组成 | 核心职责 |
|---|---|---|
| 身份标识层 | AgentID、Subject、全局唯一标识符 | 为每个 Agent 分配不可变、可验证的身份标识,隔离不同 Agent 的身份空间。 |
| 凭证类型层 | JWT、mTLS 证书、API Key、SPIFFE SVID | 提供多样性凭证,满足不同部署环境(边缘、云、混合)的安全与性能要求。 |
| 信任锚点层 | CA 根证书、OIDC Issuer 公钥、硬件信任根 | 决定是否信任所呈现的凭证,是认证链的最终裁决者。 |
组件职责明细:
- 身份提供者(IdP):注册 Agent 身份,签发初始凭证。
- 凭证验证引擎:接收凭证,解析并验证签名、有效期、展期策略。
- 信任锚点存储:维护受信任的根证书或公钥列表,定期轮换。
- 身份缓存:缓存最近认证通过的
AuthenticatedIdentity以减少实时验证开销。
3.3 数据流 / 控制流 / 信任链路
一次典型的 Agent 身份认证流程如下:
- 身份注册:Agent 管理员在 IdP 中创建 Agent 身份标识,绑定公钥或预共享密钥。
- 凭证签发:IdP 根据可信锚点(如 CA)签发包含 Agent ID 的凭证(JWT / X.509 证书)。
- 认证请求:Agent 向验证引擎提交凭证,附带身份标识。
- 信任链验证:验证引擎逐级向上校验签名,直到信任锚点(根证书 / 公钥)。
- 身份输出:验证通过后,引擎构造
AuthenticatedIdentity并缓存或直接传递给策略引擎。
最佳实践:信任锚点采用硬件安全模块(HSM)保护私钥,且公钥分发应通过安全发布通道(如 SPIFFE 工作负载 API)进行。
3.4 凭证类型选型权衡
| 凭证类型 | 安全强度 | 性能开销 | 运维复杂度 | 适用场景 | 风险点 |
|---|---|---|---|---|---|
| JWT (带有密钥) | 中(依赖私钥保管) | 低(无状态验证) | 低 | 云环境、短生命周期事务 | 密钥泄露、未及时吊销 |
| mTLS 证书 | 高(双向校验) | 中(TLS 握手消耗) | 高(证书生命周期管理) | 零信任网络、跨集群通信 | 证书过期导致中断、CA 被攻破 |
| API Key | 低(明文传输风险) | 极低 | 最低 | 内部开发调试、低安全级别场景 | 泄露后难以轮换、缺乏身份绑定 |
| SPIFFE SVID | 高(X.509 或 JWT 格式、标准绑定) | 中 | 中(需 SPIFFE 基础设施) | 服务网格、容器化 Agent | SPIFFE 信任域配置错误 |
风险警示:绝不使用静态、不过期的凭证。所有凭证应包含
exp 字段,且 Agent 必须在过期前通过带外通道刷新凭证。信任锚点若被攻破,整个认证系统将失效 – 必须实施锚点审核与轮换计划。
3.5 落地步骤
- 定义身份标识规范:制定 AgentID 格式(如
agent://{namespace}/{agent-name}),确保全局唯一且可审计。 - 部署信任锚点:搭建内部 CA 或接入外部 OIDC Provider;配置公钥存储(如 AWS Secret Manager / 本地 HSM)。
- 实现凭证签发服务:IdP 为每个 Agent 签发短期凭证(如 JWT 有效期为 1 小时),并支持轮换。
- 集成凭证验证引擎:在策略执行点前加入拦截器,校验凭证签名、有效期、撤销状态。
- 建立身份缓存与审计:缓存认证结果(TTL ≤ 凭证有效期),并记录每次认证的标识、时间、结果到审计日志。
# 伪代码:凭证验证引擎核心逻辑
def authenticate(agent_identity, credential):
# 1. 解析凭证类型
cred_type = detect_credential_type(credential)
# 2. 获取对应信任锚点公钥
trusted_pubkey = fetch_anchor_pubkey(cred_type)
# 3. 验证签名与有效期
if not verify_signature(credential, trusted_pubkey):
raise AuthFailed("Invalid signature")
if is_expired(credential):
raise AuthFailed("Expired credential")
# 4. 返回身份对象
return AuthenticatedIdentity(agent_identity, claims=extract_claims(credential))
3.6 验收标准
- 身份标识唯一性:系统应拒绝重复注册,相同 AgentID 在有效期内不允许第二个凭据存在。
- 凭证有效性:所有 Agent 使用的凭证必须包含
exp且过期时间 ≤ 24 小时(生产环境建议 ≤ 1 小时)。 - 信任链路可审计:每次认证应记录信任锚点版本(如 CA 序列号),便于事后追溯锚点变更。
- 失效处理:信任锚点被轮换后,旧凭证在 5 秒内应被认定为无效(通过 CRL 或在线状态检查)。
- 性能指标:认证响应 99.9% 在 10ms 内完成(不含网络延迟),避免成为瓶颈。
关键检查点:在启用新认证机制前,先用模拟 Agent 进行端到端冒烟测试,确认身份标识、凭证、信任锚点三层均正确连接。