3.1 一个经典的误解

“我已经登录了,为什么还不能访问这个页面?”

这是 IAM 工程师最常听到的问题之一。在企业 IAM(身份与访问管理)体系中,用户将"能够登录"等同于"能访问所有功能",这恰恰混淆了认证和授权的本质区别。理解这一区别是 IAM 系统设计的第一课——如果你不知道 AuthN 和 AuthZ 的分界线在哪里,你的 IAM 架构从一开始就埋下了安全债务。关于 IAM 整体框架,推荐先阅读 IAM 基础概念

让我们用机场的比喻来理解:

  • 认证:出示身份证件,证明"我是张三"
  • 授权:出示登机牌,证明"我被允许乘坐CA1234航班"
  • 有身份证(已认证)但没有登机牌(未授权),你上不了飞机
  • 有登机牌(已授权)但没有身份证(未认证),你同样上不了飞机

3.2 认证(Authentication,AuthN)

3.2.1 认证的核心问题

认证回答三个递进的问题:

  1. 这个用户存在吗?(身份识别)
  2. 这个用户是他声称的那个人吗?(身份验证)
  3. 当前是否已经验证过?(会话管理)

3.2.2 认证方式分类

基于知识的认证

用户知道什么。

  • 静态密码:最传统的方式,问题在于用户喜欢弱密码、复用密码、写密码在便签上。
  • 安全问题:你第一个宠物的名字?这类问题的答案往往比密码更容易被猜中或通过社交工程获取。
  • 图片密码:选择正确的图片组合,在移动端有一定应用场景。

基于持有的认证

用户拥有什么。

  • 短信/邮箱验证码:最普及,但短信验证码存在 SS7 协议攻击与 SIM 劫持(SIM-swap)风险,NIST SP 800-63B 与 OWASP 均已不再将其作为强认证因素,新项目建议优先 TOTP、推送或 Passkey。
  • 硬件 Token:U-Key、YubiKey。物理设备,安全性高,但有丢失风险和分发的物流成本。
  • 软件 Token:TOTP(Google Authenticator、Authy)或推送通知认证。
  • 智能卡:带有芯片的卡片,常见于大型企业和政府机构。

基于固有的认证

用户是什么。

  • 指纹识别:方便,但指纹可以被复制,且皮肤状态影响识别率。
  • 面部识别:Apple Face ID 是标杆实现,普通摄像头的安全性存疑。
  • 虹膜识别:精度极高但设备昂贵。
  • 声纹识别:可远程使用,但录音回放和 AI 合成构成威胁。
  • 行为生物识别:击键模式、鼠标轨迹、持手机的角度。无感知认证,正在快速发展。

3.2.3 认证的技术实现

基于 Session 的认证

1. 用户提交用户名和密码
2. 服务端验证通过,创建 Session,返回 Session ID(Cookie)
3. 后续请求携带 Cookie,服务端查找 Session 验证

特点:有状态,服务端存储 Session;可即时吊销;扩展困难(Session 同步)。

基于 Token 的认证

1. 用户提交用户名和密码
2. 服务端验证通过,签发 Token(JWT)
3. 客户端存储 Token,后续请求在 Authorization 头中携带
4. 服务端验证 Token 签名和有效期

特点:无状态,服务端不需要存储;水平扩展友好;吊销需要额外机制(黑名单、短有效期)。

基于证书的认证

使用 X.509 客户端证书进行 TLS 双向认证(mTLS)。常见于服务间通信和高安全场景。

FIDO2 / WebAuthn

无密码认证的开放标准,使用公私钥对进行认证。私钥存储在用户设备的可信区域(TPM/Secure Enclave),永远不会离开设备,服务端只存储公钥,天然抗钓鱼。Passkey(通行密钥) 是 FIDO2/WebAuthn 面向消费者的落地形态,由 Apple、Google、Microsoft 自 2022 年起在各自平台原生支持,私钥可在用户设备间端到端加密同步,已成为无密码认证的主流实践。

3.2.4 认证安全的关键概念

防暴力破解:限制错误尝试次数,临时或永久锁定账户。

防重放攻击:使用 Nonce、时间戳、Token 有效期。

防钓鱼:FIDO2/WebAuthn 的凭据与 Relying Party ID(rpId,依赖方域名 eTLD+1)绑定,并校验 origin,使认证断言(assertion)只能在对应域名使用,钓鱼站点无法重放(WebAuthn 不签发 Token,产物是带签名的 assertion)。

凭证存储:密码必须单向哈希(bcrypt、scrypt、Argon2),绝不能明文或可逆加密存储。

3.3 授权(Authorization,AuthZ)

3.3.1 授权的核心问题

授权不是二元的是/否,而是多维度的问题:

  • 这个用户能否对这个资源执行这个操作
  • 这个用户在这个时间、从这个地点、用这个设备访问,是否允许?
  • 如果是"部分允许"(如可以看到列表但不能修改),如何表达?

3.3.2 授权策略的表达

ACL(访问控制列表)

一对一的关系。直接列出"谁可以对什么做什么"。

Resource: /reports/sales-2024.xlsx
  - Alice: read, write
  - Bob: read
  - Carol: (none - implicit deny)

优点:直观。缺点:管理成本随用户和资源的增加而爆炸。

RBAC(基于角色的访问控制)

通过角色简化权限分配。

Alice → [角色: 销售经理] → [权限: 查看销售报告, 编辑销售数据]
Bob   → [角色: 销售代表] → [权限: 查看自己的销售数据]

这是目前最广泛使用的授权模型。实现简单,管理方便。缺点是角色爆炸——当业务的精细度超过角色设计时,需要不断创建新角色。

ABAC(基于属性的访问控制)

精细化、动态化的授权。

Rule: 允许访问 IF
  user.department = "sales" AND
  user.clearance_level >= resource.sensitivity AND
  time.current BETWEEN "09:00" AND "18:00" AND
  device.trust_score > 0.8

优点:灵活,支持复杂策略。缺点:策略难以可视化和管理,性能开销大。

PBAC(基于策略的访问控制)

策略 = 规则 + 条件 + 操作。使用自然语言或 DSL 编写策略,通过 PDP(Policy Decision Point)评估。

ReBAC(基于关系的访问控制)

源自 Google Zanzibar 论文。用关系图表达权限,特别适合社交网络、协作工具等场景。

权限: 编辑文档 IF
  主体 is a member of 文档.workspace OR
  主体 is an editor of 文档 OR  
  主体 is a manager of 文档.owner

3.4 认证与授权的关系

认证是授权的前提,但不等同于授权

认证(AuthN)         授权(AuthZ)
    │                    │
    ├─ 确认身份           ├─ 确认权限
    ├─ 登录时发生          ├─ 每次访问时发生
    ├─ 凭据验证            ├─ 策略评估
    ├─ 产出:身份声明       ├─ 产出:访问决策
    │                    │
    └─────────┬──────────┘
              │
        安全上下文

实际流程

请求 → 认证拦截器 → "这是谁?"
                    ↓
                  认证成功?
                    ↓ Yes
              授权拦截器 → "他能做这个吗?"
                    ↓
              允许/拒绝

常见反模式

  1. 将授权信息放在 Token 中且不设有效期:用户角色变了,但旧 Token 仍然可用。
  2. 仅在网关层做授权,业务层不校验:网关配置错误可能导致越权。
  3. 将用户 ID 作为授权判断的唯一依据:攻击者可以伪造用户 ID。
  4. 前端隐藏按钮代替后端权限检查:用户可以绕过前端直接调用 API。

3.5 IAM 实践要点

在企业 IAM 系统中,认证和授权的工程落地远比概念区分复杂:

  1. AuthN 和 AuthZ 应当解耦。IAM 认证服务负责"他是谁",IAM 授权服务负责"他能做什么"。这是 IAM 架构设计的基本法则——解耦后你可以独立升级认证方式(如增加 Passkey)而不影响授权策略。
  2. Token 应当短有效期,使用 Refresh Token 续期。
  3. 权限变更后,应能在合理时间内生效(建议 < 5 分钟)。在 IAM 会话管理层面,这意味着 Token 吊销机制必须可靠——详见 IAM 会话管理与 Token 生命周期
  4. 所有授权决策都应记录日志——这是 IAM 审计合规的基础。
  5. 默认拒绝(Deny by Default)——什么都不声明,默认就是不能访问。
  6. 在 API 网关、应用中间件、业务逻辑三层都进行授权检查。
  7. 授权模型选型直接影响 IAM 系统的可维护性——RBAC 简单但易角色爆炸,ABAC 灵活但策略复杂,ReBAC 适合关系密集型场景。完整的授权模型对比见 IAM RBAC、ABAC、ReBAC 授权模型对比与选型指南