Files

694 lines
34 KiB
Markdown
Raw Permalink Normal View History

智能安全运营平台
设备API接口数据采集功能模块
开发设计说明
文档版本:V1.0.0
文档密级:内部
2026年08月24日
文档修订记录
[TABLE]
| 版本号 | 修订日期 | 修订内容 | 修订人 |
| V1.0.0 | 2026-08-24 | 初始版本,创建文档 | |
| | | | |
| | | | |
[/TABLE]
# 1 概述
1.1 编写目的
本文档描述智能安全运营平台"设备API接口数据采集功能模块"的需求与开发设计,涵盖从奇安信天眼分析平台、微步在线威胁感知平台、深信服XDR平台三类安全设备通过API接口定时采集安全数据(Web访问日志、告警日志、攻击流量、日志流量)的功能需求、非功能性需求、接口规范及详细设计方案。
本文档的预期读者为:项目开发人员、系统测试人员、项目管理人员及运维人员。
1.2 系统架构
设备API接口数据采集功能模块部署于智能安全运营平台侧,采用"定时拉取—字段映射—标准化数据格式—写入Kafka"的处理模式,整体数据流如下:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 天眼平台 │ │ 微步平台 │ │ 深信服XDR│
└────┬────┘ └────┬────┘ └─── ─┬────┘
│ HTTPS API │ │
└──────┬───────┴──────┬──────┘
▼ ▼
┌────────────────────────────┐
│ 设备API数据采集模块 │
│ (定时调度/认证/分页/映射) │
└────────────┬───────────────┘
▼
┌────────────┐ ┌──────┐
│ Kafka │───▶│ Redis │(断点/Token缓存)
└─────┬──────┘ └──────┘
▼
syslog-consumer-rule 消费处理(泛化规则)
采集源汇总:共3个设备平台、4种数据类型、2种认证机制(免密登录/HMAC签名)、3种API协议。
1.3 适用范围
本文档适用于智能安全运营平台设备API接口数据采集功能模块的设计、开发、测试与验收工作。
1.4 术语与缩略语
[TABLE]
| 术语/缩略语 | 全称 | 说明 |
| 天眼 | 奇安信威胁监测与分析系统 | 奇安信天眼分析平台,提供日志检索与告警API |
| 微步 | 微步在线威胁感知平台(TDP) | 提供攻击流量与日志流量查询API |
| XDR | Extended Detection and Response | 深信服扩展检测与响应平台,提供开放API |
| csrf_token | Cross-Site Request Forgery Token | 天眼免密登录后获取的业务请求令牌 |
| AK/SK | Access Key / Secret Key | XDR联动码解码获得的访问密钥对 |
| HMAC-SHA256 | Hash-based Message Authentication Code | 微步与XDR采用的请求签名算法 |
| IOC | Indicators of Compromise | 失陷威胁指标 |
| ATT&CK | Adversarial Tactics, Techniques & Common Knowledge | 攻击战术技术知识库 |
[/TABLE]
1.5 参考文档
[TABLE]
| 序号 | 文档名称 | 版本 |
| 1 | 奇安信网神威胁监测与分析系统(天眼-分析平台)V4.0.12.0-API调用手册V1.0 | V1.0.0 |
| 2 | 微步在线API配置文档 | 最新 |
| 3 | 深信服XDR开放API认证方案及接口开放列表 | 最新 |
| 4 | 智能安全运营平台系统架构设计文档 | V1.0.0 |
[/TABLE]
# 2 功能需求
2.1 数据采集
设备API接口数据采集模块需要从以下安全设备平台定时拉取安全数据,采集的数据类型主要包括Web访问日志、告警日志、攻击流量和日志流量。
2.1.1 天眼分析平台API接口
#### 2.1.1.1 功能需求
通过天眼分析平台API接口,定时采集以下两类数据:
• Web访问日志(skyeye-weblog):记录外部对内网的HTTP/HTTPS访问行为,包括源/目的IP、端口、URI、Host、Method、状态码、Cookie、Referer等。
• 告警日志(alarm_collection等):记录各类安全告警事件,包括规则告警、威胁情报告警、蜜罐告警、WebShell检测、Web攻击检测、IDS入侵检测等。
#### 2.1.1.2 认证机制
天眼分析平台采用免密登录(OAuth式)认证,流程如下:
1. 获取login_key(系统管理-账号管理)
2. 生成client_id = SHA256("mNSLP9UJCtBHtegjDPJnK3v" + "|" + login_key)
3. 生成client_secret = SHA256("3460681205014671737" + "|" + login_key)
4. 生成timestamp(10位Unix时间戳,与平台时差不能超过10分钟)
5. 生成X-Authorization = SHA256(JSON({"client_id":..,"username":"tapadmin"}) + timestamp + client_secret)
6. POST /skyeye/v1/admin/auth 获取access_token
7. GET /skyeye/v1/admin/auth?token=... 提取csrf_token和cookies
8. 携带csrf_token + cookies请求业务数据接口
注意:csrf_token有效期约30分钟,需在每次采集周期前重新认证;cookies需在后续请求Header中携带,格式为 key1=value1;key2=value2;。
#### 2.1.1.3 相关API接口说明
(1)Web访问日志查询接口
[TABLE]
| 属性 | 说明 |
| 接口URL | /skyeye/v1/analysis/log-search/list |
| 请求协议 | HTTPS |
| 请求方法 | GET |
| 认证方式 | csrf_token + cookies(免密登录获取) |
| 数据格式 | JSON |
[/TABLE]
请求参数:
[TABLE]
| 参数名 | 类型 | 必填 | 说明 | 示例 |
| branch_id | string | 是 | 级联单位ID | QbJK/sLHi |
| start_time | number | 是 | 开始时间(毫秒时间戳) | 1787534456117 |
| end_time | number | 是 | 结束时间(毫秒时间戳) | 1787534756117 |
| index | string | 是 | 索引名称(web日志固定为skyeye-weblog) | skyeye-weblog |
| category | string | 是 | 索引类别 | skyeye |
| offset | int | 是 | 页码,从1开始 | 1 |
| limit | int | 是 | 每页条数 | 100 |
| mode | string | 否 | 查询模式(fast_model快速查询) | fast_model |
| keyword | string | 否 | 关键词检索 | |
| csrf_token | string | 是 | 认证令牌(免密登录获取) | 8696f4a3f08fe4c48b310f269bd4adad |
| r | string | 否 | 随机数(防缓存) | 0.8929389461785662 |
[/TABLE]
响应字段(Web访问日志核心数据字段):
[TABLE]
| 字段名 | 说明 |
| serial_num | 设备序列号 |
| access_time | 访问时间 |
| sip / dip | 源IP / 目的IP |
| sport / dport | 源端口 / 目的端口 |
| uri / uri.raw | 请求URI / 原始URI |
| host / host_raw | 主机域名 |
| method | HTTP方法(GET/POST等) |
| status | HTTP状态码 |
| agent | User-Agent |
| xff | X-Forwarded-For |
| data | 请求体数据 |
| content_type | Content-Type |
| setcookie / cookie / referer | Set-Cookie / Cookie / Referer |
| authorization | Authorization头 |
| device_ip | 设备IP |
| src_mac / dst_mac | 源MAC / 目的MAC |
| vlan_id | VLAN ID |
| sess_key | 会话Key |
| priv_info | 私有信息(产品类型等) |
| geo_sip.* / geo_dip.* | 源/目的IP地理位置(城市、国家、经纬度) |
| @timestamp | ES时间戳 |
| sipv6 / dipv6 | IPv6源/目的地址 |
| origin / accept_language | Origin / Accept-Language |
[/TABLE]
(2)告警日志查询接口
[TABLE]
| 属性 | 说明 |
| 接口URL | /skyeye/v1/analysis/log-search/list |
| 请求方法 | GET |
| 索引名称 | alarm_collection, skyeye-sandbox, sandbox_mail, alarm_honeypot, alarm_yunsuo, webids-webshell_dolog, webids-webattack_dolog, webids-ids_dolog, webids-ioc_dolog |
| 查询模式 | advance_model(高级模式) |
[/TABLE]
告警日志数据字段(核心字段):
[TABLE]
| 字段名 | 说明 |
| rule_id / rule_name | 规则ID / 规则名称 |
| dolog_count | 告警次数 |
| severity | 严重级别 |
| rule_version | 规则版本 |
| sip / dip / sport / dport | 源/目的IP、端口 |
| method / host / uri | HTTP方法 / 主机 / URI |
| file_name / referer / agent / cookie / parameter | 文件名 / Referer / UA / Cookie / 参数 |
| req_header / req_body | 请求头 / 请求体 |
| rsp_status / rsp_content_length / rsp_content_type / rsp_header / rsp_body / rsp_body_len | 响应状态/长度/类型/头/体 |
| victim_type / attack_flag | 受害类型 / 攻击标识 |
| attacker / victim | 攻击者 / 受害者 |
| attack_type / attack_result | 攻击类型 / 攻击结果 |
| confidence | 置信度 |
| detail_info / solution | 详细信息 / 解决方案 |
| vuln_desc / vuln_harm / vuln_name / vuln_type | 漏洞描述/危害/名称/类型 |
| kill_chain / att_ck_all | 杀伤链 / ATT&CK |
| cve_id / bid_id / cwe_id / msb_id | CVE/BID/CWE/MSB编号 |
| webrules_tag / rule_labels | Web规则标签 |
| code_language / site_app | 代码语言 / 站点应用 |
| device_ip / vendor_id | 设备IP / 厂商ID |
[/TABLE]
(3)告警列表查询接口
[TABLE]
| 属性 | 说明 |
| 接口URL | /alarm/alarm/list |
| 请求方法 | GET |
| 认证方式 | csrf_token + cookies |
[/TABLE]
核心请求参数:start_time、end_time、threat_type、hazard_level(0低危/1中危/2高危/3危急)、host_state(攻击结果)、status(处理状态)、offset(页码)、limit(每页条数)等。
2.1.2 微步API接口
#### 2.1.2.1 功能需求
通过微步在线威胁感知平台API接口,定时采集以下两类数据:
• 攻击流量(net_data_type: ["attack"]):检测到的攻击行为日志,包括威胁名称、攻击结果、严重级别、攻击阶段、源/目的IP端口、HTTP详情、IOC等。
• 日志流量(net_data_type: ["info"]):网络流量日志记录,用于行为分析和审计。
#### 2.1.2.2 认证机制
微步平台采用HMAC-SHA256签名认证,流程如下:
1. 获取当前时间戳 Timestamp(10位Unix秒级时间戳)
2. 拼接签名数据:SignData = ApiKey + Timestamp
3. 计算签名:Sign = Base64.encodeBase64URLSafeString(HmacSHA256(SignData, Secret))
4. 构造请求URL:
POST https://domain/api/v1/log/searchBySql?api_key=<ApiKey>&auth_timestamp=<Timestamp>&sign=<Sign>
说明:Base64 URL Safe编码将"+"替换为"-"、"/"替换为"_"并去除末尾"=",防止URL参数解析不完整;请求方时间与服务端时间差须在10分钟以内,否则签名过期。
#### 2.1.2.3 相关API接口说明
[TABLE]
| 属性 | 说明 |
| 接口URL | /api/v1/log/searchBySql |
| 请求协议 | HTTPS |
| 请求方法 | POST |
| 频率限制 | 50次/秒 |
| 认证方式 | api_key + auth_timestamp + sign(HMAC-SHA256) |
| Content-Type | application/json |
[/TABLE]
请求Body参数:
[TABLE]
| 参数名 | 类型 | 必填 | 说明 | 示例 |
| net_data_type | Array | 是 | 数据类型:attack-攻击流量,info-日志流量 | ["attack"] |
| time_from | Integer | 是 | 开始时间戳(秒级) | 1787500800 |
| time_to | Integer | 是 | 截止时间戳(秒级) | 1787587199 |
| assets_group | Array | 否 | 业务组ID列表 | [] |
| search_connection | Boolean | 否 | 是否搜索关联连接 | false |
| sql | String | 否 | 查询SQL条件 | (threat.level IN ('attack','action')) |
| columns | Array | 否 | 查询字段列表(label+value对) | [{"label":"告警时间","value":"time"}] |
| asc | Boolean | 否 | 是否升序排列 | false |
| page | Object | 否 | 分页参数:cur_page, page_size, sort | {"cur_page":1,"page_size":100} |
[/TABLE]
查询字段列表(columns):
[TABLE]
| 字段(value) | 中文名(label) | 说明 |
| time | 告警时间 | 事件发生时间(秒级时间戳) |
| threat.name | 威胁名称 | 如"路径穿越攻击"、"疑似冰蝎Webshell" |
| threat.result | 攻击结果 | success/failed/unknown |
| threat.severity | 严重级别 | 0:信息, 1:低, 2:中, 3:高, 4:严重 |
| threat.phase | 攻击阶段 | 如exploit, post_exploit |
| threat.type | 威胁类型 | 如exploit, virus, c2 |
| threat.level | 威胁分类 | attack-攻击, action-事件, risk-风险 |
| threat.ioc | IOC | 威胁指标 |
| threat.is_apt | 是否APT | 0:否, 1:是 |
| threat.tag | 威胁标签 | Mitre ATT&CK标签等 |
| threat.status | 处理状态 | 处理状态标识 |
| machine | 告警主机 | 受影响主机IP |
| net.src_ip / net.src_port | 源IP / 源端口 | 攻击源地址与端口 |
| net.dest_ip / net.dest_port | 目的IP / 目的端口 | 目标地址与端口 |
| net.type | 协议 | 应用层协议(http等) |
| net.http.method / status | HTTP方法 / 状态码 | GET/POST等 / 响应状态码 |
| net.http.reqs_header / reqs_body | 请求头 / 请求体 | HTTP请求信息 |
| net.http.resp_header / resp_body | 响应头 / 响应体 | HTTP响应信息 |
| data | URL/域名 | 告警主体数据 |
| assets.name / assets.group_name | 资产名称 / 业务组 | 受影响资产信息 |
| direction | 告警方向 | in:外部攻击, out:失陷破坏, lateral:内网渗透 |
| src_tag / dest_tag | 来源/目的标签 | 内/外 |
| ip_reputation / ip_reputation_zh | IP信誉 | IP信誉标签(英文/中文) |
| hit_whitelist | 命中白名单 | 0:未命中, 1:命中 |
[/TABLE]
响应数据结构(示例):
{
"data": {
"data": [
{
"data": "URL或域名",
"index": "tdp-2026-08-24",
"src_tag": "外", "dest_tag": "内",
"ip_reputation_zh": ["网关"],
"assets": {"group_id":1, "group_name":"互联网应用", "name":["蜜罐系统"], "id":36},
"machine": "172.20.34.33",
"time": 1787545680,
"threat": {
"severity": 1, "result": "unknown", "phase": "exploit",
"level": "attack", "name": "路径穿越攻击",
"tag": ["Mitre: T1190..."], "type": "exploit",
"is_apt": 0, "status": 0
},
"id": "J7UGMqABp3egYciwfG0Z",
"net": {
"src_ip": "119.132.173.119", "src_port": 55105,
"dest_ip": "172.20.34.33", "dest_port": 80,
"type": "http",
"http": {"method":"POST", "reqs_header":"Host: ...",
"reqs_body":"...", "resp_header":"...", "resp_body":"..."}
},
"hit_whitelist": 0, "direction": "in"
}
]
},
"response_code": 0,
"verbose_msg": "OK"
}
2.1.3 XDR OpenAPI接口(深信服)
#### 2.1.3.1 功能需求
通过深信服XDR平台开放API接口,采集告警事件等安全数据,作为天眼和微步数据的补充。
#### 2.1.3.2 认证机制
深信服XDR平台采用AK/SK HMAC-SHA256签名认证,流程如下:
• 从XDR平台"配置管理-系统设置-开放性-联动码管理"页面获取联动码(authCode)。
• 联动码解码获取AK/SK(AES-CBC解密)。
• 构造请求,生成签名头;签名后直接发送请求,不可修改任何参数。
签名算法说明:
[TABLE]
| 步骤 | 说明 |
| 联动码解码 | Hex解码 -> 按"|"分割为14段 -> 通过SHA256计算AES密钥 -> AES-CBC解密第10段得到AK,第11段得到SK |
| 添加公共头 | sdk-content-type: application/json; sdk-host: {host}; sign-date: {UTC时间(yyyyMMdd'T'HHmmssZZ)} |
| 构造规范串 | METHOD + "\n" + URI(转义+末尾加/) + "\n" + QueryString(排序) + "\n" + Headers(排序key:value\n) + SignedHeaders(;) + "\n" + PayloadHash(SHA256(payload去空格+排序)) |
| 计算签名 | stringToSign = "HMAC-SHA256\n" + signDate + "\n" + SHA256(规范串);signature = HMAC-SHA256(stringToSign, SK) -> Hex编码 |
| 构造Authorization | algorithm=HMAC-SHA256, Access={AK}, SignedHeaders={排序后的header keys}, Signature={signature} |
[/TABLE]
XDR平台信息:
[TABLE]
| 属性 | 值 |
| 平台地址 | https://10.56.171.157/api/openapi/ |
| API Token | dTTQ8esIvaZOETpT4NWX |
| 接口示例 | /api/xdr/v1/assets/list(资产列表)、/api/xdr/v1/assets/department(部门资产) |
| 签名依赖库 | commons-codec(Hex/HmacUtils/DigestUtils)、Spring HttpHeaders |
[/TABLE]
# 3 非功能性需求
[TABLE]
| 需求项 | 指标 | 说明 |
| 性能 | 采集延迟 | 数据采集周期为5分钟,从设备API获取到数据写入Kafka的延迟不超过30秒 |
| 吞吐量 | 处理能力 | 单次采集批量处理1000条记录,支持多设备并行采集 |
| 可靠性 | 容错机制 | API调用失败自动重试3次(间隔递增:5s/10s/15s),重试失败记录错误日志并跳过当前批次 |
| 可靠性 | 断点续传 | 记录每批次最后采集时间戳,重启后从上次位置继续采集,不丢数据 |
| 可用性 | 认证缓存 | csrf_token(天眼)和AK/SK签名缓存于Redis,避免频繁认证 |
| 安全性 | 凭证管理 | login_key、ApiKey、Secret、authCode等敏感信息加密存储于配置文件,不记录在日志中 |
| 安全性 | HTTPS | 所有设备API调用使用HTTPS协议,关闭SSL证书校验(设备使用自签证书) |
| 可扩展性 | 设备适配 | 采用策略模式,新增设备类型只需实现统一的DataCollector接口,无需修改调度逻辑 |
| 可维护性 | 配置化 | 设备地址、认证信息、采集间隔、数据类型等全部通过application.yml配置,支持热刷新 |
| 采集监控 | 采集统计 | 记录每次采集的设备名、数据类型、采集条数、耗时、成功/失败状态,写入采集日志表 |
[/TABLE]
# 4 假设与约束条件
4.1 时间周期
[TABLE]
| 约束项 | 约束值 | 说明 |
| 天眼认证有效期 | 约30分钟 | csrf_token有效期约30分钟,需在每次采集周期前检查并刷新 |
| 微步签名有效期 | 10分钟 | auth_timestamp与服务端时间差须在10分钟以内 |
| 天眼时间同步 | 10分钟 | 第三方系统时间与天眼分析平台时间差不能超过10分钟 |
| 微步频率限制 | 50次/秒 | 微步API调用频率限制为50次/秒,需控制并发请求速率 |
| 采集间隔 | 5分钟 | 默认每5分钟采集一次,可配置 |
| 时间窗口重叠 | -1分钟 | 每次采集的时间窗口结束时间为当前时间减1分钟,开始时间为上次采集结束时间 |
| 分页大小 | 100条/页 | 单次请求最大100条,需循环分页拉取 |
[/TABLE]
# 5 开发设计
5.1 数据采集处理流程
数据采集处理主流程(9步):
定时触发 -> 认证管理 -> 构造请求 -> 调用API -> 解析响应
-> 字段映射(标准化数据格式) -> 写入Kafka(指定topic) -> 更新断点 -> 记录日志
5.1.1 认证管理流程
[TABLE]
| 设备 | 认证策略 |
| 天眼 | 1. 检查Redis中缓存的csrf_token是否有效(TTL=25分钟)2. 若无效,执行免密登录流程:生成client_id/secret/signature -> POST获取access_token -> GET提取csrf_token+cookies3. 缓存csrf_token和cookies到Redis(TTL=25分钟) |
| 微步 | 1. 每次请求实时生成签名(Timestamp + HmacSHA256)2. 无需缓存Token,但Api_key和Secret从配置文件读取 |
| 深信服XDR | 1. 启动时解码联动码获取AK/SK,缓存到内存2. 每次请求实时生成sign-date和签名头3. 签名后直接发送,不可修改请求 |
[/TABLE]
5.1.2 分页拉取流程
int page = 1;
int pageSize = 100;
boolean hasMore = true;
while (hasMore) {
params.put("offset", page);
params.put("limit", pageSize);
JSONObject response = httpClient.get(apiUrl, params, headers);
JSONArray items = response.getJSONObject("data").getJSONArray("items");
int total = response.getJSONObject("data").getInt("total");
for (Object item : items) {
StandardMessage msg = fieldMapper.map((JSONObject) item, deviceType);
kafkaTemplate.send(topic, JSON.toJSONString(msg));
}
hasMore = (page * pageSize) < total;
page++;
Thread.sleep(rateLimitInterval); // 限流控制(微步50/s)
}
5.1.3 断点续传机制
使用Redis记录每个设备+数据类型的最后采集时间戳,确保重启后不丢数据:
// Redis Key设计
key: device:api:last_collect_time:{deviceIp}:{deviceType}:{dataType}
value: 1787534756117 (最后成功采集的数据时间戳)
TTL: 7天 (过期自动清理)
// 采集时间窗口计算
long lastTime = redis.get(key); // 上次采集结束时间
long endTime = System.currentTimeMillis(); // 当前时间
long startTime = lastTime - 60000; // 回退1分钟,防止边界丢数据
5.2 设备API接口设计
5.2.1 统一采集器接口
/**
* 设备数据采集器统一接口
* 所有设备采集器实现此接口,由调度器统一管理
*/
public interface DeviceDataCollector {
/** 获取设备类型 */
String getDeviceType();
/** 认证/获取访问凭证 */
void authenticate() throws CollectorException;
/**
* 采集数据
* @param dataType 数据类型(weblog/alarm/attack/info等)
* @param startTime 开始时间
* @param endTime 结束时间
* @return 采集结果统计
*/
CollectResult collect(String dataType, long startTime, long endTime)
throws CollectorException;
/** 检查认证是否有效 */
boolean isAuthenticated();
}
5.2.2 天眼采集器设计
@Slf4j
@Component
public class TianyanDataCollector implements DeviceDataCollector {
@Value("${device.tianyan.host}") private String host;
@Value("${device.tianyan.loginKey}") private String loginKey;
@Value("${device.tianyan.branchId}") private String branchId;
private static final String CLIENT_ID_SEED = "mNSLP9UJCtBHtegjDPJnK3v";
private static final String CLIENT_SECRET_SEED = "3460681205014671737";
private static final String AUTH_URI = "/skyeye/v1/admin/auth";
private static final String LOG_SEARCH_URI = "/skyeye/v1/analysis/log-search/list";
private static final String CSRF_TOKEN_CACHE_KEY = "device:tianyan:csrf_token";
private static final String COOKIES_CACHE_KEY = "device:tianyan:cookies";
private static final long CSRF_TOKEN_TTL = 25 * 60; // 25分钟
@Override
public void authenticate() throws CollectorException {
// 1. 检查Redis缓存 2. 生成client_id/client_secret
// 3. 生成X-Authorization签名 4. POST获取access_token
// 5. GET提取csrf_token+cookies 6. 缓存到Redis
}
@Override
public CollectResult collect(String dataType, long startTime, long endTime) {
// weblog: index=skyeye-weblog, category=skyeye, mode=fast_model
// alarm : index=alarm_collection,... category=event, mode=advance_model
// 分页拉取并写入Kafka
}
}
5.2.3 微步采集器设计
@Slf4j
@Component
public class WeibuDataCollector implements DeviceDataCollector {
@Value("${device.weibu.host}") private String host;
@Value("${device.weibu.apiKey}") private String apiKey;
@Value("${device.weibu.secret}") private String secret;
private static final String SEARCH_BY_SQL_URI = "/api/v1/log/searchBySql";
/**
* 生成微步API签名:
* Sign = Base64.encodeBase64URLSafeString(HmacSHA256(ApiKey+Timestamp, Secret))
*/
private String generateSign(long timestamp) {
String signData = apiKey + timestamp;
byte[] hmacBytes = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secret).hmac(signData);
return Base64.encodeBase64URLSafeString(hmacBytes);
}
@Override
public CollectResult collect(String dataType, long startTime, long endTime) {
long timestamp = System.currentTimeMillis() / 1000;
String sign = generateSign(timestamp);
String url = host + SEARCH_BY_SQL_URI
+ "?api_key=" + apiKey + "&auth_timestamp=" + timestamp + "&sign=" + sign;
// 构造Body: net_data_type/time_from/time_to/sql/columns/分页参数
// 分页拉取...
}
}
5.2.4 深信服XDR采集器设计(暂缓)
@Slf4j
@Component
public class XdrDataCollector implements DeviceDataCollector {
@Value("${device.xdr.host}") private String host;
@Value("${device.xdr.authCode}") private String authCode;
private String ak; private String sk;
@PostConstruct
public void init() {
String[] akSk = decodeAuthCode(authCode);
this.ak = akSk[0]; this.sk = akSk[1];
}
/** 对请求进行HMAC-SHA256签名 */
private HttpRequest signRequest(HttpRequest request) {
String signDate = DateFormatUtils.formatUTC(new Date(), "yyyyMMdd'T'HHmmssZZ");
request.header("sdk-content-type", "application/json");
request.header("sdk-host", request.uri().getHost());
request.header("sign-date", signDate);
String canonicalStr = buildCanonicalStr(request);
String canonicalHash = Hex.encodeHexString(DigestUtils.sha256(canonicalStr), false);
String stringToSign = "HMAC-SHA256\n" + signDate + "\n" + canonicalHash;
String signature = Hex.encodeHexString(
new HmacUtils(HmacAlgorithms.HMAC_SHA_256, sk).hmac(stringToSign), false);
String authorization = String.format(
"algorithm=HMAC-SHA256, Access=%s, SignedHeaders=%s, Signature=%s",
ak, getSignedHeaders(request), signature);
request.header("Authorization", authorization);
return request;
}
}
5.3 数据表设计
5.3.1 设备API采集配置表
-- 达梦DM8 DDL
CREATE TABLE device_api_config (
id BIGINT IDENTITY(1,1) PRIMARY KEY, -- 主键,自增
device_id INT, -- 设备ID,关联 device_device.id
device_type VARCHAR(50) NOT NULL, -- 设备类型: tianyan/weibu/xdr
device_name VARCHAR(100) NOT NULL, -- 设备名称
device_ip VARCHAR(200) NOT NULL, -- 设备IP地址
host_api VARCHAR(200) NOT NULL, -- 设备API地址
auth_config TEXT, -- 认证配置JSON
data_types VARCHAR(500) NOT NULL, -- 数据类型: weblog,alarm / attack,info
collect_interval_sec INT DEFAULT 300, -- 采集间隔(秒)
enabled INT DEFAULT 1, -- 是否启用: 0-禁用, 1-启用
remark VARCHAR(500), -- 备注
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE device_api_config IS '设备API采集配置表';
5.3.2 采集任务执行日志表
CREATE TABLE device_api_collect_log (
id BIGINT IDENTITY(1,1) PRIMARY KEY, -- 主键,自增
device_id INT NOT NULL, -- 设备ID,关联 device_device.id
device_type VARCHAR(50) NOT NULL, -- 设备类型
data_type VARCHAR(50) NOT NULL, -- 数据类型
start_time TIMESTAMP NOT NULL, -- 采集窗口开始时间
end_time TIMESTAMP NOT NULL, -- 采集窗口结束时间
total_count INT DEFAULT 0, -- 采集记录总数
success_count INT DEFAULT 0, -- 成功写入数
fail_count INT DEFAULT 0, -- 失败数
cost_ms BIGINT DEFAULT 0, -- 耗时(毫秒)
status VARCHAR(20) NOT NULL, -- 状态: SUCCESS/FAIL
error_msg TEXT, -- 错误信息
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE device_api_collect_log IS '设备API采集执行日志';
5.3.3 标准化消息格式(Kafka消息体)
[receive_time=20260825143015235 device_id=1001 device_name=天眼01 vendor=天眼, data_type=json device_collect_id=1 eventId=20260822-f47ac10b-58cc-4372-a567-0e02b2c3d479]
{
"deviceType": "tianyan",
"dataType": "alarm",
"collectTime": 1787534756117,
"rawData": { ... 各设备原始JSON ... }
}
5.4 核心类设计
[TABLE]
| 类名 | 类型 | 职责 |
| DeviceDataCollector | 接口 | 定义统一的采集器接口规范 |
| TianyanDataCollector | 实现类 | 天眼平台数据采集,含免密登录认证、Web日志/告警日志查询 |
| WeibuDataCollector | 实现类 | 微步平台数据采集,含HMAC-SHA256签名、攻击/日志流量查询 |
| XdrDataCollector | 实现类 | 深信服XDR数据采集,含联动码解码、AK/SK签名 |
| CollectScheduler | 调度器 | 基于Spring @Scheduled定时调度,管理所有采集器的执行周期 |
| AuthManager | 认证管理器 | 统一管理各设备的Token缓存与刷新策略 |
| FieldMapper | 字段映射器 | 将各设备原始字段映射为统一标准化格式 |
| CollectResult | 结果对象 | 封装采集结果统计信息(总数、成功数、失败数、耗时) |
| CollectorException | 异常类 | 采集过程中异常的统一封装 |
| DeviceApiConfig | 实体类 | 设备API配置实体,对应device_api_config表 |
| DeviceApiCollectLog | 实体类 | 采集日志实体,对应device_api_collect_log表 |
[/TABLE]
5.5 定时任务设计
@Slf4j
@Component
public class CollectScheduler {
@Autowired private List<DeviceDataCollector> collectors;
@Autowired private DeviceApiConfigService configService;
@Autowired private RedisTemplate<String, String> redisTemplate;
/** 主采集任务 - 每5分钟执行 */
@Scheduled(fixedDelayString = "${device.collect.interval:300000}")
public void scheduleCollect() {
List<DeviceApiConfig> configs = configService.listEnabled();
for (DeviceApiConfig config : configs) {
for (String dataType : config.getDataTypes().split(",")) {
try {
collectForDevice(config, dataType.trim());
} catch (Exception e) {
log.error("采集失败: {}-{}", config.getDeviceType(), dataType, e);
}
}
}
}
private void collectForDevice(DeviceApiConfig config, String dataType) {
// 1. 查找采集器 2. 认证检查
// 3. 计算时间窗口(上次时间-1分钟 ~ 当前时间)
// 4. 采集 5. 更新断点 6. 记录日志
}
}
5.6 配置设计
# application.yml 设备API采集配置
device:
collect:
interval: 300000 # 采集间隔(毫秒), 默认5分钟
retry:
max-attempts: 3 # 最大重试次数
initial-delay: 5000 # 初始重试延迟(毫秒)
multiplier: 2.0 # 重试延迟倍数
kafka:
topic: device-api-collect
tianyan: # 天眼分析平台
host: https://10.56.171.xxx:443
login-key: ${TIANYAN_LOGIN_KEY}
branch-id: QbJK/sLHi
data-types: weblog,alarm
page-size: 100
weibu: # 微步在线
host: https://10.56.171.164
api-key: ${WEIBU_API_KEY}
secret: ${WEIBU_SECRET}
data-types: attack,info
rate-limit: 50 # 每秒最大请求数
page-size: 100
xdr: # 深信服XDR
host: https://10.56.171.157
auth-code: ${XDR_AUTH_CODE}
api-base: /api/openapi/
data-types: alarm,asset
page-size: 1000
# 6开发计划
6.1 任务计划
总工期 2周(2026-08-25至2026-9-3,共10个工作日),设置5个里程碑:
[TABLE]
| 里程碑 | 名称 | 计划完成日期 | 达成标准(出口准则) |
| M1 | 需求与设计基线确认 | 2026-08-25 | 设计说明评审通过并基线化;API账号凭证(天眼login_key、微步ApiKey/Secret、XDR联动码)全部到位 |
| M2 | 采集框架与环境就绪 | 2026-08-27 | 模块骨架搭建完成;两张DM8表建表并通过验证;Kafka/Redis连通;统一接口与调度器编译通过 |
| M3 | 天眼采集器完成 | 2026-08-28 | 免密登录认证调通;weblog与alarm两类数据可稳定拉取并写入Kafka;断点续传验证通过 |
| M4 | 微步与XDR采集器完成 | 2026-08-31 | 微步签名调通、attack/info双类型采集正常;XDR联动码解码与签名调通、数据可拉取 |
| M5 | 联调测试与上线 | 2026-09-04 | 7×24小时连续运行无丢数;重试/断点/限流场景测试通过;测试报告与部署方案归档 |
[/TABLE]
6.2任务分解与进度安排
6.2.1 阶段一:需求确认与基础环境准备开发(第1周,08-25~08-27)
[TABLE]
| 任务编号 | 任务名称 | 工作内容 | 工期(天) | 责任角色 |
| T1.1 | 设计评审与基线 | 组织设计说明评审,确认接口清单、字段映射规则、消息格式 | 1 | 开发负责人 |
| T1.2 | 凭证与环境确认 | 获取三类设备API凭证;确认测试环境网络可达(防火墙开通HTTPS策略) | 1 | 开发+运维 |
| T1.3 | 模块骨架搭建 | 新建syslog-collector-api模块;引入依赖(httpclient/commons-codec/fastjson);统一异常与日志规范 | 2 | 后端开发 |
| T2.1 | 数据表与实体层 | device_api_config、device_api_collect_log建表(DM8);entity/mapper/service代码生成 | 1 | 后端开发 |
| T2.2 | 统一采集器接口 | DeviceDataCollector接口、CollectResult、CollectorException定义 | 1 | 后端开发 |
| T2.3 | 调度器开发 | CollectScheduler定时调度、时间窗口计算、采集日志落库 | 2 | 后端开发 |
| T2.4 | 断点续传与重试 | Redis断点Key读写;指数退避重试(3次:5s/10s/15s);限流器 | 1 | 后端开发 |
[/TABLE]
6.2.3 阶段二:天眼、微步采集器开发(第1-2周8.28-8.31)
[TABLE]
| 任务编号 | 任务名称 | 工作内容 | 工期(天) | 责任角色 |
| T3.1 | 免密登录认证 | client_id/client_secret/X-Authorization生成;access_token获取;csrf_token+cookies提取与Redis缓存(TTL=25分钟) | 2 | 后端开发 |
| T3.2 | Web访问日志采集 | skyeye-weblog索引查询、分页拉取(100条/页)、fast_model模式适配 | 2 | 后端开发 |
| T3.3 | 告警日志采集 | 9个告警索引联合查询、advance_model模式适配、响应字段解析 | 3 | 后端开发 |
| T3.4 | 字段映射与联调 | 天眼字段映射;与真实环境联调,验证数据完整性 | 2 | 后端开发 |
| T4.1 | 签名与请求封装 | HmacSHA256+Base64URLSafe签名;api_key/auth_timestamp/sign URL构造 | 1 | 后端开发 |
| T4.2 | 查询接口对接 | searchBySql接口对接;columns字段列表构造;分页参数封装 | 2 | 后端开发 |
| T4.3 | 双类型采集与限流 | attack/info两种net_data_type采集;50次/秒限流控制;字段映射与联调 | 2 | 后端开发 |
[/TABLE]
6.2.5 阶段三:系统调试与上线(第2周,09.01~09-04)
[TABLE]
| 任务编号 | 任务名称 | 工作内容 | 工期(天) | 责任角色 |
| T5.1 | 集成测试 | 采集器并行运行7×24小时;采集量/延迟/丢数核对;Kafka消息抽检 | 2 | 开发+测试 |
| T5.2 | 异常场景测试 | Token过期重认证、API失败重试、服务重启断点续传、限流压测 | 1 | 开发+测试 |
| T5.3 | 部署上线(依赖现场网络策略开通) | Docker Compose编排;生产配置核对;监控告警接入;测试报告归档 | 2 | 开发+运维 |
[/TABLE]
6.2.6 人员分工与资源需求
[TABLE]
| 角色 | 人数 | 主要职责 | 投入占比 |
| 开发负责人 | 1 | 设计评审、任务分派、进度与质量把控、里程碑验收 | 30% |
| 后端开发(Java) | 1 | 采集框架、三个采集器、调度与断点、字段映射编码实现及自测 | 100% |
| 测试工程师 | 1 | 测试用例编写、集成与异常场景测试、测试报告 | 100%(1周) |
| 运维工程师 | 1 | 申请网络策略开通(3台采集服务器->安全设备)、环境准备、Docker部署、监控接入 | 20% |
| 厂商接口支持 | 2 | 天眼/微步 接口问题答疑、凭证发放(按需) | 按需 |
[/TABLE]
# 7 附录
7.1天眼接口数据样例
7.2微步口数据样例