4. 认证与授权审计基线:Bearer Token、OAuth2、API Key、JWT校验、最小权限原则检查
认证(Authentication)与授权(Authorization)是API安全的第一道防线。OpenAPI规范通过securitySchemes和security字段声明API的安全模型。审计基线要求验证:安全方案定义是否完整、令牌校验逻辑是否严格、权限范围是否遵循最小权限原则。
4.1 核心概念与审计目标
认证确认“你是谁”,授权确认“你能做什么”。在OpenAPI审计中,需要区分以下四种主流机制:
| 安全方案类型 | type 值 | 典型场景 | 审计关注点 |
|---|---|---|---|
| Bearer Token | http + bearer |
JWT、OAuth2 Access Token | Token格式、过期校验、签名算法 |
| OAuth2 | oauth2 |
第三方授权、委托访问 | 授权流程、Scope定义、Client凭证 |
| API Key | apiKey |
简单身份标识、服务间调用 | Key传输方式、轮换策略、泄露风险 |
| JWT | 通常配合Bearer | 自包含令牌、无状态认证 | 签名验证、Payload声明、过期时间 |
审计基线原则:所有公开API端点必须至少声明一种安全方案;禁止使用“全局安全方案”覆盖所有路径后,又在个别路径上使用
security: []绕过认证而不做显式说明。
4.2 Bearer Token 审计基线
Bearer Token是最常见的HTTP认证方式。OpenAPI中通过type: http和scheme: bearer定义。审计要点包括:
- Bearer格式声明:必须使用
bearerFormat字段说明Token类型(如JWT、Opaque)。 - 传输安全:所有Bearer Token必须通过HTTPS传输,禁止明文HTTP。
- Token存储:服务端不应持久化明文Token,应使用哈希或加密存储。
- 过期机制:Token必须设置
exp(过期时间),服务端需校验。
# 正确的Bearer Token定义示例
components:
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT # 明确声明Token格式
description: "使用JWT格式的Bearer Token,通过Authorization头传递"
常见违规:遗漏
bearerFormat字段,导致客户端无法判断Token格式;或使用bearerFormat: "JWT"但实际服务端接受任意字符串,存在伪造风险。
4.3 OAuth2 审计基线
OAuth2是委托授权标准,OpenAPI支持四种授权流程。审计基线要求验证流程定义、Scope粒度、客户端凭证管理。
| 授权流程 | flows 字段 | 审计要点 |
|---|---|---|
| 授权码流程 | authorizationCode |
授权码必须一次性使用;必须验证redirect_uri;必须使用PKCE |
| 隐式流程 | implicit |
不推荐使用;Token在URL片段中传递,存在泄露风险 |
| 密码凭证流程 | password |
仅适用于高信任场景;禁止用于第三方应用 |
| 客户端凭证流程 | clientCredentials |
仅用于服务间通信;必须限制Scope范围 |
# OAuth2 授权码流程定义示例
components:
securitySchemes:
OAuth2Auth:
type: oauth2
flows:
authorizationCode:
authorizationUrl: https://auth.example.com/authorize
tokenUrl: https://auth.example.com/token
scopes:
read: "读取用户数据"
write: "写入用户数据"
admin: "管理权限(需审批)"
审计检查项:
- Scope名称是否遵循命名规范(如
resource:action格式)。 - 是否定义了最小Scope集合,避免使用通配符(如
*)。 - 授权码流程是否强制要求PKCE(
code_challenge参数)。 - 隐式流程是否已被标记为
deprecated: true。
4.4 API Key 审计基线
API Key通过type: apiKey定义,可放置在Header、Query或Cookie中。审计基线要求:
- 传输位置:优先使用Header(
in: header),避免在URL Query中传递Key。 - Key命名:使用标准Header名称如
X-API-Key,避免自定义敏感名称。 - Key轮换:API Key必须支持定期轮换,审计检查是否有轮换机制文档。
- 权限隔离:每个API Key应绑定最小权限,禁止使用“超级Key”。
# API Key 定义示例(推荐Header方式)
components:
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: X-API-Key
description: "通过X-API-Key头传递API密钥"
高风险模式:将API Key放在Query参数中(
in: query),Key会出现在服务器日志、浏览器历史、反向代理日志中,极易泄露。审计应标记此类定义为“不合规”。
4.5 JWT 校验审计基线
JWT(JSON Web Token)通常作为Bearer Token的载体。审计基线要求验证JWT的完整性、签名算法、Payload声明。
| 校验维度 | 审计要求 | 常见违规 |
|---|---|---|
| 签名算法 | 必须使用RS256/ES256等非对称算法;禁止使用none算法 |
服务端接受alg: none,导致任意伪造Token |
| 过期时间 | 必须校验exp声明;建议设置nbf(生效时间) |
未校验exp,过期Token仍可访问 |
| 签发者 | 必须校验iss声明,与预期签发者匹配 |
接受任意iss,导致跨域Token滥用 |
| 受众 | 必须校验aud声明,确保Token仅用于目标API |
未校验aud,Token可在多个服务间混用 |
# JWT Payload 最小声明集示例
{
"iss": "https://auth.example.com",
"sub": "user_12345",
"aud": "https://api.example.com/v2",
"exp": 1718000000,
"iat": 1717996400,
"scope": "read write"
}
最佳实践:在OpenAPI扩展字段
x-jwt-claims中声明JWT必须包含的声明列表,便于自动化审计工具校验。
4.6 最小权限原则检查
最小权限原则(Principle of Least Privilege)要求每个API端点只授予完成操作所需的最小权限集合。审计检查方法:
- 端点级权限声明:每个路径+方法必须显式声明所需的安全范围(Scope)。
- Scope粒度:避免使用
admin或full_access等粗粒度Scope,应拆分为users:read、orders:write等细粒度Scope。 - 全局覆盖检查:检查
security字段是否在顶层定义后,又被子路径覆盖为更宽松的权限。 - 未授权端点:审计标记所有未声明安全方案的端点(
security: []),要求业务方确认。
# 最小权限原则合规示例
paths:
/users:
get:
summary: "获取用户列表"
security:
- BearerAuth: [users:read] # 仅需读取权限
post:
summary: "创建用户"
security:
- BearerAuth: [users:write] # 需要写入权限
/admin:
get:
summary: "管理面板"
security:
- BearerAuth: [admin:read] # 管理权限单独定义
自动化审计规则:
- 扫描所有路径,提取
security声明中的Scope列表。 - 对比每个端点的HTTP方法(GET/HEAD通常只需
read,POST/PUT/DELETE需要write)。 - 标记GET方法使用
write或adminScope的端点,要求降级。 - 标记未声明任何安全方案的端点,要求补充。
4.7 认证与授权审计流程总览
下图展示了从OpenAPI规范解析到最终审计报告生成的完整流程:
4.8 审计基线检查清单
以下清单可作为自动化审计工具的输入,也可用于人工审查:
| 检查项ID | 检查内容 | 严重等级 | 合规标准 |
|---|---|---|---|
| AUTH-01 | 所有端点是否声明安全方案 | 严重 | 无security: []的端点需业务确认 |
| AUTH-02 | Bearer Token是否声明bearerFormat |
重要 | 必须明确Token格式(JWT/Opaque) |
| AUTH-03 | OAuth2 Scope是否遵循命名规范 | 重要 | 使用resource:action格式 |
| AUTH-04 | JWT签名算法是否禁止none |
严重 | 仅允许RS256/ES256等安全算法 |
| AUTH-05 | API Key是否使用Header传输 | 重要 | 禁止Query参数传递Key |
| AUTH-06 | 最小权限:GET方法是否使用read范围 |
建议 | GET/HEAD应使用只读Scope |
| AUTH-07 | 隐式流程是否标记为deprecated |
重要 | 隐式流程应被弃用,推荐授权码+PKCE |
审计工具集成:建议将上述检查清单编码为OpenAPI规范扩展(
x-audit-rules),集成到CI/CD流水线中,每次规范变更自动触发审计。