传统认证模型的时序是:登录时验证一次 → 签发一个数小时有效的 Session → 期间不再验证。零信任把这个模型变成了:信任分数随时间动态变化,会话可能在任何时刻被降级或撤销。
前置阅读:设备姿态与远程证明。
一、一次性认证的四个不可能假设
传统模型隐含四个假设,每个都在现代威胁面前不成立:
| 假设 | 现实 |
|---|---|
| 认证时设备合规 → 整个会话期间合规 | 设备在会话中途感染恶意软件、关闭防火墙、或连接不安全网络 |
| 凭据认证时未被泄露 → 整个会话期间未被泄露 | 凭据在会话中途的 phishing 攻击中被窃取 |
| 用户认证时的行为正常 → 会话期间所有操作正常 | 合法用户的凭证被攻击者使用后,异常行为需要数小时才能被检测到 |
| 会话不会超过合理时长 | 攻击者通过会话劫持(Session Hijacking)无限延长已经被攻破的会话 |
MGM 度假村 2023 年的攻击就是第三个假设崩塌的实例——攻击者冒充员工重置了 Okta MFA 令牌,此后的所有操作都被系统视为”已认证用户”。
二、三种持续验证模式
| 模式 | 机制 | 安全窗口 | 性能开销 | 适用场景 |
|---|---|---|---|---|
| Event-driven | 收到风险信号时触发降级/撤销 | 信号到达之前 | 极低(平时无额外成本) | 设备姿态变化、威胁情报告警 |
| Periodic | 定时(1-15 分钟)重新评估设备姿态 | 评估间隔 | 低-中 | 大多数 Web 应用 |
| Request-granular | 每个请求携带短有效期凭据 | 凭据有效期 | 高 | 高敏感 API、mTLS 证书 |
2.1 Event-driven 模式
Event-driven 持续验证是最”零信任原生”的模式:系统不在固定时间点重新评估,而是订阅风险信号事件(如设备不合规、密码被修改、用户被从组中移除),当事件到达时立即触发对应会话的降级或撤销。
这个模式的协议层实现是 OpenID Shared Signals Framework (SSF) 和 Continuous Access Evaluation Profile (CAEP)——目前仍处于草案阶段(CAEP 1.0 draft-05)。
CAEP 定义的事件类型:
| 事件类型 | 含义 | 触发动作 |
|---|---|---|
session-revoked |
会话已被 IdP 撤销 | 撤销所有依赖该会话的令牌 |
credential-change |
凭据创建/修改/撤销 | 降级或撤销会话,要求重新认证 |
device-compliance-change |
设备合规状态变化 | 根据新合规状态调整访问权限 |
assurance-level-change |
认证保证等级变化 | 限制对高敏感资源的访问 |
risk-level-change |
抽象风险等级变化 | 触发 Step-up auth 或降级 |
CAEP 基于 RFC 8417(Security Event Token, SET)——SET
是一个 JWT
格式的事件载荷,包含事件类型、主体标识符(iss_sub)、事件时间戳和事件特定的属性。
SET 的交付机制有两种(RFC 8935 推 / RFC 8936 拉):
推模式 (RFC 8935):
IdP/Transmitter → HTTP POST → Client/Receiver
↓
POST /events
Body: {"events": {"https://schemas.openid.net/secevent/caep/event-type/device-compliance-change": {...}}}
拉模式 (RFC 8936):
Client/Receiver → HTTP GET → IdP/Transmitter
↓
返回未送达的事件列表
目前 CAEP 的主要采纳者是 Microsoft(Azure AD Continuous Access Evaluation)、Okta 和 Google——但它们之间的互操作(跨厂商的 CAEP 事件传递)仍在早期阶段。Shared Signals 工作组的重大成果是定义了标准化的 Subject Identifiers(RFC 9493)——不同系统之间用相同的格式识别同一个用户/设备。
2.2 Periodic 模式
Periodic(周期性)持续验证是当前最主流的折中——它不需要复杂的事件基础设施,而是在固定的时间间隔重新查询设备状态。
周期长度是一个工程权衡: - 1 分钟:接近实时,但策略引擎和信号源的查询负载很高 - 5 分钟:当前主流选择——JWT 常见有效期(5 分钟)匹配评估周期 - 15 分钟:Google BeyondCorp 使用的间隔——足够应对大多数风险场景,同时保持较低的负载
Periodic 模式的一个工程挑战是时钟同步——如果 10000 台设备都在每分钟的第 0 秒触发重新评估,策略引擎会在那一刻承受全部的负载。实践中的做法是为每台设备分配一个随机的评估偏移量(stagger),把负载平滑到整个周期内。
2.3 Request-granular 模式(短有效期凭据)
证书有效期设为极短(如 1 小时或 5 分钟),每次证书续期时必须重新走完整的姿态检查。SPIRE 的默认 SVID TTL 就是 1 小时——这本质上就是一种 request-granular 的持续验证,以证书生命周期为原子单位。
但短有效期证书不等于真正的”每一个请求都验证”——证书在有效期内的所有请求都被视为”已认证”。Google 的做法是将访问代理的 Session Cookie 有效期设为短于 JWT 证书有效期——用户在操作过程中如果设备姿态变化,访问代理在下一个请求的 Cookie 验证中就能发现。
三、会话降级的工程机制
当信任分数从高降到低,系统不能简单地”关掉所有连接”——那会导致用户的工作被中断。降级有三种策略:
3.1 权限衰减(Authorization Attenuation)
用户的 Session 仍然有效,但访问的权限被缩减。原先可以访问生产数据库,降级后只能访问开发数据库。原先可以 POST/PUT/DELETE,降级后只能 GET。
实现方式:JWT 中编码的 scope 或
permissions 在续期时按新策略重新签发。旧的 JWT
仍然有效但不包含危险操作——因为这些操作在策略引擎中被拒绝。
3.2 Step-up 认证
当分数下降但尚未到需要完全撤销的程度时,要求用户完成额外的认证因素以恢复分数。例如: - 设备补丁落后 → 用户登录后看到”因为你的设备需要更新,访问此资源之前需要输入 FIDO2 安全密钥” - IP 地址变化 → “检测到你的位置变化,请输入手机验证码” - 非工作时间访问高敏感资源 → 同样触发 Step-up
Step-up 认证对用户体验的影响大——如果过于频繁触发,用户会产生”安全疲劳”,开始寻找绕过方法。
3.3 会话撤销(Session Revocation)
当信任分数降到阈值以下——设备被报告为被盗、用户密码被重置、IdP
发出 session-revoked 事件——PDP 通知所有 PEP
撤销该用户的全部活跃会话。
实现方式:JWT 无法被”撤销”(因为它是自包含的),所以撤销的实现依赖于: - JWT 短有效期(5-15 分钟)限制泄露窗口 - Token Introspection(RFC 7662)——资源服务器在每次请求中向 IdP 查询 token 是否仍有效 - 引用型令牌(Reference Token)——不发放 JWT,发放不透明标识符,资源服务器每次都查 IdP
引用型令牌给出了最强的撤销保证(即时生效),但引入了每次请求的额外网络延迟。这是安全性和性能之间的典型零和博弈。
四、信号源的不对等性
持续验证依赖的四种信号源的更新频率和可靠性完全不同:
| 信号源 | 更新频率 | 延迟 | 可靠性 | 可伪造性 |
|---|---|---|---|---|
| 设备姿态(TPM/osquery/MDM) | 分钟级 | 信号采集窗口 | 高(TPM 硬件级) | 低(需攻破 TPM 或 osquery) |
| 网络位置(IP/GeoIP) | 每次请求 | 即时 | 中(VPN 可能误判) | 中(Tor/VPN/代理) |
| 用户行为基线 | 天级 | 基线构建延迟 | 中(需要大量数据) | 中(模仿行为模式) |
| 时间上下文 | 每次请求 | 即时 | 高 | 极低 |
这些信号的不对等性意味着持续验证不能”等所有信号就绪后再做决策”——因为用户行为基线可能还没算出来。实际工程中,持续验证策略是分层级的:
- 第一层(即时可靠):设备证书存在 + Session 有效 → 基础访问
- 第二层(分钟级):设备合规 + 无威胁情报告警 → 敏感资源访问
- 第三层(天级):行为基线正常 + 无异常模式 → 高敏感资源访问(加权到信任分数中)
五、与 IAM 会话管理的衔接
本站 Session、Refresh Token 与吊销体系 讨论的是”令牌本身的生命周期管理”。持续验证是在这个基础上的叠加——它不仅关心”令牌是否过期”,还关心”令牌的有效性是否应该因为外部信号变化而被提前终止”。
具体衔接: - Refresh Token Rotation(每用一次 Refresh
Token 就签发新的 Refresh
Token)与持续验证结合:在刷新时重新评估风险分数 - Token
Introspection 端点在持续验证中可以整合设备姿态检查——不仅返回
active: true/false,还返回
risk_level 和 allowed_scopes -
Session 吊销事件(session-revoked)通过 CAEP
事件传播到所有依赖该 Session 的资源服务器
下一篇:零信任策略引擎:OPA/Rego 与 Cedar 在 ZT 中的落地。
参考资料
- OpenID Foundation. Shared Signals Framework 1.0. https://openid.net/specs/openid-sharedsignals-framework-1_0.html
- OpenID Foundation. Continuous Access Evaluation Profile 1.0 (draft 05). https://openid.net/specs/openid-caep-1_0-05.html
- IETF. Security Event Token (SET). RFC 8417.
- IETF. Push-Based SET Delivery Using HTTP. RFC 8935.
- IETF. Subject Identifiers for Security Event Tokens. RFC 9493.
- IETF. Token Introspection. RFC 7662.
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【身份与访问控制工程】风险感知认证:设备信任、异常登录与挑战升级
MFA 是固定策略——启用后每个人每次登录都要输入验证码。风险感知认证(Adaptive/Risk-based Authentication)让认证强度随风险动态调整:从新设备、新位置触发额外验证,到持续的行为分析和会话风险评估。本文拆解风险引擎的信号模型、设备指纹的实现选型、挑战升级的 UX 设计,以及硅谷大厂的实践对比。
零信任安全架构深度系列
零信任是 IAM 的自然延伸——当身份变成新边界,VPN 的'拨入即信任'模型必须被'永不信任、始终验证'取代。本系列从 NIST SP 800-207 规范、Google BeyondCorp 六篇论文、SPIFFE/SPIRE 联邦到微分段、持续验证、ZTNA 和零信任迁移的工程策略,系统拆解零信任的每一种组件和每一步实施。
【身份与访问控制工程】IAM 全景:为什么这是高价值赛道
从 2020 年 SolarWinds 到 2024 年 Okta 支持系统泄露,身份基础设施的安全失败反复证明一件事:IAM 不是 IT 支撑系统,而是安全架构的承重墙。本文建立现代 IAM 的全景地图——从认证协议、令牌体系、权限模型到身份治理与平台选型,给出 5 个贯穿全系列的核心问题。
【身份与访问控制工程】服务身份:mTLS、SPIFFE/SPIRE 与 Workload Identity
前 9 篇讨论的都是'人'的身份——用户怎么登录、怎么验证。但微服务世界中,80% 的 API 调用是服务之间的。服务身份(Workload Identity)是整个 IAM 体系的另一半:mTLS 解决'传输层你是谁',SPIFFE/SPIRE 解决'在平台层你是谁且怎么证明',JWT Profile for OAuth 解决'我怎么拿到一个服务身份的 Token'。本文从这三条线拆解服务身份的工程实现。