Windows Sysmon日志通过NXLog发送到ELK

Sysmon对于安全监控来说非常好用,但Windows的事件查看器是条目形式出现,需要数据分析或者威胁分析的场景中通常需要将日志上报,这里记录下如何将Windows Sysmon日志通过NXLog发送到ELK当中。

Sysmon

Sysmon是一种Windows系统服务和设备驱动程序,以监视系统活动并将其记录到Windows事件日志中。它提供有关进程创建、网络连接和文件创建时间更改的详细信息。通过这些详细信息,可以进行数据分析或威胁分析。

1、下载Sysmon软件并解压

1
https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon

2、下载Sysmon模板并移动到第一步解压后的路径

1
https://github.com/SwiftOnSecurity/sysmon-config/blob/master/sysmonconfig-export.xml

3、以管理员权限打开cmd,进入到第一步解压后的路径,安装Sysmon

1
Sysmon64.exe -accepteula -i sysmonconfig-export.xml

4、打开Windows事件查看器,查看Sysmon日志,依照如下路径可找到:

1
事件查看器->应用程序和服务日志->Microsoft->Windows->Sysmon->Operational

可以看到其中的常规与详细信息。其中Windows Sysmon日志名称为Microsoft-Windows-Sysmon/Operational。这一点在后面会在NXLog中配置。

NXLog

NXLog是一个多平台日志管理解决方案,允许从各种来源收集日志、过滤日志事件、转换日志数据并将其路由到不同的目的地。其支持企业版和社区版,这里采用社区版本即可。关于企业版和社区版的对比可以查看如下文档:

1
https://nxlog.co/community-edition-vs-enterprise-edition

1、下载NXLog并安装

1
https://nxlog.co/downloads/nxlog-ce#nxlog-community-edition

2、在安装目录(比如:D:\Program Files\nxlog\conf)打开nxlog.conf文件:
1)添加Extension json扩展

1
2
3
4
5
6
7
8
9
10
11
12
<Extension _charconv>
Module xm_charconv
AutodetectCharsets iso8859-2, utf-8, utf-16, utf-32
</Extension>

<Extension _exec>
Module xm_exec
</Extension>

<Extension _json>
Module xm_json
</Extension>

2)在底部添加Sysmon日志发送的配置,其中包括Input、Output、Route三项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Input sysmon>
Module im_msvistalog
Query <QueryList> <Query Id="0"> <Select Path="Microsoft-Windows-Sysmon/Operational">*</Select> </Query></QueryList>
</Input>

<Output sysmonout>
Module om_udp
Host 192.168.126.144
Port 8777
Exec to_json();
</Output>

<Route udp1>
Path sysmon => sysmonout
</Route>

3、仍然以管理员权限打开cmd,启用NXLog服务

1
net start nxlog

这里可以使用其他syslog工具先进行测试后再配置Logstash的地址。另外这里我采用了json输出,处理起来会更为方便。

ELK配置

为了便于数据分析或者威胁分析,我们将日志写入到ELK中,先当成一个简单的SIEM使用。这里是通过Logstash接收NXLog发送的日志,经过处理后写入到ElasticSearch。

1、编写如下配置文件,放入Logstash的pipeline配置目录中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost docker-elk]# cat Logstash/pipeline/windows_nxlog.conf 
input {
udp {
port => "8777"
}
}

filter {
json {
source => "message"
target => "content"
}
mutate {
remove_field => ["@version", "host", "message"]
}
}

output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "Logstash_internal"
password => "${Logstash_INTERNAL_PASSWORD}"
index => "windows-nxlog"
}
}

在这有一点值得注意的是,如果和我一样使用了docker版本的Logstash:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
logstash:
build:
context: logstash/
args:
ELASTIC_VERSION: ${ELASTIC_VERSION}
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro,Z
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro,Z
ports:
- 5044:5044
- 8777:8777/tcp
- 50000:50000/tcp
- 50000:50000/udp
- 8777:8777/udp
- 9600:9600
environment:
LS_JAVA_OPTS: -Xms256m -Xmx256m
LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
networks:
- elk
depends_on:
- elasticsearch
restart: unless-stopped

需要注意以下容易被忽略的两点:
1)注意ports映射端口时增加tcp、udp协议
2)调整docker-compose.yml前,先执行docker-compose stop logstash,等编辑完成后重新执行

1
docker-compose up -d logstash

2、重新启动Logstash后,即可进行端口监听和将数据写入ElasticSearch当中。

到这里就可以直接通过Kibana去查询或者创建Dashboard进行不同维度的分析工作了。

参考

1、https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon
2、https://github.com/SwiftOnSecurity/sysmon-config
3、https://docs.nxlog.co/integrate/windows-eventlog.html
4、https://docs.nxlog.co/integrate/syslog.html
5、https://nxlog.co/community-forum/t/535-how-to-parse-json-logs-to-syslog-format
6、https://docs.nxlog.co/refman/current/xm/json.html

0%