安全模型与原则 · kp-002
认证、授权与审计(AAA)
入门
约 15 分钟
状态:reviewed
#基础#认证#授权#审计
一句话定义
AAA 是访问控制的三段骨架:认证(Authentication,确认"你是谁")、授权(Authorization,决定"你能做什么")、审计(Accounting/Audit,记录"你做了什么")。
为什么重要
几乎所有越权与数据泄露事故,最终都能归因到 AAA 三段中某一段的缺失或串联错误。把每个请求拆成"认证 → 授权 → 动作 → 审计"四步来审视,是把模糊的"感觉不安全"变成可排查工程问题的标准方法;零信任架构(kp-021)本质上就是把 AAA 从"登录时一次"改为"每请求持续"。
前置知识
kp-001(CIA 三元组):审计服务于完整性,认证服务于真实性。
核心概念
- 认证的凭证三因子:所知(密码、PIN)、所有(手机、硬件密钥)、所是(指纹、人脸)。单因子可被复制,组合不同因子才能显著提高攻击成本,这就是多因素认证(MFA)的原理。
- 授权模型:RBAC(按角色授权)与 ABAC(按属性/上下文授权)是两大主流;权限应默认拒绝、显式授予。
- 越权两类:水平越权(同角色用户互访数据,如改 URL 里的 id 看别人订单)与垂直越权(低权限拿到高权限能力)。这是 Web 应用最高频的漏洞类别(对应 kp-016 的 A01)。
- 审计:不可篡改的、带时间戳与主体标识的操作记录,是溯源与不可否认性的基础。
公式、模型或图示
请求 ──▶ 认证(你是谁?凭证验证)
──▶ 授权(该请求允许吗?策略判定)
──▶ 动作(执行业务)
──▶ 审计(记录 谁/何时/何事/结果)四个环节是流水线关系:认证失败则后面全部短路;授权必须独立于前端状态在服务端逐请求判定;审计必须覆盖认证与授权的失败记录——失败日志往往比成功日志更有检测价值。
原理与机制
认证回答身份问题,但身份与权限必须解耦:把"登录了"当成"什么都能做"是最常见的架构级错误。授权判定的输入应是(主体、动作、资源、上下文)四元组,其中上下文(IP、设备、时间、风险评分)正是零信任持续验证的扩展点。审计的工程要点有三:完整性(日志本身要防篡改,通常靠只追加存储与权限隔离)、可关联性(统一时间源与请求 ID 串起多系统日志)、最小噪声(只记有分析价值的事件,否则信噪比会淹没真实告警,见 kp-027)。
实例或案例
- Linux 的 sudo:认证(口令)→ 授权(sudoers 白名单)→ 审计(/var/log/auth.log 或 journalctl 记录每条提权),是 AAA 的教科书实现。
- 网关返回 401(未认证)与 403(已认证但无权限)的区分,体现认证与授权的边界。
- 反例:某后台只在前端隐藏"删除"按钮而服务端不做权限判定——任何知道接口地址的用户都能垂直越权,这是审计 least privilege 缺失的典型事故模式。
直观类比
机场流程即 AAA:值机柜台查证件(认证)、登机牌决定能上哪架飞机坐哪个座位(授权)、调度与监控记录全程(审计)。有证件不代表能进驾驶舱——认证通过不等于授权通过。
常见误区
- 认证即安全:"已经登录了所以后续请求都可信",忽视了水平/垂直越权判定。
- 把授权写在前端:前端隐藏入口只是体验,服务端逐请求判定才是安全边界。
- 只记成功不记失败:认证失败、授权拒绝恰是暴力破解与探测的第一信号。
与其他知识点的关系
- kp-015(会话管理与认证安全):认证的工程实现细节与口令存储。
- kp-021(零信任网络架构):把 AAA 从边界一次验证扩展为每请求持续验证。
自测题
- 用户 A 把请求里的订单号改成用户 B 的订单号并成功读取,这是哪类越权?根因在哪一段?要点:水平越权;授权段缺少"资源属主与主体匹配"的服务端判定。
- 为什么生物识别不宜作为唯一认证因子?要点:生物特征不可更换,泄露后无法重置;单因子可被伪造,需与其他因子组合。
- 401 与 403 的语义区别是什么?为什么区分它们对排查很重要?要点:401 未认证、403 已认证无权限;混用会让排查无法区分"凭证问题"与"权限配置问题"。
延伸阅读
《NIST SP 800-63B: Digital Identity Guidelines》:认证保障等级(AAL)与口令策略的权威参考。