Files
ai-security-xdr/haobang-security-dm/upgrade-doc/v5/README.md
T
王绍宏 1c07acc01d feat(syslog-consumer-rule): 增加多节点原始日志采集并修复天眼/微步JSON规则匹配
一、增加现场原始日志采集功能

1. 新增按设备采集原始日志的API:
   - 指定设备ID;
   - 采集时长最长10分钟;
   - 单次最多返回50条样本。

2. 样本选择策略:
   - 优先保留时间窗口内最早到达的N条日志;
   - 后续出现JSON解析异常、非标、规则执行异常、InfluxDB/达梦写入异常或Retry/DLT时,
     使用异常日志逐条替换最早的正常样本;
   - 异常样本同样遵循先到先得。

3. 支持三个syslog-consumer-rule实例联合采集:
   - 采集请求只需发送到任意一个实例;
   - 三个实例通过公共Redis同步采集任务并汇总候选样本;
   - 不需要配置其他实例IP;
   - Redis只保存有界候选集,不保存时间窗口内的全部日志。

4. 生命周期和资源控制:
   - 采集到期后自动停止接收新日志;
   - 默认进入30秒DRAINING阶段,等待异步处理异常完成样本替换;
   - 最终结果默认保留30分钟,之后自动删除;
   - 单实例、单会话最多保留“前N条+前N条异常”;
   - Redis故障不阻断Kafka主消费链路。

5. 返回规则解析和非标表截断之前的完整原始报文,不受
   HB_XDR_TRUNCATED字段截断影响。

6. 原始日志采集和多实例汇聚默认启用:
   SYSLOG_RAW_CAPTURE_ENABLED=true
   SYSLOG_RAW_CAPTURE_CLUSTER_ENABLED=true

二、修复天眼/微步JSON规则匹配问题

1. JSON规则配置了cropper时,先判断原始报文是否包含对应head_key;
   不匹配的规则不再将当前报文误判为非法JSON。

2. 同一设备绑定多条规则时,单条不适用或解析失败的JSON规则不再立即终止整个规则链,
   程序会继续匹配后续适用规则。

3. 只有全部适用JSON规则均解析失败、且没有其他规则成功处理时,才写入
   “JSON解析异常”非标记录。

4. 对cropper截取后仍包含Syslog或设备前缀的内容,在JSON专用路径中重新收敛到
   第一个“{”至最后一个“}”,确保交给Jackson的是完整外层JSON。

5. 修复以下现场场景:
   - 天眼规则129截取结果仍带有alarm前缀;
   - 微步设备同时绑定固定偏移规则和Threatbook/TDP JSON规则;
   - 不适用的固定偏移规则抢先产生JSON解析异常;
   - Syslog头加JSON正文不能继续匹配后续适用规则。

三、增加现场采集工具及运维说明

新增upgrade-doc/v5:
   - README.md:升级、配置、生命周期和故障排查说明;
   - capture-device-raw-logs.sh:一键创建采集会话、等待完成并自动落盘。

脚本输出:
   - result.json:完整采集结果;
   - samples.jsonl:每行一条样本及处理状态;
   - raw/*.log:每条未截断原始报文;
   - summary.txt:采集数量、异常数量和替换数量;
   - latest.json:中断或超时时的最后有效快照。

四、兼容性与升级范围

- 兼容JDK 8;
- 无需新增或修改达梦数据库表;
- 无需创建新的Kafka Topic;
- 需要滚动升级全部syslog-consumer-rule实例;
- 三个实例必须连接相同的Redis;
- 本次提交不包含syslog-serve的高内存、WAL或JVM参数调整。
2026-09-14 23:11:45 +08:00

140 lines
4.6 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.
# v5 现场设备原始日志采样
## 功能说明
v5 为 `syslog-consumer-rule` 增加按设备短时采集原始日志的诊断接口,并提供自动落盘脚本。
- 单次采集最长 600 秒;
- 单次最多返回 50 条;
- 先保留采集窗口内最早的 N 条日志;
- 后续出现非标、规则执行异常、InfluxDB 写入异常、达梦写入异常或 Retry/DLT 时,用异常日志逐条替换最早的正常样本;
- 返回内容来自规则解析和非标字段截断之前,不受 `HB_XDR_TRUNCATED` 影响;
- 三个 `syslog-consumer-rule` 实例通过相同 Redis 汇聚有界候选集;
- 不新增数据库表,也不需要执行达梦 SQL。
## 升级与配置
滚动升级全部 `syslog-consumer-rule` 实例,并确保各实例连接同一个 Redis。原始日志采集和多实例汇聚默认
均已启用;建议在所有实例显式保留以下配置,便于现场识别和后续调整:
```yaml
- SYSLOG_RAW_CAPTURE_ENABLED=true
- SYSLOG_RAW_CAPTURE_CLUSTER_ENABLED=true
```
推荐保留默认配置:
```yaml
- SYSLOG_RAW_CAPTURE_MAX_ACTIVE_SESSIONS=20
- SYSLOG_RAW_CAPTURE_MAX_RETAINED_SESSIONS=100
- SYSLOG_RAW_CAPTURE_CLUSTER_ACTIVATION_DELAY_MS=1000
- SYSLOG_RAW_CAPTURE_CLUSTER_SYNC_INTERVAL_MS=200
- SYSLOG_RAW_CAPTURE_SETTLE_SECONDS=30
- SYSLOG_RAW_CAPTURE_RESULT_RETENTION_MINUTES=30
```
如果多个 Java 进程运行在同一主机且没有不同的容器 `HOSTNAME`,应为每个实例配置不同标识:
```yaml
- SYSLOG_RAW_CAPTURE_NODE_ID=consumer-rule-01
```
接口会返回完整原文,应只允许受信任的运维网络或现有管理网关访问。
## 一键采集
脚本依赖 `bash`、`curl` 和 `python3`。先增加执行权限:
```bash
chmod 700 /升级资料路径/v5/capture-device-raw-logs.sh
```
基本用法:
```bash
/升级资料路径/v5/capture-device-raw-logs.sh \
38 \
60 \
10 \
http://127.0.0.1:8289/xdrrule \
/data/haobang/raw-log-captures
```
参数依次是:
1. 设备 ID;
2. 采集秒数,默认 60,最大 600;
3. 样本数,默认 10,最大 50;
4. `syslog-consumer-rule` 基础地址,默认 `http://127.0.0.1:8289/xdrrule`;
5. 本地输出目录,默认当前目录下的 `raw-log-captures`。
如果接口经过鉴权网关,可通过环境变量传入请求头:
```bash
RAW_CAPTURE_AUTH_HEADER='Authorization: Bearer 替换为现场令牌' \
./capture-device-raw-logs.sh 38 120 20 https://管理地址/xdrrule /data/raw-samples
```
## 输出文件
每次运行生成独立目录:
```text
device-38_20260914-190000_会话ID/
├── start.json
├── latest.json
├── result.json
├── samples.jsonl
├── session-id.txt
├── summary.txt
└── raw/
├── 001_normal_事件ID.log
└── 002_anomaly_事件ID.log
```
- `result.json`:最终完整 API 响应,是最完整的交付文件;
- `samples.jsonl`:每行一条样本及其处理状态、异常原因和原文;
- `raw/*.log`:每条原始报文单独保存,内容不添加分隔符,也不主动截断;
- `summary.txt`:会话时间、收到的消息数、异常数和替换数;
- `latest.json`:脚本被中断或等待超时时保留的最后一次有效快照。
脚本设置 `umask 077`,新生成文件默认只允许执行脚本的账号访问。
## 生命周期
状态依次为:
```text
SCHEDULED -> RUNNING -> DRAINING -> COMPLETED
```
采集时间到达后不再接收新日志,随后默认等待 30 秒,让窗口内日志的异步处理异常完成替换。进入
`COMPLETED` 后结果默认继续保留 30 分钟,之后 Redis TTL 自动删除。
脚本会一直轮询到 `COMPLETED` 并自动导出,不需要人工再次查询。关闭终端或脚本等待超时不会使服务端会话
永久运行,会话仍按上述时间自动结束。
## 常见问题
### 返回 503:现场原始日志采样功能未启用
确认实例没有通过环境变量设置 `SYSLOG_RAW_CAPTURE_ENABLED=false`,并确认实例已经升级到 v5 JAR。
### 返回 503:跨实例原始日志采样暂不可用
检查所有 `syslog-consumer-rule` 实例到 Redis 的网络、密码、数据库编号是否一致。Redis 故障只影响诊断
采集,不会中断主 Kafka 消费。
### 返回 429
活动采集会话达到上限。等待已有会话进入 `COMPLETED`,或核对是否有人重复创建采集任务。
### 脚本退出码为 2
表示客户端等待超时,但已经把最后一次有效快照写入输出目录。服务端会话仍会自动结束,可在结果保留期内
使用 `session-id.txt` 中的 ID 再查询:
```bash
curl 'http://127.0.0.1:8289/xdrrule/api/syslog/raw-captures/会话ID'
```