使用ELK收集Windows日志

简介

ELK是一套由Elastic公司开发的数据分析和搜索引擎解决方案,它包括Elasticsearch、Logstash和Kibana三个主要组件。Elasticsearch是一个实时分布式搜索和分析引擎,Logstash是一个数据收集、处理和传输工具,Kibana是一个用于可视化和分析数据的平台。在本篇文章中,我们将介绍如何使用ELK收集Windows日志。

准备工作

在开始之前,我们需要准备以下工具和环境:

  1. 一台运行Windows操作系统的计算机。
  2. 一台运行ELK堆栈的服务器,可以是物理服务器或虚拟机。
  3. Python编程环境。

下面是我们的目标:在Windows计算机上编写Python脚本,将特定的Windows事件日志发送到ELK堆栈,然后使用Kibana对日志进行可视化和分析。

安装ELK堆栈

首先,我们需要安装和配置ELK堆栈。请参考官方文档进行安装,具体步骤如下:

  1. 下载并安装Elasticsearch:[
  2. 下载并安装Logstash:[
  3. 下载并安装Kibana:[

安装完成后,确保Elasticsearch、Logstash和Kibana都已成功启动。

配置Logstash

Logstash是ELK堆栈中负责数据收集、处理和传输的组件。我们需要编写一个Logstash配置文件,以指定从Windows计算机收集哪些事件日志,并将其发送到Elasticsearch进行存储。

在Logstash的安装目录下创建一个名为logstash.conf的文件,并添加以下配置内容:

input {
  beats {
    port => 5044
  }
}
filter {
  if [source] =~ /^WinEventLog:/ {
    if [event_data][LogonType] == "10" {
      mutate {
        add_field => { "logon_type" => "RemoteDesktop" }
      }
    }
  }
}
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "windows-logs-%{+YYYY.MM.dd}"
  }
}

上述配置文件中,我们使用Beats插件作为输入,通过5044端口接收来自Windows计算机的日志数据。然后,我们使用条件语句对日志进行过滤,只保留LogonType为10的记录,并在Logstash中添加一个新的字段"logon_type"。最后,我们将过滤后的日志数据发送到Elasticsearch进行存储。

编写Python脚本

接下来,我们需要编写一个Python脚本,在Windows计算机上运行以收集特定的事件日志,并将其发送到Logstash。

import win32evtlog
import win32evtlogutil
import winerror
import socket
import json
import datetime

# 配置Logstash服务器的IP地址和端口
logstash_host = 'logstash_server_ip'
logstash_port = 5044

# 连接到事件日志
hand = win32evtlog.OpenEventLog(None, 'Security')

# 读取最新的事件日志记录
flags = win32evtlog.EVENTLOG_BACKWARDS_READ | win32evtlog.EVENTLOG_SEQUENTIAL_READ
events = win32evtlog.ReadEventLog(hand, flags, 0)

# 遍历事件日志记录
for event in events:
    event_id = event.EventID

    # 仅处理特定的事件ID
    if event_id == 4624:
        event_data = win32evtlogutil.SafeFormatMessage(event, 'Event ID: %d' % event_id)
        event_time = event.TimeGenerated.Format()
        computer_name = socket.gethostname()

        # 构建JSON格式的日志数据
        log_data = {
            'event_id': event_id,
            'event_data': event_data,
            'event_time': event_time,
            'computer_name': computer_name
        }

        # 将日志数据发送到Logstash
        logstash_data = json.dumps(log_data)
        sock = socket.socket(socket.AF_INET