How to Write Sigma Rules

Sigma 是规则的开放标准,允许您以通用形式描述对日志数据的搜索。这些规则可以转换并应用于许多日志管理或 SIEM 系统,甚至可以在命令行上与 grep 一起使用。
在本文中,我想向您简要介绍一下规则创建过程。我将推荐一些工具并起草一份指南,以帮助您尽可能快速和合理地编写 Sigma 规则。

1. 获取存储库

首先从 Github下载或克隆我们的Sigma 存储库。
它包含文件夹“./rules”中的规则库和 Sigma 规则编译器“./tools/sigmac”。我们将使用现有规则作为示例,并基于类似的现有规则创建新规则。然后,我们将使用“sigmac”测试该规则。
@cyb3rops - How to Write Sigma Rules - 图1
Sigma Github 存储库

2. 复制和编辑 YAML 文件

我个人最喜欢的 YAML 编辑器是VSCode。它是免费的,可以在所有主要平台上运行。(或者,您可以将Atom 与 ‘language-yaml’ 和 ‘linter-js-yaml’ 包一起使用)
@cyb3rops - How to Write Sigma Rules - 图2
VSCode
我使用了以下扩展,但我不知道它们是否仍然需要。VSCode 在过去的 12 个月里有了很大的改进,现在它可能默认支持 YAML 突出显示和语法检查。
@cyb3rops - How to Write Sigma Rules - 图3
VSCode 的 YAML 扩展
我们使用“Open …”打开 Sigma 存储库文件夹并查看所有现有规则。
@cyb3rops - How to Write Sigma Rules - 图4
Sigma规则

3.创建一个Sigma规则

我选择了一个示例,我们将从@JPCERT在其出色的“工具分析结果表”中的一项发现中创建一个 Sigma 规则。
我们打开“Quarks PWDump ”的结果,这是中国威胁组织经常使用的密码转储程序。它会创建我们想要在SysInternals Sysmon日志数据中检测到的临时文件。为了收集所需的事件,我们将 Sysmon 与@SwiftOnSecuritySysmon 配置文件Windows 事件转发NXlog 结合使用
@cyb3rops - How to Write Sigma Rules - 图5
Quarks PWDump 分析结果
因此,我们要做的是在存储库中找到一个 Sigma 规则,我们可以将其用作新规则的模板。我们使用“搜索”功能查找在 Sysmon 日志数据中查找“文件创建”事件 (EventID 11) 的规则。
@cyb3rops - How to Write Sigma Rules - 图6
Sigma 示例规则
我们找到一个具有特殊格式的规则。它是一个所谓的“规则集合”,它允许我们在 YAML 文件中定义一个标有“action: global”的全局部分,该部分将在搜索查询生成过程中应用于该文件中的所有其他部分。通过这种方式,您可以从单个 YAML 文件定义和创建多个搜索查询。
在我们的 Quarks PWDump 示例中,我们不需要规则集合,因此我们将规则简化为包含检测表达式的标准规则,该检测表达式查找事件 ID 为 11 的 Sysmon 事件,并将其保存为“sysmon_quarkspw_filedump.yml”到新文件在文件夹“./rules/windows/sysmon/”中。
@cyb3rops - How to Write Sigma Rules - 图7
简单的 Sysmon Sigma 规则
之后,我们修改该规则的几个字段:

  • 我们给规则一个正确的“标题”和“描述”
  • 我们将状态保留为“实验性”,以告知大家这是一个未经测试的新规则
  • 我们将正确的引用添加到我们从中得出该规则的来源
  • 我们更改规则的作者
  • 我们将该规则的级别设置为“低”、“中”、“高”或“关键”之一
  • 我们调整日期(最后一次修改)并使用格式 %Y/%m%d (strftime)
  • 我们检查日志源是否正确,这对于“sigmac”使用的字段映射很重要

@cyb3rops - How to Write Sigma Rules - 图8
新的 Sigma 规则标题
在我们创建新的“检测”部分之前,我们会详细查看分析报告。
@cyb3rops - How to Write Sigma Rules - 图9
详细信息:Quarks PWDump 临时文件
我们在类型 11 的 Sysmon 事件中的“TargetFileName”字段上添加一个带有通配符的字符串。这就是新规则的样子:
@cyb3rops - How to Write Sigma Rules - 图10
Quarks PWDump Sigma 规则

4. 测试规则

我们使用需要 python3 的“sigmac”测试我们新创建的规则。它位于“./tools”文件夹中。它具有几个目标,我们可以根据我们的规则为其创建搜索/配置。
当前支持的目标(10.02.2018):

  • es-qs(弹性搜索查询语言)
  • kibana
  • xpack-watcher
  • logpoint
  • splunk
  • grep
  • fieldlist(仅用于显示配置文件中需要映射的所有字段)

运行“python3 sigmac -h”会显示帮助:

  1. sigmac [-h] [--recurse] [--filter FILTER]
  2. [--target {sqlite,netwitness-epl,logpoint,graylog,netwitness,arcsight,carbonblack,es-rule,ala,elastalert-dsl,splunkxml,fieldlist,sysmon,arcsight-esm,kibana,csharp,qualys,powershell,es -qs,mdatp,humio,grep,qradar,logiq,sql,sumologic,ala-rule,limacharlie,elastalert,splunk,stix,xpack-watcher,crowdstrike,es-dsl,ee-outliers}]
  3. [--target-list] [--config CONFIG] [--output OUTPUT]
  4. [--backend-option BACKEND_OPTION] [--defer-abort]
  5. [--ignore-backend-errors] [--verbose] [--debug]
  6. [inputs [inputs ...]]
  7. Sigma 规则转换为 SIEM 签名。
  8. 位置参数:
  9. inputs Sigma 输入文件('-'用于标准输入)
  10. 可选参数:
  11. -h , --help 显示此帮助信息并退出
  12. --recurse, -r 使用目录作为输入(递归到子目录(尚未实施))
  13. --filter FILTER, -f FILTER
  14. 定义必须匹配的逗号分隔过滤器(AND-链接)到要处理的规则。
  15. 有效过滤器:level<=x, level>=x, level=x, status=y, logsource=z, tag=t.
  16. x,等级:low, medium, high, critical
  17. y,状态:experimental, testing, stable
  18. z,日志源,出现在任意日志源属性中
  19. t,标签,必须出现在规则标签列表中
  20. 不区分大小写的匹配,多个日志源规范是 AND 链接的。
  21. --target {arcsight,es-qs,es-dsl,kibana,xpack-watcher,elastalert,graylog,limacharlie,logpoint,grep,netwitness,powershell,qradar,qualys,splunk,splunkxml,sumologic,fieldlist,mdatp,devo} , -t {arcsight,es-qs,es-dsl,kibana,xpack-watcher,elastalert,graylog,limacharlie,logpoint,grep,netwitness,powershell,qradar,qualys,splunk,splunkxml,sumologic,fieldlist,mdatp,devo}
  22. 输出目标格式:
  23. --target-list, -l 列出可用的输出目标格式
  24. --config CONFIG, -c CONFIG
  25. 具有目标环境的字段名称和索引映射的配置。多个配置合并为一个。如果发生冲突,最后一个配置是权威的。
  26. --output OUTPUT, -o OUTPUT
  27. 如果生成多个文件,则输出文件或文件名前缀
  28. --backend-option BACKEND_OPTION, -O BACKEND_OPTION
  29. 传递到后端的选项和开关
  30. --defer-abort, -d
  31. 不要中止解析或转换错误,继续下一条规则。 返回上一个错误的退出代码
  32. --ignore-backend-errors, -I
  33. 仅返回解析错误的错误代码并忽略导致后端错误的规则的错误。 当您想获得尽可能多的查询时很有用。
  34. --verbose, -v 详细
  35. --debug, -D 调试输出

我们用“sigmac”和目标“splunk”测试我们的新规则:

  1. $ python3 sigmac -t splunk ../rules/windows/sysmon/sysmon_quarkspw_filedump.yml ( EventID = " 11 " TargetFileName = " * \ AppData\Local \ Temp \ SAM-*.dmp* " )

现在该规则已准备好用于拉取请求。关注我或在 Twitter 上联系我:@cyb3rops