本文写于本科毕设期间,是对winlogbeat官方文档的学习,不做他用,仅以此来记录我的毕设之旅。

winlogbeat概述

将windows事件发送到elasticsearch或者logstash,本次毕设将winlogbeat连接到elasticsearch,是一个windows服务。
使用windows API读取一个或者多个日志,根据用户自定义规则来过滤威胁事件日志,并且将事件发送到Elasticsearch

Winlogbeat 可以从系统上运行的任何事件日志中捕获事件数据,例如:
application events 应用程序事件
hardware events 硬件事件
security events 安全事件
system events 系统事件

winlogbeat本质是一个轻量的Beat,基于libbeat框架。
由于只用来实验用,因此没有对winlogbeat设置密码

winlogbeat命令

export 将配置、索引模板、 ILM 策略或指示板导出到 stdout,可以使用此命令快速查看您的配置,查看索引模板和 ILM 策略的内容,或者从 Kibana 导出一个仪表板
在这里插入图片描述
参数——
config:winlogbeat.yml配置信息

dashboard:导出一个指示板。您可以使用此选项将仪表板存储在模块中的磁盘上并自动加载它。例如,要将仪表板导出到 JSON 文件,请运行:

winlogbeat export dashboard --id="DASHBOARD_ID" > dashboard.json

要查找 DASHBOARD _ id,请查看 Kibana 的 DASHBOARD 的 URL。默认情况下,export 仪表板将仪表板写入 stdout。该示例演示如何将仪表板写入 JSON 文件,以便以后可以导入它。JSON 文件将包含所有可视化和搜索的仪表板。

dashboard id:显示在url中的一串字符

要加载 dashboard,请将生成的 dashboard.json 文件复制到 Winlogbeat 的 kibana/6/dashboard 目录,并运行

Winlogbeat setup -- dashboards 

导入 dashboard

template: 导出模板, --dir="temp"指定导出文件的位置

help 帮助
keystore 管理密钥
run 运行winlogbeat
参数——
-n:该选项禁用除文件输出以外的所有输出
–cpuprofile FILE:将CPU profile数据写入指定文件。这个选项对于排除Winlogbeat故障很有用。
—httpprof [HOST]:PORT:启动http服务器进行分析。这个选项对于排除故障和分析Winlogbeat非常有用。
–memprofile FILE:将内存配置文件数据写入指定的输出文件。这个选项对于排除Winlogbeat故障很有用

setup 设置初始环境,包括索引模板、 ILM 策略和写别名,以及 Kibana 仪表板
参数——
–dashboards:设置Kibana仪表板。这个选项从Winlogbeat包中加载仪表板。
–index-management:设置与Elasticsearch索引管理相关的组件,包括模板、ILM策略和写别名

winlogbeat setup --dashboards
winlogbeat setup --machine-learning
winlogbeat setup --index-management

test 测试配置

winlogbeat test SUBCOMMAND [FLAGS]

参数——
config:测试配置信息
output:测试Winlogbeat是否可以通过使用当前设置连接到输出
version 版本

全局参数:
-E:覆盖特定的配置设置。可以指定多个重写
例如

winlogbeat -E "name=mybeat" -E "output.elasticsearch.hosts=['http://myhost:9200']"

此设置应用于当前运行的Winlogbeat进程。Winlogbeat配置文件未修改。

-c:指定用于Winlogbeat的配置文件。 在此处指定的文件是相对于path.config的。 如果未指定-c标志,则使用默认配置文件winlogbeat.yml。

-d:为指定的选择器启用调试。 对于选择器,您可以指定一个逗号分隔的组件列表,也可以使用-d“ *”启用所有组件的调试。 例如,-d“ publish”显示所有与“ publish”相关的消息。

-e:登录到stderr并禁用syslog /文件输出。

winlogbeat配置文件

默认的配置文件名为 winlogbeat.yml

winlogbeat

该部分指定了要监视的事件日志列表,例如:

name: Application
    ignore_older: 72h
name: System
name: Security

可以在 winlogbeat.yml 配置文件的 winlogbeat 部分指定以下选项:
registry_file: Winlogbeat存储信息的文件名,这些信息用于重启后恢复监控。默认情况下,该文件存储为.winlogbeat.yml

winlogbeat.registry_file: C:/ProgramData/winlogbeat/.winlogbeat.yml

shutdown_timeout :关闭时等待发布所有事件的时间,也就是关闭迟延。默认情况下没有关闭超时,因此 Winlogbeat 将不等待就停止,重新启动时,它将从每个事件日志中上次成功发布的事件中恢复。
有效时间单位为 ns,us,ms,s,m,h

winlogbeat.shutdown_timeout: 30s

event_logs:指定要监视的事件日志。列表中的每个条目都定义了要监视的事件日志,以及与事件日志相关联的任何信息(筛选器、标记等)。Name 字段是每个事件日志唯一需要的字段。

winlogbeat.event_logs:
	- name: Application

event_logs.batch_read_size:单个批处理读取的事件日志记录的最大数量。默认批处理大小为100。如果值大于1024,大多数 Windows 版本将返回一个错误。此选项仅适用于支持 Windows 事件日志 API (vista or newer)的操作系统

单个批处理:Winlogbeat 启动一个 goroutine (一个轻量级线程)来读取每个单独的事件日志。Goroutine 使用 Windows API 读取一批事件日志记录,将任何处理器应用于事件,将它们发布到配置的输出,并在读取其他事件日志记录之前等待输出的确认。

event_logs.name:定义要监视的事件日志的名称。Event _ logs 下的每个字典都必须有一个 name 字段。您可以通过在 PowerShell 中运行

Get-EventLog *

来获得可用的事件日志列表。下面是命令输出的一个例子:

在这里插入图片描述
如果在 windows vista 或更新版本上运行,还可以指定通道名称。通道是一个已命名的事件流,它将事件从事件源传输到事件日志。大多数渠道都与特定的事件发布者相关联。下面是一个示例,说明如何使用 PowerShell 列出所有通道

 Get-WinEvent -ListLog * | Format-List -Property LogName

在这里插入图片描述
必须在配置文件中指定通道的全名。

winlogbeat.event_logs:
  - name: Microsoft-Windows-Windows Firewall With Advanced Security/Firewall

在这里插入图片描述
一定要注意添加时要一一对应。

另外,要从归档的.evtx文件中读取事件,可以将名称指定为文件的绝对路径:

winlogbeat.event_logs:
  - name: 'C:\backup\sysmon-2019.08.evtx'

event_logs.ignore_older:如果指定了此选项,则Winlogbeat将筛选早于指定时间的事件,当开始监视包含要忽略的旧记录的事件日志时,此选项非常有用。

winlogbeat.event_logs:
 - name: Application
   ignore_older: 168h

忽略此前168小时的旧记录。

event_logs.forwarded:一个布尔标志,指示日志仅包含使用 Windows 事件收集器从远程主机收集的事件。 ForwardedEvents 日志的默认值为 true,其他任何日志的默认值为 false。此选项仅适用于支持 Windows 事件日志 API (microsoftwindowsvista 和更新版本)的操作系统。当值为 true 时,Winlogbeat 不会尝试使用主机上的消息文件呈现事件.

event_logs.event_id:event id 的白名单和黑名单。该值是一个以逗号分隔的列表。接受的值是要包括的单个event id (例如4624)、要包括的事件 id 范围(例如4700-4800)和要排除的单个event id (例如-4735)。

winlogbeat.event_logs:
 - name: Security
   event_id: 4624, 4625, 4700-4800, -4735

指定id数目上限为22个。如果您有超过22个事件 id,您可以使用 drop _ event Winlogbeat 从 Windows 接收事件之后进行过滤,从而解决 Windows 的这个限制。下面显示的过滤器等效于事件 id: 903,1024,4624,但是可以扩展到22个事件 id 以外。

winlogbeat.event_logs:
 - name: Security
   processors:
     - drop_event.when.not.or:
       - equals.winlog.event_id: 903
       - equals.winlog.event_id: 1024
       - equals.winlog.event_id: 4624

event_logs.level:要包括的事件级别列表。该值是一个以逗号分隔的级别列表

levelValue
critical/crit1
error/err2
warning/warn3
information, info0 or 4
verbose5
winlogbeat.event_logs:
  - name: Security
    level: critical, error, warning

event_logs.provider:要包含的提供程序(源名称)列表。该值是一个 YAML 列表。可以使用 PowerShell 获得与日志关联的提供程序列表。下面的示例显示与 Security 日志关联的提供程序。

(Get-WinEvent -ListLog Security).ProviderNames

在这里插入图片描述
event_logs.include_xml:布尔选项,用于控制事件的原始 XML 表示是否包含在由 Winlogbeat 发送的数据中。默认值为 false。事件的 XML 表示对于故障排除非常有用。可以将 Winlogbeat 报告的字段中的数据与 XML 中的数据进行比较,以诊断问题。

event_logs.tags:Beat 在每个发布事件的 tags 字段中包含的标记列表。标签可以很容易地在 Kibana 选择特定的事件或者在 Logstash 应用条件过滤。这些标记将被添加到常规配置中指定的标记列表中。

winlogbeat.event_logs:
  - name: CustomLog
    tags: ["web"]

event_logs.fields: 表示可选字段,可以指定这些字段向输出添加附加信息。例如,您可以添加可用于筛选事件数据的字段。字段可以是标量值、数组、字典或这些的任何嵌套组合。默认情况下,您在这里指定的字段将分组在输出文档中的字段子词典下。

winlogbeat.event_logs:
 - name: CustomLog
   fields:
     customer_id: 51415432

表示这个事件的用户id为51415432

event_logs.fields_under_root:如果此选项设置为 true,则自定义字段将作为顶级字段存储在输出文档中,而不是分组到字段子字典中。如果自定义字段名与 Winlogbeat 添加的其他字段名发生冲突,则自定义字段将覆盖其他字段。
event_logs.processors:应用于事件日志生成的数据的处理器列表

event_logs.index:如果存在,此格式化字符串将覆盖此事件日志中事件的索引(用于 elasticsearch 输出) ,或者设置事件元数据的 raw _ index 字段(用于其他输出)。该字符串只能引用代理名称、版本和事件时间戳; 要访问动态字段,请使用 output.elasticsearch.index 或processors.

"%{[agent.name]}-myindex-%{+yyyy.MM.dd}" 

可扩展为

"winlogbeat-myindex-2019.12.13"

event_logs.keep_null:如果此选项设置为 true,则将在输出文档中发布具有空值的字段。默认情况下,将 keep _ null 设置为 false。

event_logs.no_more_event

event_logs.api

ILM

索引生命周期管理(ILM)功能,在 Winlogbeat 索引变老时对其进行管理。当现有索引达到指定的大小或年龄时,使用index生命周期策略自动切换到新索引,而不是创建每日索引(其中索引大小可以根据Beat的数量和发送的事件数量而变化

peocessor

每个处理器接收一个事件,将一个已定义的操作应用于该事件,并返回该事件。如果定义一个处理器列表,它们将按照在 Winlogbeat 配置文件中定义的顺序执行。
例如,下面的筛选器配置删除了几个很少使用的字段(provider _ guid、 process _ id、 thread _ id 和 version)和一个嵌套字段 event _ data

processors:
  - drop_fields:
      fields: [winlog.provider_guid, winlog.process.pid, winlog.process.thread.id, winlog.version, winlog.event_data.ErrorSourceTable] 

定义一系列的过滤条件

internal queue

定义事件队列:在发布事件之前,Winlogbeat 使用内部队列来存储事件。队列负责缓冲并将事件组合成可由输出消耗的批处理。输出将使用批量操作在一个事务中发送一批事件。
这个示例配置将内存队列设置为缓冲最多4096个事件:

queue.mem:
  events: 4096

导出/安装模板

安装:

Invoke-RestMethod -Method Put -ContentType "application/json" -InFile winlogbeat.template.json -Uri http://localhost:9200/_template/winlogbeat-7.10.2

导出:

PS > .\winlogbeat.exe export template --es.version 7.10.2 | Out-File -Encoding UTF8 winlogbeat.template.json

使用节点解析数据

当您使用 Elasticsearch 输出时,您可以配置 Winlogbeat 使用摄取节点在 Elasticsearch 进行实际索引之前对文档进行预处理。当您希望对数据执行一些额外的处理,但不需要 Logstash 的全部能力时,摄取节点是一个方便的处理选项。例如,您可以在 Elasticsearch 创建摄取节点管道,该管道由一个处理器组成,该处理器移除文档中的字段,然后由另一个处理器重命名字段。

在 Elasticsearch 定义管道之后,只需配置 Winlogbeat 使用管道。要配置 Winlogbeat,您可以在 Winlogbeat.yml 文件中 elasticsearch 下的 parameters 选项中指定管道 ID:

output.elasticsearch:
  hosts: ["localhost:9200"]
  pipeline: my_pipeline_id

例如,假设您在一个名为 pipeline.json 的文件中定义了以下管道:

{
    "description": "Test pipeline",
    "processors": [
        {
            "lowercase": {
                "field": "agent.name"
            }
        }
    ]
}

要在 Elasticsearch 增加管道,你需要运行:

curl -H 'Content-Type: application/json' -XPUT 'http://localhost:9200/_ingest/pipeline/test-pipeline' -d@pipeline.json

然后在 winlogbeat.yml 文件中指定:

output.elasticsearch:
  hosts: ["localhost:9200"]
  pipeline: "test-pipeline"

YAML语法——待学习

模块

ForwardedEvents

可以包含来自多个生产者的事件,因此您可能希望使用多个模块。这可以通过应用由条件 when 语句保护的多个脚本处理器来实现。

powershell

PowerShell 模块处理来自 Microsoft-Windows-PowerShell/Operational 和 Windows PowerShell 日志的事件日志记录。

对以下事件 id 进行了转换:
400 - Engine state is changed from None to Available.
400-引擎状态从无更改为可用
403 - Engine state is changed from Available to Stopped. 403-引擎状态从“可用”改为“停止”
600 - A Provider is Started.
600 - 提供者启动
800 - Pipeline executed.
800-管道已执行
4103 - Module logging.
4103-模块日志记录
4104 - Script block logging.
4104 - 脚本块日志记录
4105 - Command started.
4105-命令开始
4106 - Command completed.
4106 - 命令完成

默认情况下,模块和脚本块日志记录(事件 ID 的410x)是禁用的,你可以通过“ Windows PowerShell”GPO 设置和设置“打开模块日志记录”和“打开 PowerShell 脚本块日志记录”来启用它们。

security

该模块对以下事件 id 进行了转换:
1100 - The event logging service has shut down.
1100 - 事件记录服务已经关闭
1102 - The audit log was cleared.
1102 - 审计日志已清除
1104 - The security log is now full.
1104 - 安全日志已满
1105 - Event log automatic backup.
1105 - 事件日志自动备份
1108 - The event logging service encountered an error while processing an incoming event published from %1
1108 - 事件日志记录服务在处理从% 1发布的传入事件时遇到错误
4624 - An account was successfully logged on.
4624 - 一个帐户成功登录
4625 - An account failed to log on.
4625 - 帐户登录失败
4634 - An account was logged off.
4634 - 一个账户被注销了
4647 - User initiated logoff (interactive logon types).
4647 - 用户发起注销(交互式登录类型)
4648 - A logon was attempted using explicit credentials.
4648 - 尝试使用显式凭据登录
4672 - Special privileges assigned to new logon.
4672 - 分配给新登录的特权
4673 - A privileged service was called.
4673 - 调用了一个特权服务
4674 - An operation was attempted on a privileged object. 在特权对象上尝试了一个操作
4688 - A new process has been created.一个新的过程已经创建
4689 - A process has exited. 进程已退出
4697 - A service was installed in the system. 系统中安装了一项服务
4698 - A scheduled task was created.创建了一个预定的任务
4699 - A scheduled task was deleted. 删除了一个预定的任务
4700 - A scheduled task was enabled 启用了预定的任务
4701 - A scheduled task was disabled. 计划中的任务被禁用
4702 - A scheduled task was updated. 更新了预定的任务
4719 - System audit policy was changed. 系统审计政策有所改变
4720 - A user account was created. 创建了一个用户帐户
4722 - A user account was enabled. 启用了一个用户帐户
4723 - An attempt was made to change an account’s password.有人试图更改帐户密码
4724 - An attempt was made to reset an account’s password. 有人试图重置帐户密码
4725 - An user account was disabled.用户帐户被禁用
4726 - An user account was deleted. 一个用户帐户被删除
4727 - A security-enabled global group was created. 创建了一个启用安全性的全局组
4728 - A member was added to a security-enabled global group.一个成员被添加到一个安全启用的全球组
4729 - A member was removed from a security-enabled global group. 一个成员被从启用安全功能的全球组中删除
4730 - A security-enabled global group was deleted.一个启用安全性的全局组被删除
4731 - A security-enabled local group was created.创建了一个启用安全性的本地组
4732 - A member was added to a security-enabled local group.一个成员被添加到启用安全性的本地组
4733 - A member was removed from a security-enabled local group. 从启用安全的本地组中删除了一个成员
4734 - A security-enabled local group was deleted. 安全启用的本地组被删除
4735 - A security-enabled local group was changed. 启用安全的本地组被更改
4737 - A security-enabled global group was changed.一个安全启用的全局组被更改
4738 - An user account was changed. 用户帐户被更改
4740 - An user account was locked out. 一个用户帐户被锁定
4741 - A computer account was created. 创建了一个计算机帐户
4742 - A computer account was changed. 计算机帐户被更改
4743 - A computer account was deleted.一个电脑帐户被删除
4744 - A security-disabled local group was created.创建了一个安全禁用的本地组
4745 - A security-disabled local group was changed. 安全禁用的本地组被更改
4746 - A member was added to a security-disabled local group.一个成员被添加到一个安全无效的本地组
4747 - A member was removed from a security-disabled local group. 一名成员被从一个安全无效的当地组织中清除出去
4748 - A security-disabled local group was deleted. 一个安全无效的本地组被删除
4749 - A security-disabled global group was created. 4749-创建了一个安全无效的全局组
4750 - A security-disabled global group was changed. 4750-一个安全禁用的全局组被更改
4751 - A member was added to a security-disabled global group. 4751年的今天,一个成员被添加到一个安全无效的全局组中
4752 - A member was removed from a security-disabled global group. 4752年的今天,一个成员被从一个安全无效的全球组中删除
4753 - A security-disabled global group was deleted. 4753-一个安全无效的全局组被删除
4754 - A security-enabled universal group was created. 4754-创建了一个安全启用的通用组
4755 - A security-enabled universal group was changed. 4755-一个安全启用的通用组被更改
4756 - A member was added to a security-enabled universal group. 4756-一个成员被添加到一个安全启用的通用组
4757 - A member was removed from a security-enabled universal group. 4757-一个成员被从一个安全启用的宇宙组中删除
4758 - A security-enabled universal group was deleted. 4758-安全启用的通用组被删除
4759 - A security-disabled universal group was created. 4759-创建了一个安全禁用的通用组
4760 - A security-disabled universal group was changed. 4760-一个安全禁用的通用组被更改
4761 - A member was added to a security-disabled universal group. 4761年的今天,一个成员加入了一个安全无效的宇宙组
4762 - A member was removed from a security-disabled universal group. 4762年的今天,一个成员被从一个安全无效的宇宙组中除名
4763 - A security-disabled global group was deleted. 4763-一个安全无效的全局组被删除
4764 - A group’s type was changed. 4764-a 组的类型发生了变化
4767 - An account was unlocked. 4767-一个账户被解锁了
4741 - A computer account was created. 4741-创建了一个计算机帐户
4742 - A computer account was changed. 4742-计算机帐户被更改
4743 - A computer account was deleted. 4743-一个电脑帐户被删除
4744 - A security-disabled local group was created. 4744-创建了一个安全禁用的本地组
4745 - A security-disabled local group was changed. 4745-a 安全禁用的本地组被更改
4746 - A member was added to a security-disabled local group. 4746-一个成员被添加到一个安全无效的本地组
4747 - A member was removed from a security-disabled local group. 4747年的今天,一名成员被从一个安全无效的当地组织中清除出去
4748 - A security-disabled local group was deleted. 4748-一个安全无效的本地组被删除
4749 - A security-disabled global group was created. 4749-创建了一个安全无效的全局组
4750 - A security-disabled global group was changed. 4750-一个安全禁用的全局组被更改
4751 - A member was added to a security-disabled global group. 4751年的今天,一个成员被添加到一个安全无效的全局组中
4752 - A member was removed from a security-disabled global group. 4752年的今天,一个成员被从一个安全无效的全球组中删除
4753 - A security-disabled global group was deleted. 4753-一个安全无效的全局组被删除
4754 - A security-enabled universal group was created. 4754-创建了一个安全启用的通用组
4755 - A security-enabled universal group was changed. 4755-一个安全启用的通用组被更改
4756 - A member was added to a security-enabled universal group. 4756-一个成员被添加到一个安全启用的通用组
4757 - A member was removed from a security-enabled universal group. 4757-一个成员被从一个安全启用的宇宙组中删除
4758 - A security-enabled universal group was deleted. 4758-安全启用的通用组被删除
4759 - A security-disabled universal group was created. 4759-创建了一个安全禁用的通用组
4760 - A security-disabled universal group was changed. 4760-一个安全禁用的通用组被更改
4761 - A member was added to a security-disabled universal group. 4761年的今天,一个成员加入了一个安全无效的宇宙组
4762 - A member was removed from a security-disabled universal group. 4762年的今天,一个成员被从一个安全无效的宇宙组中除名
4763 - A security-disabled global group was deleted. 4763-一个安全无效的全局组被删除
4764 - A group’s type was changed. 4764-a 组的类型发生了变化
4768 - A Kerberos authentication ticket TGT was requested. 4768-请求一个 Kerberos 身份验证票 TGT
4769 - A Kerberos service ticket was requested. 4769-请求提供 Kerberos 服务票
4770 - A Kerberos service ticket was renewed. 4770-更新了 Kerberos 服务票
4771 - Kerberos pre-authentication failed. 4771-Kerberos 预身份验证失败
4776 - The computer attempted to validate the credentials for an account. 4776-计算机试图验证帐户的凭据
4778 - A session was reconnected to a Window Station. 4778-a 会话被重新连接到窗口站
4779 - A session was disconnected from a Window Station. 4779-会话被从窗口站断开
4781 - The name of an account was changed. 4781-帐户名称更改
4798 - A user’s local group membership was enumerated. 4798- 计算了用户的本地组成员资格
4799 - A security-enabled local group membership was enumerated. 4799-枚举了支持安全的本地组成员身份
4964 - Special groups have been assigned to a new logon. 4964-特别小组已被分配到一个新的登录

sysmon

Sysmon 模块从 Sysinternals System Monitor (Sysmon)处理事件日志记录
Sysmon 是一个 Windows 服务和设备驱动程序,它将系统活动记录到事件日志中。
Sysmon 不与 Windows 或 Winlogbeat 绑定,并且必须独立安装。
默认配置文件包括 Sysmon 的配置。如果没有安装 Sysmon,Winlogbeat 将记录一个警告,说它无法从 microsoft-windows-Sysmon/Operational 通道读取。它将继续从其他配置的通道读取数据。如果您稍后安装了 Sysmon,那么需要重新启动 Winlogbeat 以使其开始读取频道。

sysmon需要配合事件查看器使用。

.evts文件导入

Winlogbeat可以摄取归档的.evtx文件。将name参数设置为事件日志文件的绝对路径时,它将从该文件中读取。首先为Winlogbeat创建一个新的配置文件winlogbeat-evtx.yml:

winlogbeat.event_logs:
  - name: ${EVTX_FILE} 
    no_more_events: stop 

winlogbeat.shutdown_timeout: 30s 
winlogbeat.registry_file: evtx-registry.yml 

output.elasticsearch.hosts: ['http://localhost:9200']

名称将设置为EVTX_FILE绝对路径。

当Windows报告不再有要读取的事件时,no_more_events设置Winlogbeat的行为。 我们希望Winlogbeat停止而不是等待,因为这是一个已归档的文件,将不再接收任何事件。

shutdown_timeout控制Winlogbeat在停止后由于事件到达日志末尾而等待完成将事件发布到Elasticsearch的最长时间。

单独的注册表文件用于避免覆盖默认注册表文件。 提取.evtx数据后,您可以删除此文件.

现在执行Winlogbeat并等待它完成。它将在它完成时退出。

.\winlogbeat.exe -e -c .\winlogbeat-evtx.yml -E EVTX_FILE=c:\backup\Security-2019.01.evtx

OVER

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐