1. 分布式鉴权概述

1.1 分布式系统的安全挑战

在单体架构向分布式架构演进的过程中,安全边界从单一进程内扩展到了跨网络、跨服务、跨数据中心的复杂环境。分布式系统面临的核心安全挑战可归纳为以下五个维度:

挑战维度 具体问题 典型场景
信任边界模糊 服务间调用不再局限于内网,微服务实例可能运行在不可信的主机上 Kubernetes Pod 间通信、跨 VPC 服务调用
凭证传播风险 用户身份凭证需要在多个服务间透传,中间节点可能窃取或篡改 API Gateway 透传 JWT、RPC 调用链身份传递
会话状态分散 用户登录状态无法依赖单一内存 Session,需全局共享或无状态化 Redis 集中 Session、JWT 无状态 Token
密钥管理复杂 签名密钥、加密密钥分布在多个服务,轮换和吊销困难 JWT 签名密钥分发、OAuth2 Client Secret 管理
审计与溯源困难 请求经过多个服务节点,日志分散,难以还原完整操作链路 分布式追踪中的身份标记、操作审计日志聚合
关键认知:分布式鉴权的本质不是把单体鉴权搬到多台机器上,而是要在不可信的网络环境中建立可传递、可验证、可撤销的信任链。

1.2 鉴权与认证的区别

这两个概念经常被混用,但在安全架构中职责完全不同:

维度 认证 (Authentication) 鉴权 (Authorization)
核心问题 你是谁? 你能做什么?
输入 凭证(密码、证书、生物特征) 身份标识 + 资源请求
输出 身份断言(用户 ID、角色列表) 允许 / 拒绝决策
状态 通常有状态(Session)或无状态(JWT) 通常无状态(策略驱动)
失败后果 无法登录,拒绝访问系统 操作被拦截,返回 403
典型协议 LDAP、OIDC、SAML、Basic Auth RBAC、ABAC、ACL、OAuth2 Scope
架构口诀:认证在前,鉴权在后。认证确定身份,鉴权决定权限。两者必须解耦,才能支撑分布式场景下的灵活扩展。

1.3 常见鉴权模型对比

业界主流的鉴权模型各有适用场景,以下从粒度、复杂度、可维护性三个维度进行横向对比:

模型 核心思想 权限粒度 实现复杂度 分布式适配 典型应用
ACL
访问控制列表
为每个资源维护允许访问的用户/组列表 细粒度(资源级) 低 差(列表膨胀快) 文件系统、网络设备
RBAC
基于角色的访问控制
用户 → 角色 → 权限,通过角色间接授权 中粒度(角色级) 中 好(角色可缓存) 企业系统、Kubernetes
ABAC
基于属性的访问控制
根据用户、资源、环境属性动态计算决策 极细粒度(属性级) 高 中(策略引擎需分布式部署) 云 IAM、金融风控
ReBAC
基于关系的访问控制
通过实体间关系图推导权限 关系粒度 高 好(图存储可水平扩展) 社交网络、Google Zanzibar
选型建议:不要一开始就追求 ABAC 或 ReBAC。80% 的分布式系统用 RBAC + 资源级 Scope 就能覆盖需求。过度设计会导致策略引擎成为新的性能瓶颈。

1.4 分布式鉴权核心架构

下图展示了分布式鉴权的通用架构模式,包含身份提供者、策略决策点、策略执行点三个核心组件:

分布式鉴权核心架构 用户 / 客户端 API Gateway (PEP) 策略决策点 (PDP) 身份提供者 (IdP) 微服务集群 服务 A 服务 B 服务 C 策略存储 (PAP) 请求 + 凭证 鉴权请求 身份验证 身份断言 允许 / 拒绝 转发请求 + 身份上下文 加载策略
架构要点:PEP(策略执行点)通常部署在 API Gateway 或服务网格 Sidecar 中,负责拦截请求并调用 PDP 做决策。PDP(策略决策点)是无状态的,可以水平扩展。PAP(策略管理点)负责存储和分发策略,通常使用 etcd、Consul 或数据库。

1.5 分布式鉴权的关键设计原则

  • 无状态优先:尽量使用 JWT 等自包含 Token,减少集中式 Session 存储的依赖,降低单点故障风险。
  • 最小权限:每个服务只拥有完成其功能所需的最小权限集合,避免过度授权导致横向移动攻击。
  • 防御纵深:在 API Gateway、服务网格、应用层分别设置鉴权检查点,不依赖单一安全防线。
  • 可审计:所有鉴权决策必须记录日志,包含决策时间、请求方、资源、决策结果,便于事后追溯。
  • 策略与代码分离:权限策略不应硬编码在业务代码中,应通过策略引擎动态加载,支持热更新。