DoubleCloud 即将关闭。使用限时免费迁移服务迁移到 ClickHouse。立即联系我们 ->->

博客 / 工程

使用 Fluent Bit 将 Windows 事件日志发送到 ClickHouse

author avatar
Arnold van Wijnbergen
2023 年 1 月 17 日

fluentbit-windows-events.png

以下是 Arnold van Wijnbergen 的一篇客座博客文章。Arnold van Wijnbergen 是云原生技术的顾问、架构师、首席专家和主题专家,尤其是在可观察性方面。您几乎可以在阿姆斯特丹附近所有有趣的聚会上找到他,这些聚会涵盖有趣的 DevSecOps、云原生或持续交付主题。

介绍

在本篇文章中,我们将继续介绍使用 Fluent Bit 将日志数据发送到 ClickHouse Cloud 的系列文章。虽然本系列文章之前的博客文章是关于 NginxKubernetes 日志的,但本篇文章重点介绍威胁狩猎用例。简而言之,我们将解释为 Microsoft Windows 设置高级日志分析是多么容易。我们感兴趣的主要数据源是 Windows 事件日志,它在这些年来已经发生了重大发展。我们还将研究使用 SysInternals 中名为 Sysmon 的工具扩展 Windows 日志收集。目标是识别恶意或异常活动,并了解入侵者和恶意软件如何在我们的网络上运行。随着 ClickHouse 成为越来越受欢迎的接收日志的后台,这在天堂中是一场完美匹配,尤其是在使用 Fluent Bit 时,Fluent Bit 提供了一种简单且开箱即用的方式来收集相关数据。

您将学习 Windows 事件日志的基础知识、如何在 Windows 事件日志收集中部署 Fluent Bit 以及为将日志数据存储在 ClickHouse 中创建简单的模式。此外,您将逐步了解如何使用社区模板配置 Sysmon 来设置高质量的事件跟踪,并使用 SysmonSimulator(另一个很棒的开源计划)模拟某些事件。

环境

  • Microsoft Windows Server 2022
  • Fluent Bit v2.0.6
  • Sysmon v14.13
  • SysmonSimulator v0.2

对于 ClickHouse,我们建议您尝试使用我们的无服务器 ClickHouse Cloud,它有一个慷慨的免费试用版,足以遵循本博客文章。Developer 服务应该足以满足本篇文章中的示例。或者,所有说明都应该与 22.6 及更高版本的自托管版本兼容。为了构建实际的可视化效果,我们将使用 Grafana Cloud,使用官方的 ClickHouse 插件

Windows 事件日志的基础知识

任何使用过 Windows 的人都知道著名的 Windows 事件查看器。它是您必须了解的标准工具之一,当您使用系统、应用程序或安全日志调查问题时。鲜为人知的是,在这些年来,经典模型 (EVT 格式) 已发展为一个丰富的 'winevtlog.h' (EVTX 格式),现在具有完整的 API 支持,并进行了许多高级改进。这为应用程序和服务特定的日志通道提供了支持,这些通道由 'Sysmon' 等工具使用。

Fluent Bit 是一个数据收集器,支持这种格式,可以帮助我们收集有用的日志以进行分析并识别潜在的威胁。

使用 Sysmon 事件检测安全威胁

除了丰富的审核策略外,大多数安全工程师更喜欢使用 Sysmon 来识别威胁。SysmonSysInternals(现在是微软的一部分)开发,它提供了设备驱动程序和正在运行的服务提供的先进内核功能。安装后使用给定的配置,它将开始监控和记录系统活动,例如进程创建、网络连接、注册表操作等等。因为它可以作为 Windows 事件日志通道无缝集成,因此我们可以轻松地使用 Fluent Bit 将这些日志传输到 ClickHouse 中。

最新版本可以从 这里下载。只需将 ZIP 文件解压缩到目录中,例如 'C:\Tools\Sysmon'。

解压缩后,您可以使用默认配置设置启动安装。

sysmon.exe -accepteula -i

社区将开源汇集在一起

默认的 Sysmon 配置可以被认为是基础。幸运的是,社区成员和安全专家 'SwiftOnSecurity'(我的天哪,不是泰勒·斯威夫特 ;))维护着一个高质量的事件跟踪配置,它与 MITRE ATT&CK® 矩阵 技术相一致。安装很容易 - 只需从 github 下载最新版本并应用配置即可。

sysmon.exe -c sysmonconfig-export.xml

使用 Fluent Bit 收集、处理和插入

太棒了,我们已经设置好了一切,可以使用 Fluent Bit 收集、处理和分发。Fluent Bit 是一个 CNCF 毕业项目,是一个基于简单配置文件的轻量级工具,可以轻松帮助我们为处理所有生成的事件设置数据管道。在这种情况下,我们将选择使用 ZIP 包设置 Fluent Bit,但我们也可以选择使用安装程序或容器映像。

从下载正确的安装包开始,例如 已发布的 ZIP 包,然后解压缩存档。

Expand-Archive .\fluent-bit-2.0.6-win64.zip C:\Tools

展开 ZIP 包后,是时候扩展 conf/fluent-bit.conf 中的默认管道配置了,如下所示,以配置我们的 输入过滤器输出

[INPUT] Name winevtlog Channels Microsoft-Windows-Sysmon/Operational,Security Interval_Sec 1 DB winevtlog.sqlite [FILTER] Name nest Match * Operation nest Wildcard * Nest_under log [OUTPUT] name http tls on match * host <> port 8443 URI /?query=INSERT+INTO+<>.<>+FORMAT+JSONEachRow&async_insert=1 format json_stream json_date_key timestamp json_date_format epoch http_user << For demo purposes you can use ‘default’ >> http_passwd <>

有关输出配置的详细信息,特别是 URI 参数,我们建议您阅读我们之前关于 Fluent Bit 的博客文章 这里这里

注意 URI 中使用 async_insert=1 设置。这将启用 异步插入,并且是使用 Fluent Bit 与 ClickHouse 配合时重要的配置设置。有关更多详细信息,请参阅 这里

启动 ClickHouse 服务并创建表

现在我们已经准备好 Fluent Bit 来收集和转发日志,我们需要部署 ClickHouse 并创建数据库。使用 ClickHouse Cloud,只需单击几下即可创建服务来轻松完成此操作。

create-cloud-service.gif

创建服务后,您可以通过单击 '连接'、'查看连接字符串' 来查看连接详细信息。将这些详细信息复制到安全的地方,因为您稍后需要它们才能完成 Fluent Bit 输出部分。

copy-cloud-credentials.gif

创建后,我们可以创建数据库本身。这需要 ClickHouse Cloud 团队启用 JSON 对象类型,因为它仍然处于实验阶段。这可以通过打开支持票来完成。

如果您运行的是自己的自托管实例,只需设置以下标志。

SET allow_experimental_object_type = 1

现在创建数据库。
CREATE DATABASE eventlogs;

启用 JSON 对象类型后,您可以开始配置用于存储 Windows 事件日志数据的列。您可以选择将特定字段(如 Computername)映射到显式列 _并使用更优化的 ClickHouse 类型,例如 LowCardinality 来通过减少 I/O 来提高压缩和查询性能。这些映射的列也可以用于表的 ORDER BY 密钥,这对于提供 最佳查询性能 至关重要。

为了评估目的,JSON 类型很有用,因为字段是动态映射的。请记住,对于生产场景,您应该将 JSON 对象类型限制为更少的字段。请将预期的和常用的列在您的模式中定义明确并进行调整,以遵循最佳实践。请参阅 此处 以及我们最近关于 构建可观察性解决方案 的博客文章,以获取更多详细信息。

现在,我们将保持简单,只添加日志列。

CREATE TABLE eventlogs.jsonlogs ( timestamp DateTime, log JSON ) Engine = MergeTree ORDER BY tuple()

请注意,这里我们没有在 `ORDER BY` 键中添加任何列,而是使用 `tuple()`。我们建议您在此处显式声明与您的访问模式匹配的列,以便在生产环境中使用。

现在,您可以为 Fluent Bit 输出部分填写空白。请勿忘记之前保存的连接详细信息。

[OUTPUT] name http tls on match * host <> port 8443 URI /?query=INSERT+INTO+eventlogs.jsonlogs+FORMAT+JSONEachRow&async_insert=1 format json_stream json_date_key timestamp json_date_format epoch http_user << For demo purposes you can use ‘default’ >> http_passwd <>

可视化 Windows 事件日志数据

目前,一切都已准备就绪。现在我们必须启动 Fluent Bit 代理。我们将使用 CLI,但您也可以将其 配置为服务

./bin/fluent-bit -c conf/fluent-bit.conf

您会注意到 Fluent Bit 打开了几个连接到 ClickHouse 服务的连接。您可以使用 Cloud SQL 控制台查看数据是否正在进入您的 ClickHouse 服务。

SELECT * FROM eventlogs.jsonlogs;

sql-console-results.png

另一种查询数据的有效方法是使用 format JSONEachRow 选项,特别是在您使用 ClickHouse 客户端并希望使用 `jq` 来美化终端中的结果时。

~/clickhouse client --host --secure --password --query "SELECT * FROM eventlogs.jsonlogs LIMIT 1 FORMAT JSONEachRow" | jq { "timestamp": "2023-01-17 12:51:01", "log": { "ActivityID": "", "Channel": "Microsoft-Windows-Sysmon/Operational", "Computer": "EC2AMAZ-LPA5TA4", "EventID": 1, "EventRecordID": 483, "Keywords": "0x8000000000000000", "Level": 4, "Message": "Process Create:\r\nRuleName: -\r\nUtcTime: 2023-01-17 12:50:59.303\r\nProcessGuid: {f51ddac1-99b3-63c6-bb01-00000000e100}\r\nProcessId: 5216\r\nImage: C:\\fluent\\fluent-bit-2.0.6-win64\\bin\\fluent-bit.exe\r\nFileVersion: 2.0.6.0\r\nDescription: Compiled with MSVC 19.29.30146.0\r\nProduct: Fluent Bit - Fast and Lightweight Logs and Metrics processor for Linux, BSD, OSX and Windows\r\nCompany: Calyptia Inc.\r\nOriginalFileName: -\r\nCommandLine: fluent-bit.exe -c ../conf/fluent-bit.conf\r\nCurrentDirectory: C:\\fluent\\fluent-bit-2.0.6-win64\\bin\\\r\nUser: EC2AMAZ-LPA5TA4\\Administrator\r\nLogonGuid: {f51ddac1-8b43-63c6-6de9-0c0000000000}\r\nLogonId: 0xCE96D\r\nTerminalSessionId: 2\r\nIntegrityLevel: High\r\nHashes: MD5=4A19C3D18B025F49AA157FD2D360283A,SHA256=7511D65D0FB9FF2590C37E0C7C6150250A78E0D0BAFAB1473A97667AA5ADCA16,IMPHASH=654B204441EFA0776C100878702194C3\r\nParentProcessGuid: {f51ddac1-8d06-63c6-4d01-00000000e100}\r\nParentProcessId: 7720\r\nParentImage: C:\\Windows\\System32\\cmd.exe\r\nParentCommandLine: \"C:\\Windows\\system32\\cmd.exe\" \r\nParentUser: EC2AMAZ-LPA5TA4\\Administrator", "Opcode": 0, "ProcessID": 7536, "ProviderGuid": "{5770385F-C22A-43E0-BF4C-06F5698FFBD9}", "ProviderName": "Microsoft-Windows-Sysmon", "Qualifiers": "", "RelatedActivityID": "", "StringInserts": [ "-", "2023-01-17 12:50:59.303", "{F51DDAC1-99B3-63C6-BB01-00000000E100}", "5216", "C:\\fluent\\fluent-bit-2.0.6-win64\\bin\\fluent-bit.exe", "2.0.6.0", "Compiled with MSVC 19.29.30146.0", "Fluent Bit - Fast and Lightweight Logs and Metrics processor for Linux, BSD, OSX and Windows", "Calyptia Inc.", "-", "fluent-bit.exe -c ../conf/fluent-bit.conf", "C:\\fluent\\fluent-bit-2.0.6-win64\\bin\\", "EC2AMAZ-LPA5TA4\\Administrator", "{F51DDAC1-8B43-63C6-6DE9-0C0000000000}", "0xce96d", "2", "High", "MD5=4A19C3D18B025F49AA157FD2D360283A,SHA256=7511D65D0FB9FF2590C37E0C7C6150250A78E0D0BAFAB1473A97667AA5ADCA16,IMPHASH=654B204441EFA0776C100878702194C3", "{F51DDAC1-8D06-63C6-4D01-00000000E100}", "7720", "C:\\Windows\\System32\\cmd.exe", "\"C:\\Windows\\system32\\cmd.exe\" ", "EC2AMAZ-LPA5TA4\\Administrator" ], "Task": 1, "ThreadID": 7456, "TimeCreated": "2023-01-17 12:50:59 +0000", "UserID": "S-1-5-18", "Version": 5 } }

好奇推断的 JSON 架构吗?只需运行以下 SQL 查询。
DESCRIBE TABLE eventlogs.jsonlogs FORMAT Vertical SETTINGS describe_extend_object_types = 1 Row 1: ────── name: timestamp type: DateTime default_type: default_expression: comment: codec_expression: ttl_expression: Row 2: ────── name: log type: Tuple(ActivityID String, Channel String, Computer String, EventID Int16, EventRecordID Int32, Keywords String, Level Int8, Message String, Opcode Int8, ProcessID Int16, ProviderGuid String, ProviderName String, Qualifiers String, RelatedActivityID String, StringInserts Array(String), Task Int16, ThreadID Int16, TimeCreated String, UserID String, Version Int8) default_type: default_expression: comment: codec_expression: ttl_expression: 2 rows in set. Elapsed: 0.001 sec.

Grafana 用于数据可视化

现在,我们可以开始在 ClickHouse 数据之上创建数据可视化和仪表盘。为此,我们将利用 Grafana 的 ClickHouse 插件。此插件可在 Grafana 云 免费层中使用。您可以将此插件添加为数据源,并使用之前的连接详细信息进行实际配置。当“保存并测试”成功时,您就成功配置了数据源。 此视频 简要介绍了将 Grafana 连接到 ClickHouse。

我们想要显示的一些有趣的指标包括每个 EventID 发生的 Sysmon 事件的各种计数,例如,22 用于 DNS 事件。另一个有趣的指标可以是安全通道中记录的审核失败的百分比。

为了方便起见,我已经创建了一个示例仪表盘,可以在我的 GitHub 中 下载

作为参考,这是在 Grafana 的 Explorer 视图中执行的完整示例 SQL 查询

SELECT timestamp AS log_time, log.Message AS Message, log.Channel AS Channel, log.Computer AS Computer, log.EventID AS EventID, log.TimeCreated AS TimeCreated, log.ActivityID AS ActivityID, log.EventRecordID AS EventRecordID, log.Keywords AS Keywords, log.Level AS SeverityLevel, log.Opcode AS OPcode, log.ProcessID AS ProcessID, log.ProviderGuid AS ProviderGuid, log.ProviderName AS ProviderName, log.Qualifiers AS Qualifiers, log.RelatedActivityID AS RelatedActivityID, log.StringInserts AS StringInserts, log.Task AS Task, log.ThreadID AS ThreadID, log.UserID AS UserID, log.Version AS Version FROM eventlogs.jsonlogs LIMIT 100

log-view-grafana-windows-events.png

测试稳定性和性能

使用 SysmonSimulator 模拟威胁狩猎场景

当没有数据或潜在的安全威胁出现时,观看仪表盘并不令人兴奋。这就是我们将使用 SysmonSimulator 的原因,它是由 Scarred Monk 创建的。此工具的二进制文件可以从 此处 下载。

此模拟器与 Sysmon 协同工作以模拟几个潜在的安全威胁。为了获得最佳体验,您可以使用 配置文件,该文件在 SysmonSimulator 存储库中提供。

请注意,Microsoft Defender 可能将此工具阻止为潜在风险,因此您可能需要接受此风险;否则,下载和执行将被阻止。

sysmon.exe -c SysmonSimulatorconfig.xml

启动模拟很简单。只需使用标志“ -all”执行。为了方便起见,您可以使用以下 PowerShell 单行代码。

While ($True -eq “True”) { ./SysmonSimulator -all}

在启动模拟器进程后,我们的 Grafana 仪表盘将填充更多有趣的数据。

grafana_windows_events.png

扩展

为了验证我们解决方案的性能,我们使用了另一个工具来摄取大量 Windows 事件日志。在使用 Linux 日志时,我们更喜欢使用 lignator 模拟日志生成,但在这种情况下,我们需要直接摄取到 Windows 事件日志。

为了自动化此用例,我们使用了一个名为 goeventgen 的 GitHub 工具,该工具由 Andrew Krohu 创建。作为输入,您可能需要使用大量的 日志行集合 进行处理。此集合约为 28 GB,非常适合性能测试目的。

只需下载发布的可执行文件,并在提取 Windows.log 后执行以下命令。

.\goeventgen-amd64.exe -source TestSource -f .\Windows.log

执行后,您将获得处理持续时间和总事件的摘要。在我们的测试实例上,我们获得了约 3000 eps,这对于一台小型 Windows 2022 VM 来说已经很不错了。这里最大的瓶颈是主机 VM 上的可用 CPU 资源。这代表了 ClickHouse 和 Fluent Bit 的非常小的吞吐量,它们都能够扩展到每秒数百万个事件。

结论

此博客展示了使用 ClickHouse、Grafana 和 Fluent Bit 和 Sysmon 等工具设置 Windows 安全堆栈是多么容易。我们介绍了 ClickHouse 使用 JSON 类型进行动态字段映射的功能,并解释了这种功能在哪些情况下会有所帮助。除了设置外,我们还使用 SysmonSimulator 模拟了潜在的安全威胁,最后使用 Grafana 对细节进行可视化和深入研究。此外,我们还执行了一系列大型事件,以验证性能和稳定性。在此过程中,我们甚至没有达到 ClickHouse 或 Fluent Bit 的限制,而是达到了 Windows 实例资源的限制。

通过计算数据,我们声称每个事件平均约为 14 字节,而存储 Windows 事件日志则需要 200 字节。这相当于 1/14 的压缩率,并且与 其他测试 一致。这表明 ClickHouse 在存储日志方面非常高效,并可能带来可观的成本节省!

简而言之,我们可以得出结论,ClickHouse 在存储和性能方面非常高效,是用于存储日志的面向列的数据库,并且可以与其他工具很好地集成,复杂性很低。

分享这篇文章

订阅我们的时事通讯

随时了解功能发布、产品路线图、支持和云产品!
正在加载表单...
关注我们
Twitter imageSlack imageGitHub image
Telegram imageMeetup imageRss image