使用ES|QL LOOKUP JOIN实现日志去重的现代方案

本文介绍了一种利用ES|QL LOOKUP JOIN命令实现日志去重的创新方法,通过哈希存储和按需查询的方式,可减少99.99%的PowerShell脚本日志存储空间,同时保持完整的取证能力。

在网络安全和可观测性领域,完整可见性与有限预算之间的矛盾长期存在。以PowerShell日志为例,启用完整脚本块日志记录会产生海量数据,导致存储和索引成本激增。

存储优化潜力

考虑一个企业场景:9KB的健康检查脚本在1万台服务器上每10分钟运行一次,每天产生144万事件。优化前后对比如下:

指标 优化前 优化后 影响
脚本存储量/天 12.96GB 9KB 减少99.99%
事件总数 144万 144万(精简)+1(完整) 元数据零丢失

核心策略:哈希存储与按需查询

该方案基于三个核心组件:

  1. 事件克隆(Logstash):复制每个PowerShell脚本块日志事件
  2. 哈希去重(摄取管道):生成脚本文本唯一哈希作为去重键
  3. 按需丰富(ES|QL):通过LOOKUP JOIN命令在查询时重建完整上下文

技术实现步骤

  1. 设置查找索引:创建专用查找索引模板,设置index.modelookup
1
2
3
4
5
6
7
8
PUT _component_template/logs-windows.powershell_operational_lookup@package
{
  "template": {
    "settings": {
      "index.mode": "lookup"
    }
  }
}
  1. Logstash事件处理:克隆事件并添加路由标签
1
2
3
4
5
6
7
filter {
  if [event][code] == "4104" {
    clone {
      clones => ["powershell_scriptblock_reduction"]
    }
  }
}
  1. 分离事件路由:原始事件和克隆事件分别发送到不同目标
1
2
3
4
5
6
7
output {
  if "powershell_scriptblock_reduction" in [tags] {
    elasticsearch {
      index => "logs-windows.powershell_operational_lookup-default"
    }
  }
}
  1. 摄取管道处理:对两种事件应用不同处理逻辑
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "processors": [
    {
      "remove": {
        "field": "powershell.file.script_block_text",
        "if": "ctx.fields?.duplicated == true"
      }
    }
  ]
}
  1. 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负载、应用堆栈跟踪等高重复率日志场景,实现了从"摄取时反规范化"到"查询时按需丰富"的范式转变。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计