easyai-ai-gateway/docs/security/ssf-session-revocation.md
chengcheng 5b8178b703 docs(identity): 记录统一认证恢复与重配边界
补充管理员从 Active 禁用到新接入码重配的标准流程,说明 credentials_saved 恢复、SSF 凭据交接、持久清理、Break-glass 与动态 Origin 边界,并明确历史 Revision 仅作审计、当前不支持直接回滚。
2026-07-17 18:32:04 +08:00

81 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SSF/CAEP 实时会话撤销运行手册
Gateway 可选接收 Auth Center 通过 RFC 8935 Push 投递的 RFC 8417 Security Event Token并处理 OpenID CAEP `session-revoked`。能力由 Active Identity Revision 控制;没有选择会话撤销时保持原有 OIDC、BFF、API Key 和 Legacy JWT 行为。
## 用户接入流程
首次接入只执行两端各一次操作:
1. 在认证中心 Application 的通用“应用接入”向导选择“SSF 会话撤销”。能力依赖会自动包含 Token Introspection 和机器调用;预览确认后创建或复用同用途服务客户端。
2. 在 Gateway“系统设置 → 统一认证”填写一次性接入码和 Gateway 地址。Gateway 自动领取 Manifest 与机器凭据,并在验证候选 Runtime 时建立 SSF Stream。
Gateway 后端先把 Machine Secret 写入 SecretStore随后自动读取 Discovery、生成并托管 256 bit Push Bearer、创建 paused Stream、完成 Verification、首次启用 Stream并进入 360 秒 RFC 7662 bootstrap。接入码和 Machine Secret 只从浏览器提交到 Gateway 服务端Push Bearer 和 Secret 引用始终不可见,数据库、响应和日志不保存明文。管理员不编辑 Secret 文件,也不需要重启 Gateway。
环境前置配置只保留 SecretStore 与运行时基础设施参数:
- `IDENTITY_SECRET_STORE`、`IDENTITY_SECRET_DIR`,或对应 Kubernetes SecretStore 参数;
- `IDENTITY_SECURITY_EVENTS_HEARTBEAT_INTERVAL_SECONDS`、`IDENTITY_SECURITY_EVENTS_STALE_AFTER_SECONDS` 和 `IDENTITY_SECURITY_EVENTS_CLOCK_SKEW_SECONDS`
Issuer、Tenant、Gateway 公网地址和机器 Client 均来自 Active Revision不读取旧 OIDC 环境变量。OIDC fallback、SSF 管理 Token 和 Verification 共用一份托管机器凭据,重启后继续生效。
第一版一个 Gateway 部署只允许一个认证中心连接。下游业务服务无需接入 SSF。
## SecretStore
本地和 Docker 使用 `file` 驱动。服务自动创建目录并强制目录 `0700`、文件 `0600`Docker Compose 将目录放在持久化 `api_data` 卷中。用户不写入任何 Secret 文件。
Kubernetes 使用 `kubernetes` 驱动和一个部署时预创建的空 Secret
```text
IDENTITY_SECRET_STORE=kubernetes
IDENTITY_KUBERNETES_NAMESPACE=easyai
IDENTITY_KUBERNETES_SECRET_NAME=easyai-gateway-identity
```
参考清单见 `deploy/kubernetes/security-events-secret-rbac.yaml`。ServiceAccount 只能对这个固定 Secret 执行 `get/update/patch`,不能创建、删除或读取其他 Secret。数据库、API、浏览器、日志和审计只保存或展示非敏感连接元数据。
## 动态运行与状态
Receiver 路由始终注册:没有连接时返回无敏感信息的 `404`;存在连接但凭据丢失时返回 `503` 并进入 `introspection_fallback`。OIDC Evaluator 始终挂载但在无连接时无副作用。
连接生命周期包括 `connecting`、`verifying`、`bootstrap`、`enabled`、`degraded`、`rotating`、`disconnect_pending` 和 `retiring`。健康时每 60 秒一次 Verification不随业务请求 QPS 增长180 秒无匹配 Verification 时切换 RFC 7662。内省也不可用时 OIDC Fail ClosedAPI Key 继续工作。
Verification 成功后仅在首次连接和主动轮换时自动启用 Stream。认证中心管理员之后手工暂停或禁用 StreamGateway 的“重新验证”只检查链路,不会擅自恢复远端状态。
## 轮换与断开
“轮换凭据”由 Gateway 自动完成:生成 next、Receiver 同时接受 current/next、暂停并更新远端 Stream、Verification、重新启用、保留旧值至少 180 秒,最后提升 next 并删除旧值。中途失败保留两个凭据和 `rotating` 状态,可安全重试。
“断开连接”先删除远端 Stream再进入至少 360 秒 `retiring`,期间继续应用撤销水位和 RFC 7662避免旧 Token 因关闭功能重新有效。远端不可用时保持 `disconnect_pending` 并指数退避重试;不会提前删除 Push Secret。收据、水位和脱敏审计数据不会清表。
禁用统一认证也遵循相同顺序:若 Active Revision 开启了 SSF只有远端 Stream 已删除且本地连接进入 `retiring`Active 才会变为 `superseded`BFF Session 才会清理。`disconnect_pending` 时禁用返回明确的 retirement pending数据库 Active 保持不变;即使完整 OIDC Runtime 已 fail closedGateway 也会只重建 SSF 管理面完成断开,不要求 Discovery、JIT 或 BFF 先恢复。`retiring` 最终清理由服务生命周期 Worker 托管Gateway 重启后仍会继续。
## 旧连接交接与配对恢复
Pairing 停在 `credentials_saved`Manifest 和机器凭据已经保存,但 Stream 可能仍在创建、验证或退役:
- 暂时性 Discovery/Transmitter 错误和 `security_event_retirement_pending` 会自动重试。
- `security_event_connection_conflict` 只允许通过当前 Pairing 的“安全退役现有连接”处理。
- `security_event_credential_handoff_unsafe` 表示旧连接与新 Issuer/Client 不匹配;系统不会把旧凭据发往新端点。管理员应在原配置下断开,或放弃当前 Pairing。
- 放弃后等待 `cleanup_status=completed`,再从 Auth Center 生成新接入码重新配对。
若旧连接与新配置具备可证明的同一管理边界Gateway 仍不会直接覆盖 S1先用新机器凭据 S2 从新 OIDC Issuer 取得管理 Token再经过认证读取旧 Transmitter存在 Stream 时精确校验 Stream ID、Issuer、Receiver 和 Audience。证明成功后才原子切换凭据引用并把 S1 交给持久清理队列;失败时 S1/S2 引用和远端连接都保持不变。
所有写管理接口要求 Gateway `Manager` 权限、`Idempotency-Key` 和 `If-Match`
```text
GET /api/admin/system/identity/security-events/connection
PUT /api/admin/system/identity/security-events/connection
POST /api/admin/system/identity/security-events/connection/verify
POST /api/admin/system/identity/security-events/connection/rotate-credential
DELETE /api/admin/system/identity/security-events/connection
```
## 监控、退役与验收
`GET /metrics` 输出接收结果、删除 Session 数、水位拒绝数、Verification 年龄、健康模式、内省结果、JWKS 失败和处理延迟。至少告警 Verification age 超过 120 秒、fallback 超过 5 分钟、内省失败、SET 拒绝增长以及撤销 P99 超过 3 秒。日志只记录脱敏 Trace/Audit ID 和错误类别。
当前禁止直接激活历史 `superseded` Revision因为 Auth Center 会复用并修改远端 OAuth/SSF 资源,旧快照无法证明仍然匹配。恢复配置时先通过 Gateway 安全禁用并退役 Stream再使用 Auth Center 新接入码重新配对保留迁移表、水位和审计。Legacy HS256 Token 和 API Key 不在本协议撤销范围内。
真实链路只使用明确标记为测试用途的 Application并且必须在自动化测试后执行。报告包含脱敏 Trace、Claims、截图、Audit ID、投递延迟、fallback 和恢复证据;需要人工或第三方操作时记录 `SKIPPED_HUMAN_OR_THIRD_PARTY_REQUIRED`