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:  "管理权限(需审批)"
审计检查项:
  1. Scope名称是否遵循命名规范(如resource:action格式)。
  2. 是否定义了最小Scope集合,避免使用通配符(如*)。
  3. 授权码流程是否强制要求PKCE(code_challenge参数)。
  4. 隐式流程是否已被标记为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]   # 管理权限单独定义
自动化审计规则:
  1. 扫描所有路径,提取security声明中的Scope列表。
  2. 对比每个端点的HTTP方法(GET/HEAD通常只需read,POST/PUT/DELETE需要write)。
  3. 标记GET方法使用write或admin Scope的端点,要求降级。
  4. 标记未声明任何安全方案的端点,要求补充。

4.7 认证与授权审计流程总览

下图展示了从OpenAPI规范解析到最终审计报告生成的完整流程:

认证与授权审计流程 解析OpenAPI规范 提取 securitySchemes Bearer Token 检查 OAuth2 流程检查 API Key 检查 JWT 签名与声明校验 最小权限原则审计 审计输出:安全方案合规报告 + 权限违规清单 + 修复建议

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流水线中,每次规范变更自动触发审计。