Skip to content

feat: PO+IAM OR 鉴权框架落地 — 日志检索/提取/客户端日志三类能力 --story=135788940 - #11585

Open
Golden-rc wants to merge 8 commits into
TencentBlueKing:masterfrom
Golden-rc:eurekajin
Open

feat: PO+IAM OR 鉴权框架落地 — 日志检索/提取/客户端日志三类能力 --story=135788940#11585
Golden-rc wants to merge 8 commits into
TencentBlueKing:masterfrom
Golden-rc:eurekajin

Conversation

@Golden-rc

Copy link
Copy Markdown

背景

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 / DecisionResult dataclass + 三套 Decision 类(日志检索 legacy+IAM、日志提取 legacy+strategy、客户端日志 legacy+VIEW_CLIENT_LOG),三类能力共用同一套 OR 决策矩阵(4 正常+3 异常=7 组合)
  • 代理层 views.pydispatch_external_proxytarget_action_id 分流 OR 决策;external() PO 无记录时 IAM 兜底;dispatch_list_user_spaces PO+IAM 空间并集;列表接口 legacy ∪ IAM batch 资源过滤
  • 灰度开关 EXTERNAL_PERMISSION_OR_DECISION:默认 off,支持 on/off/debug+白名单/黑名单,关闭后回退 legacy 逻辑
  • IAM 权限模型:新增 VIEW_CLIENT_LOG / CREATE_CLIENT_LOG_TASK / DOWNLOAD_CLIENT_LOG action + iam_migrate_view_client_log 迁移命令(--dry-run 差异核对 + 幂等批量 + 覆盖率校验)
  • 审计埋点decision_source(legacy/iam/both/none)+ decision_warning(双侧差异标记)落地代理层日志
  • 日志提取ExplorerHandlerget_request_external_username()Strategies.user_listTasksHandler 按外部用户做任务隔离
  • 前端:内部权限申请默认带上 VIEW_CLIENT_LOG
  • 安全加固:PO 代理场景强制外部用户脱敏(不依赖 authorizer 的 is_superuser);脱敏白名单以外部用户身份判断;TAPD3 decide() 对齐 TAPD4/5 加 source="error" → allowed=None

测试

11 个测试文件约 4,000 行,169 例全部通过:L1 决策单测 × 3 + L2 ViewSet 权限接线 × 2 + L3 代理链路 × 4 + 灰度开关 × 1 + 两层门禁集成 × 1

影响面

仅影响 dispatch_external_proxy 代理层(PO 外部入口),内部用户和接口不受影响。灰度默认 off,上线后行为与当前完全一致。三种能力均保留 legacy 分支,关闭灰度可回滚。

- 新增 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 全部通过
@tencentblueking-adm

tencentblueking-adm commented Jul 20, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@github-actions

Copy link
Copy Markdown

请在 PR 中添加类型标签,例如:fixfeatdocsstylerefactortestchoremerge, perf

@github-actions

Copy link
Copy Markdown

请在 PR 中添加项目标签,例如:project/monitorproject/apmproject/logproject/publicproject/aiops

@github-actions

Copy link
Copy Markdown

请在 PR 中添加类型标签,例如:fixfeatdocsstylerefactortestchoremerge, perf

@github-actions

Copy link
Copy Markdown

请在 PR 中添加项目标签,例如:project/monitorproject/apmproject/logproject/publicproject/aiops

@github-actions

Copy link
Copy Markdown

请在 PR 中添加项目标签,例如:project/monitorproject/apmproject/logproject/publicproject/aiops

@github-actions

Copy link
Copy Markdown

请在 PR 中添加类型标签,例如:fixfeatdocsstylerefactortestchoremerge, perf

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants