本文介绍了一种利用ES|QL LOOKUP JOIN命令实现日志去重的创新方法,通过哈希存储和按需查询的方式,可减少99.99%的PowerShell脚本日志存储空间,同时保持完整的取证能力。
在网络安全和可观测性领域,完整可见性与有限预算之间的矛盾长期存在。以PowerShell日志为例,启用完整脚本块日志记录会产生海量数据,导致存储和索引成本激增。
存储优化潜力
考虑一个企业场景:9KB的健康检查脚本在1万台服务器上每10分钟运行一次,每天产生144万事件。优化前后对比如下:
指标 |
优化前 |
优化后 |
影响 |
脚本存储量/天 |
12.96GB |
9KB |
减少99.99% |
事件总数 |
144万 |
144万(精简)+1(完整) |
元数据零丢失 |
核心策略:哈希存储与按需查询
该方案基于三个核心组件:
- 事件克隆(Logstash):复制每个PowerShell脚本块日志事件
- 哈希去重(摄取管道):生成脚本文本唯一哈希作为去重键
- 按需丰富(ES|QL):通过LOOKUP JOIN命令在查询时重建完整上下文
技术实现步骤
- 设置查找索引:创建专用查找索引模板,设置
index.mode
为lookup
1
2
3
4
5
6
7
8
|
PUT _component_template/logs-windows.powershell_operational_lookup@package
{
"template": {
"settings": {
"index.mode": "lookup"
}
}
}
|
- Logstash事件处理:克隆事件并添加路由标签
1
2
3
4
5
6
7
|
filter {
if [event][code] == "4104" {
clone {
clones => ["powershell_scriptblock_reduction"]
}
}
}
|
- 分离事件路由:原始事件和克隆事件分别发送到不同目标
1
2
3
4
5
6
7
|
output {
if "powershell_scriptblock_reduction" in [tags] {
elasticsearch {
index => "logs-windows.powershell_operational_lookup-default"
}
}
}
|
- 摄取管道处理:对两种事件应用不同处理逻辑
1
2
3
4
5
6
7
8
9
10
|
{
"processors": [
{
"remove": {
"field": "powershell.file.script_block_text",
"if": "ctx.fields?.duplicated == true"
}
}
]
}
|
- ES|QL上下文重建:通过LOOKUP JOIN合并精简事件与完整脚本
1
2
3
|
FROM logs-windows.powershell_operational-default_reduced*
| LOOKUP JOIN logs-windows.powershell_operational_lookup-default
ON powershell.file.script_block_hash
|
架构优势
- 检测规则仍可扫描查找索引中的完整脚本内容
- 分析师可通过哈希值追溯所有脚本执行记录
- 可与logsdb索引模式等优化技术叠加使用
该模式适用于API负载、应用堆栈跟踪等高重复率日志场景,实现了从"摄取时反规范化"到"查询时按需丰富"的范式转变。