Skip to content

feat: add qianxin-tianyan-platform service package#214

Open
K6gg wants to merge 8 commits into
chaitin:mainfrom
K6gg:feat/add-tianyan-platform-service
Open

feat: add qianxin-tianyan-platform service package#214
K6gg wants to merge 8 commits into
chaitin:mainfrom
K6gg:feat/add-tianyan-platform-service

Conversation

@K6gg

@K6gg K6gg commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

变更概述

  • 新增基于 @chaitin-ai/octobus-sdk 开发的奇安信天眼威胁监测与分析系统 Service Package。
  • 实现免密 SSO 三步认证(login_key → access_token → csrf_token + Cookie)、告警 IP 参数 gzip+base64 编码及 gRPC 错误映射。
  • 提供告警管理、日志检索、资产感知、威胁狩猎、白名单封禁及主机失陷查询共 9 个能力(7 读 2 写)。
  • 将该服务注册到多服务调度器及 npm 软件包中。

接入设备信息

  • 厂商:奇安信(QianXin)
  • 产品:天眼威胁监测与分析系统(TianYan Analysis Platform)
  • 已验证版本:V30140.sp2 / V4.0.12.0
  • 认证方式:免密 SSO 三步认证(login_key → access_token → csrf_token + Cookie)
  • 运行模式:常驻运行
  • 操作类型:读 7 个 / 写 2 个(UpdateAlarmStatus / AddFlowWhitelist)

已实现方法

  • ListAlarms:查询威胁告警列表,支持按级别/时间/IP/IOC/处置状态多条件过滤,IP 参数自动 gzip+base64 编码
  • UpdateAlarmStatus:批量更新告警处置状态(0=未处置 1=已处置 6=忽略 7=误报)
  • SearchLogs:原始日志检索,支持关键词及 SPL 过滤,返回命中 _source 记录列表及字段元数据
  • SPLSearch:SPL 专家模式检索,返回结构化字段列表与结果行
  • ListAssets:查询资产列表,支持按 IP/名称/分组/端口/类型过滤
  • ListVulnerabilities:查询资产漏洞列表,支持按 IP/名称/威胁级别过滤
  • ThreatHuntSearch:威胁狩猎,以 IP/域名/URL/MD5/邮箱为关键词构建威胁关联图(nodes + links)
  • AddFlowWhitelist:将 IP/IOC/威胁名/规则链加入流量传感器白名单
  • GetCompromisedHostStatus:查询主机失陷状态,返回告警数、风险值、IOC 命中数

本地验证

cd services
npm run validate -- --service-dir qianxin__tianyan-platform
npm test -- --service-dir qianxin__tianyan-platform
npm test -- --service-dir qianxin__tianyan-platform --coverage
npm run pack:check

验证结果:

  • 133 项测试全部通过
  • SDK 严格校验通过,共注册 9 个一元 RPC 方法
  • npm 打包预检通过

真实设备联调验证

本地接口跑通,等真实设备严重

config.json
{
"restBaseUrl": "https://你的天眼地址",
"timeoutMs": 15000,
"tlsInsecureSkipVerify": true
}

secret.json
{
"login_key": "从后台拿到的免密密钥",
"username": "tapadmin"
}

octobus call --service qianxin-tianyan-platform
--config config.json
--secret secret.json
list-alarms
--level 3
--page_size 10


等待真实设备验证,需要的9个接口

┌─────────────────────────────┬──────────────────────────────────┐
│ 命令 │ 说明 │
├─────────────────────────────┼──────────────────────────────────┤
│ list-alarms │ 查告警列表,过滤级别/时间/IP/IOC │
├─────────────────────────────┼──────────────────────────────────┤
│ update-alarm-status │ 更新告警处置状态 │
├─────────────────────────────┼──────────────────────────────────┤
│ search-logs │ 日志关键词搜索 │
├─────────────────────────────┼──────────────────────────────────┤
│ spl-search │ SPL 专家语句查询 │
├─────────────────────────────┼──────────────────────────────────┤
│ list-assets │ 资产查询 │
├─────────────────────────────┼──────────────────────────────────┤
│ list-vulnerabilities │ 漏洞列表 │
├─────────────────────────────┼──────────────────────────────────┤
│ threat-hunt-search │ IOC 威胁溯源图 │
├─────────────────────────────┼──────────────────────────────────┤
│ add-flow-whitelist │ 添加流量白名单 │
├─────────────────────────────┼──────────────────────────────────┤
│ get-compromised-host-status │ 查主机失陷状态 │
└─────────────────────────────┴──────────────────────────────────┘

联调验证截图

image image 79f81224e05789c91e88466de4c4d1d8 6504e42c5cb8e8d3a2838697a92752e6 f50859a3cf88abdfb02a6a74dcde75bb 095251fe1c76da34a341811bfc694c52 477933b8d129ec67aa8f79c09201573a 10d2f1c34dc90312f7d74aa915adcfea 17e3afce91a86f0d2d881f7656485a63 dd1b90b8fab71946a941b831bf478d45

安全说明

  • 代码、测试和文档中未提交真实设备地址、login_key、access_token、csrf_token 或 Cookie。
  • 联调截图使用经过授权的非生产测试数据,不包含认证凭据或生产环境密钥。
  • 写操作(UpdateAlarmStatus / AddFlowWhitelist)仅对测试数据执行,不影响生产环境。
  • tlsInsecureSkipVerify 默认关闭,README 中已注明仅建议在可信网络环境中使用。

已知限制

  1. 每次 RPC 调用重新走三步认证获取 csrf_token,无会话缓存;高频调用场景建议在调用方做速率控制。
  2. SearchLogs / SPLSearch 命中结果量大时建议通过 limit 分批拉取,本包不做自动翻页。
  3. AddFlowWhitelist 仅支持新增流量传感器白名单;删除/编辑白名单、文件/邮件白名单未纳入本包。
  4. 威胁狩猎关联图(ThreatHuntSearch)仅返回第一层关联节点;扩展节点接口未纳入本包。
  5. 已提取全量 600+ API 接口,本包当前实现其中 9 个最核心接口。

@innomentats

Copy link
Copy Markdown
Member

Review 阻塞:这个 PR 标题是新增 qianxin__tianyan-platform,但 diff 同时带入了 qianxin__fw-secgate3600-policyqianxin__vs-secvss3600 两个服务包,以及多个 bin 注册改动。请拆分为独立 PR,或移除与 TianYan 服务无关的文件;这样测试和截图才能对应到单一 service package 的正确性证明。

@innomentats

Copy link
Copy Markdown
Member

提供的截图和日志,都不是对 octobus 做的测试?

@innomentats
innomentats marked this pull request as draft June 26, 2026 11:43
@K6gg
K6gg force-pushed the feat/add-tianyan-platform-service branch from be815c7 to 6c356c9 Compare June 30, 2026 09:40
@monkeyscan

monkeyscan Bot commented Jun 30, 2026

Copy link
Copy Markdown

PR Title: feat: add qianxin-tianyan-platform service package

Commit: 6c356c9

本次 PR 新增奇安信天眼平台(QIANXIN TianYan)OctoBus 服务包,包含:

  1. 9 个 gRPC 方法(ListAlarms、UpdateAlarmStatus、SearchLogs、SPLSearch、ListAssets、ListVulnerabilities、ThreatHuntSearch、AddFlowWhitelist、GetCompromisedHostStatus)
  2. 3 步免密 SSO 认证流程(login_key → access_token → csrf_token + session cookie)
  3. 配套 proto、schema、测试(1084 行)及 API 参考文档

核心实现 qianxin-tianyan-platform.js 约 622 行,采用 Node.js native fetch 调用上游 REST API。整体结构清晰,测试覆盖较广,但在认证会话获取环节存在两个高置信度 bug:

  • Set-Cookie 读取方式与 Node.js 18+ undici 不兼容,headers.get('set-cookie') 恒返回 null,导致 session cookie 无法提取
  • 认证第二步(GET /skyeye/v1/admin/auth?token=...)未检查 HTTP 状态码,非 2xx 响应会抛出误导性的 "csrf-token not found" 错误

另外测试中的 mock Headers 直接实现了 get('set-cookie') 返回字符串,未能暴露上述真实 fetch 行为差异,存在测试盲区。

Comment thread services/qianxin__tianyan-platform/src/qianxin-tianyan-platform.js
Comment thread services/qianxin__tianyan-platform/src/qianxin-tianyan-platform.js Outdated
@K6gg
K6gg marked this pull request as ready for review July 1, 2026 05:03
@innomentats

Copy link
Copy Markdown
Member

@monkeyscan review 一下这个 pr

@monkeyscan

monkeyscan Bot commented Jul 1, 2026

Copy link
Copy Markdown

PR Title: feat: add qianxin-tianyan-platform service package

Commit: 550511b

本次 PR 新增奇安信天眼分析平台 OctoBus 服务包,包含9个RPC方法及配套的三步认证流程(login_key派生→access_token→session cookie/CSRF token)。主实现文件约622行,测试约1084行。

已确认两个历史发现仍然有效:

  1. Node.js fetch 下 headers.get('set-cookie') 恒返回 null,导致 session cookie 丢失,认证流程在真实环境失效;
  2. 认证第二步未校验 HTTP 状态码,错误响应会抛出误导性异常。

本次审查新增两个发现:

  1. 【test_gap/high】测试 mock 仅实现 headers.get() 且人为返回 set-cookie 字符串,完全未模拟 Node.js 18+ fetch 的 getSetCookie() 行为,导致上述生产 bug 无法被回归测试捕获,且修复后会破坏测试;
  2. 【reliability/medium】getSession 中 Set-Cookie 解析按逗号分割,对含 Expires 等属性的 cookie 会解析错误,若修复主 bug 时未采用 getSetCookie() 而改用字符串拼接,该隐藏 bug 会被激活。

其余代码结构清晰,proto/schema/service.json 定义一致,各 handler 参数校验与错误映射完整。建议优先修复认证 cookie 获取问题并同步更新测试 mock。

@chaitin chaitin deleted a comment from monkeyscan Bot Jul 1, 2026
Comment thread services/qianxin__tianyan-platform/src/qianxin-tianyan-platform.js Outdated
…2 status check

- Replace headers.get('set-cookie') with headers.getSetCookie() to correctly
  retrieve Set-Cookie headers in Node.js 18+ where the Fetch spec forbids
  reading set-cookie via get()
- Parse each cookie individually from the array instead of splitting on commas,
  avoiding breakage when cookie attributes contain commas (e.g. Expires)
- Add HTTP status validation for auth step2 so non-2xx responses throw a clear
  PERMISSION_DENIED or UNAVAILABLE error instead of a misleading csrf-token error
- Update test mock to implement getSetCookie() and use array format for multiple
  cookies; add two new tests covering step2 HTTP error scenarios
@monkeyscan

monkeyscan Bot commented Jul 3, 2026

Copy link
Copy Markdown

PR Title: feat: add qianxin-tianyan-platform service package

Commit: f70b6c0

本次修复了奇安信天眼平台认证流程中的三个问题:1)在认证第二步添加了 HTTP 状态码检查,使 401/403 返回 PERMISSION_DENIED,其他非 2xx 返回 UNAVAILABLE,避免了错误响应被错误解析为 HTML 导致误导性异常;2)将 Cookie 读取方式从 headers.get('set-cookie') 改为 headers.getSetCookie(),解决了 Node.js fetch 下 get('set-cookie') 始终返回 null 导致 cookie 丢失的问题;3)通过 getSetCookie 返回数组替代逗号分割,消除了 Set-Cookie 中 Expires 等属性含逗号导致的解析错误。同时补充了对应的单元测试覆盖 403 和 500 错误场景。整体评估为可靠性修复,改动合理且测试充分。

@K6gg

K6gg commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

@innomentats 已补充 OctoBus Connect 真实设备测试截图,请再看一下

@eetoc

eetoc commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

修下ci

@monkeyscan

monkeyscan Bot commented Jul 9, 2026

Copy link
Copy Markdown

MonkeyScan 正在评审本次 push 新增到 PR 的变更,完成后会更新到本评论中,请稍后刷新查看。

@K6gg

K6gg commented Jul 10, 2026

Copy link
Copy Markdown
Contributor Author

@eetoc 请评审

@K6gg

K6gg commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

@innomentats 请查查并合并

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.

3 participants