feat: PO+IAM OR 鉴权框架落地 — 日志检索/提取/客户端日志三类能力 --story=135788940 - #11585
Open
Golden-rc wants to merge 8 commits into
Open
feat: PO+IAM OR 鉴权框架落地 — 日志检索/提取/客户端日志三类能力 --story=135788940#11585Golden-rc wants to merge 8 commits into
Golden-rc wants to merge 8 commits into
Conversation
- 新增 ExternalLogSearchPermissionDecision OR 决策框架,支持 legacy/IAM 双通道鉴权并集放行 - dispatch_external_proxy 接入 OR 决策,非检索入口(上下文/实时日志/字段分析)不走 OR 决策 - 新增 EXTERNAL_PERMISSION_OR_DECISION 灰度开关(off/on/debug+空间名单) - 三身份分离: authorization_subject/execution_user/audit_user - 88条单元+集成测试覆盖全部验收标准
- 新增 ExternalLogExtractPermissionDecision 决策类,legacy_check(PO授权有效期)+ strategy_check(策略表user_list)OR 决策 - views.py dispatch_external_proxy LOG_EXTRACT 分支接入 OR 决策路径 - extract handler 三身份分离:authorization_subject/audit_user 恒为外部用户,execution_user 为 authorizer - 三层测试覆盖:L1 决策单元测试、L2 鉴权单元测试、L3 E2E 矩阵测试(12 场景)
将客户端日志从 VIEW_BUSINESS 粗粒度权限拆分为三个独立 IAM action: I. 新增 IAM Action - VIEW_CLIENT_LOG: 客户端日志查看(业务维度,无资源级颗粒度) - CREATE_CLIENT_LOG_TASK: 客户端日志采集任务创建 - DOWNLOAD_CLIENT_LOG: 客户端日志下载 II. 存量平滑迁移 - iam_migrate_view_client_log: 自动将 VIEW_BUSINESS 存量策略照抄为 VIEW_CLIENT_LOG - 支持 --dry-run / --revoke,天然幂等可重跑 - 执行顺序: 注册 action → 批量授权 → 核对覆盖率 → 切换鉴权点 III. 鉴权决策 - ExternalClientLogPermissionDecision: legacy(PO) OR iam(VIEW_CLIENT_LOG) - dispatch_external_proxy 中新增 client_log 三路分支 - 身份三分离: authorization_subject=external_user, execution_user=authorizer - IAM 异常 fail-soft 降级,不产生断权 IV. ViewSet 层权限 - TGPATaskViewSet: create→CREATE_CLIENT_LOG_TASK, download→DOWNLOAD_CLIENT_LOG, 其余→VIEW_CLIENT_LOG - TGPAReportViewSet: 全部→VIEW_CLIENT_LOG V. 前端 - authority-map: 新增 VIEW_CLIENT_LOG_AUTH - 业务权限申请入口默认带上 VIEW_CLIENT_LOG,避免二次申请断权 VI. 测试 - 策略决策单测、集成测试、E2E 测试、ViewSet 权限单测
生产修复: - TencentBlueKing#2 脱敏绕过: search_views.py 外部用户强制脱敏,不依赖 authorizer.is_superuser - TencentBlueKing#3 脱敏绕过: search_handlers_esquery.py 脱敏白名单以 external_user 身份判断 - TencentBlueKing#6 decide() error防御: TAPD3 decide() 对齐 TAPD4/5,source=error 时重置 allowed=None 测试修复: - I1: T4/T7 异常场景 CheckResult(allowed=True) → allowed=None (6处) - I8: T3 假阳性断言改为 Permission.assert_not_called() - GAP2: 新增 IAM socket.timeout 场景测试 - GAP8: decide() error防御反向验证(修复后由 expectedFailure → 正常通过) 回归: 169/169 全部通过
|
请在 PR 中添加类型标签,例如: |
|
请在 PR 中添加项目标签,例如: |
|
请在 PR 中添加类型标签,例如: |
|
请在 PR 中添加项目标签,例如: |
|
请在 PR 中添加项目标签,例如: |
|
请在 PR 中添加类型标签,例如: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
TAPD: PO+IAM OR 鉴权框架落地(TAPD0~TAPD5)
日志平台对 PO Open API 开放了日志检索、日志提取、客户端日志(TGPA) 三类能力。现有鉴权链路完全依赖 ExternalPermission 旧权限模型(运维在 ITSM 审批后手动授权),无法对接蓝鲸 IAM 权限中心做细粒度审批与自动回收。
本次落地 legacy(PO) OR IAM 统一决策框架:外部用户任意一侧有授权即可放行,三类能力共用一套 CheckResult/DecisionResult 契约,按空间灰度启用,出现异常可回滚关闭。
改动
日志平台对 PO Open API 开放了日志检索、日志提取、客户端日志(TGPA) 三类能力。现有鉴权链路完全依赖
ExternalPermission旧权限模型(ITSM 审批手动授权),无法对接 IAM 权限中心做细粒度授权。本次在
dispatch_external_proxy代理层落地 legacy(PO) OR IAM 统一决策框架:external_permission_decision.py(新增):CheckResult/DecisionResultdataclass + 三套 Decision 类(日志检索 legacy+IAM、日志提取 legacy+strategy、客户端日志 legacy+VIEW_CLIENT_LOG),三类能力共用同一套 OR 决策矩阵(4 正常+3 异常=7 组合)views.py:dispatch_external_proxy按target_action_id分流 OR 决策;external()PO 无记录时 IAM 兜底;dispatch_list_user_spacesPO+IAM 空间并集;列表接口 legacy ∪ IAM batch 资源过滤EXTERNAL_PERMISSION_OR_DECISION:默认 off,支持 on/off/debug+白名单/黑名单,关闭后回退 legacy 逻辑VIEW_CLIENT_LOG/CREATE_CLIENT_LOG_TASK/DOWNLOAD_CLIENT_LOGaction +iam_migrate_view_client_log迁移命令(--dry-run差异核对 + 幂等批量 + 覆盖率校验)decision_source(legacy/iam/both/none)+decision_warning(双侧差异标记)落地代理层日志ExplorerHandler用get_request_external_username()查Strategies.user_list;TasksHandler按外部用户做任务隔离VIEW_CLIENT_LOGsource="error" → allowed=None测试
11 个测试文件约 4,000 行,169 例全部通过:L1 决策单测 × 3 + L2 ViewSet 权限接线 × 2 + L3 代理链路 × 4 + 灰度开关 × 1 + 两层门禁集成 × 1
影响面
仅影响
dispatch_external_proxy代理层(PO 外部入口),内部用户和接口不受影响。灰度默认 off,上线后行为与当前完全一致。三种能力均保留 legacy 分支,关闭灰度可回滚。