Sigma用于日志文件,就像Snort用于网络流量,YARA用于文件一样——还是觉得yara 2.0 设计更优雅
来源:https://github.com/Neo23x0/sigma
一、什么是sigma
Sigma是一种通用的开放签名格式,允许您以一种直接的方式描述相关的日志事件。规则格式非常灵活,易于编写,适用于任何类型的日志文件。该项目的主要目的是提供一种结构化的形式,在这种结构中,研究人员或分析人员可以描述他们曾经开发的检测方法,并使其与他人共享。
Sigma用于日志文件,就像Snort用于网络流量,YARA用于文件一样。
这个库包含:
(1)Wiki中的Sigma规则规范
(2)./rulessubfolder中n个sigma签名存储库
(3)为不同SIEM系统生成搜索/查询的转换器[正在进行中]
二、用例
描述你在Sigma中的检测方法,使其可共享
使用Sigma编写SIEM搜索,以避免供应商锁定
与IOCs和YARA规则一起在分析的附录中共享签名
在威胁情报社区共享签名-例如通过MISP
为您自己的应用程序中的恶意行为提供Sigma签名
三、为什么Sigma
今天,每个人都收集日志数据进行分析。人们开始自己动手,处理大量白皮书、博客文章和日志分析指南,提取必要的信息,构建自己的搜索和仪表板。他们的一些搜索和关联是伟大的,非常有用,但他们缺乏一个标准化的格式,他们可以与他人分享他们的工作。
其他一些则提供了出色的分析,包括IOCs和YARA规则来检测恶意文件和网络连接,但无法描述日志事件中的特定或通用检测方法。西格玛应该是一个开放的标准,这样的检测机制可以被定义,共享和收集,以提高每个人的检测能力。
YARA-L 2.0 语言概览
https://go.chronicle.security/hubfs/YARA-L%20Overview%20White%20Paper.pdf 论文地址
YARA-L 2.0 是一种计算机语言,用于创建搜索企业日志数据的规则,因为它被注入到您的 Chronicle 帐号中。YARA-L 语法派生自 VirusTotal 开发的 YARA 语言。该语言与 Chronicle Detection Engine 配合使用,让您可以在大量数据中寻找威胁和其他事件。另请参阅 YARA-L 2.0 语言语法
注意:YARA-L 2.0 与旧版 YARA-L 语言不兼容。以旧版 YARA-L 编写的规则不适用于当前版本的 Detection Engine,需要经过修改才能使用新语法。
规则结构
以下示例展示了使用 YARA-L 2.0 编写的规则。每个示例都展示了如何关联规则语言中的事件。
不同城市的登录信息
以下规则可搜索在 4 小时内创建然后删除的用户:
rule UserCreationThenDeletion {
meta:
events:
$create.target.user.userid = $user
$create.metadata.event_type = "USER_CREATION"
$delete.target.user.userid = $user
$delete.metadata.event_type = "USER_DELETION"
$create.metadata.event_timestamp.seconds <=
$delete.metadata.event_timestamp.seconds
match:
$user over 4h
condition:
$create and $delete
}
事件变量:$create 和 $delete
Match 变量:$user
占位符变量:不适用
下面介绍了此规则的工作原理:
- 对用户名为
$user的活动进行分组,并在找到匹配项时返回 ($user)。 - 时间范围为 4 小时,这意味着只有不到 4 小时的事件才会关联。
- 搜索两个事件组(
$create和$delete,其中$create等同于#create >= 1)。 $create对应于USER_CREATION事件,并将用户 ID 调用为$user。$user用于将两组事件联接在一起。$delete对应于USER_DELETION事件,并以$user形式调用用户 ID。此规则查找两个事件组中用户标识符相同的匹配项。- 此规则查找事件
$delete发生的时间晚于$create事件的情况,并在发现时返回匹配项。
单事件与多事件
以下示例展示了一条规则,用于搜索两个特定用户和特定 IP 地址范围之间的匹配项:
rule OrsAndNetworkRange {
meta:
author = "noone@altostrat.com"
events:
// Checks CIDR ranges.
net.ip_in_range_cidr($e.principal.ip, "203.0.113.0/24")
// Detection when the hostname field matches either value using or.
$e.principal.hostname = /pbateman/ or $e.principal.hostname = /sspade/
condition:
$e
}
重复字段
重复字段可以与非重复字段相同。在这种情况下,它们会自动消除歧义,这意味着系统会针对重复字段的各个元素检查条件。
例如,如果您在规则中包含以下语句:
$e.principal.ip = "192.168.12.16"
Chronicle 会在数组中搜索与 "192.168.12.16" 匹配的 IP 地址。在此示例中,将会找到匹配的地址并返回检测结果。
例如,如果您在规则中包含以下语句:
$e.principal.ip = "192.168.12.16" and $e.principal.ip = "10.3.4.100"
Chronicle 会在数组中搜索与 "192.168.12.16" 和 "10.3.4.100" 匹配的 IP 地址。在此示例中,将找不到匹配的地址,因此不会返回检测结果。
重复字段示例
您还可以使用 any 和 all 运算符引用重复字段。如果是这样,它们不会消除歧义,也就是说,系统会针对重复字段的所有元素检查条件。
例如,如果您在规则中包含以下语句:
any $e.principal.ip = "192.168.12.16"
Chronicle 会检查数组中的任何 IP 地址是否与 "192.168.12.16" 匹配。在此示例中,数组将满足检查条件并返回检测结果。
如果您在规则中包含以下语句:
all $e.principal.ip = "192.168.12.16"
Chronicle 会检查数组中的所有 IP 地址是否与 "192.168.12.16" 匹配。在此示例中,数组不满足检查条件,因此不会返回检测结果。
如果您在规则中包含以下语句:
any $e.principal.ip = "192.168.12.16" and any $e.principal.ip = "10.3.4.100"
Chronicle 会检查数组中的任何 IP 地址是否与 "192.168.12.16" 匹配,以及数组中的任何 IP 地址是否与 "10.3.4.100" 匹配。在此示例中,数组会满足检查条件,并返回检测结果。
以下是使用 any 和 all 运算符的有效谓词示例:
any $e.principal.ip = "192.168.12.16"net.ip_in_range_cidr(any $e.principal.ip, "192.168.12.16/24")all $e.network.email.to = /.*@google\.com/re.regex(all $e.network.email.to, `.*google\.com`)
以下是使用 any 和 all 运算符的无效谓词示例:
any $ip = "192.168.12.16"any $e.principal.ip = all $e.target.ipany $e.principal.ip in %reference_list
any 和 all 运算符的限制
以下规则会搜索所有来源 IP 地址在 5 分钟的时间内与已知安全的 IP 地址不匹配的登录事件。
rule SuspiciousIPLogins {
meta:
author = "noone@google.com"
events:
$e.metadata.event_type = "USER_LOGIN"
// Detects if all source IP addresses in an event do not match "100.97.16.0"
// For example, if an event has source IP addresses
// ["100.97.16.1", "100.97.16.2", "100.97.16.3"],
// it will be detected since "100.97.16.1", "100.97.16.2",
// and "100.97.16.3" all do not match "100.97.16.0".
all $e.principal.ip != "100.97.16.0"
// Assigns placeholder variable $ip to the $e.principal.ip repeated field.
// There will be one detection per source IP address.
// For example, if an event has source IP addresses
// ["100.97.16.1", "100.97.16.2", "100.97.16.3"],
// there will be one detection per address.
$e.principal.ip = $ip
match:
$ip over 5m
condition:
$e
}
规则中的正则表达式
默认情况下,YARA-L 2.0 规则使用跃点窗口进行评估。企业事件数据的时间范围分为一组重叠的跃点窗口,每个窗口的持续时间都在 match 部分指定。然后,在每个跃点窗口中关联事件。使用跃点窗口时,无法搜索按特定顺序发生的事件(例如,e1 最多发生在 e2 之后 2 分钟内)。只要 e1 事件与 e2 事件的发生时间在彼此之间的跃点持续时间内,系统就会对其进行关联。
还可以使用滑动窗口评估规则。在滑动窗口时,以指定的数据透视事件变量开始或结束时,会生成时长为 match 区段的滑动窗口。然后,在每个滑动窗口内,事件是相关的。这样一来,便可以搜索按特定顺序发生的事件(例如,e1 会在 e2 的 2 分钟内发生)。如果事件 e1 在事件 e2 之后的滑动窗口内出现,则事件 e1 和事件 e2 的发生次数是相关的。
注意:已知使用滑动窗口代替跃点窗口会导致性能下降。Google 建议仅在特定情况下使用滑动窗口,例如绝对有必要使用事件顺序或搜索不存在的事件时。
滑动窗口规则语法
以下 YARA-L 2.0 滑动窗口示例搜索 firewall_1 事件后缺少 firewall_2 事件。after 关键字与数据透视事件变量 $e1 结合使用,指定在关联事件时每个 firewall_1 事件仅检查 10 分钟的时间范围。
rule SlidingWindowRuleExample {
meta:
author = "noone@google.com"
events:
$e1.metadata.product_name = "firewall_1"
$e1.principal.hostname = $host
$e2.metadata.product_name = "firewall_2"
$e2.principal.hostname = $host
match:
$host over 10m after $e1
condition:
$e1 and !$e2
}
1 Sigma概述
Sigma 是一种通用且开放的签名格式,允许您以直接的方式描述相关的日志事件。规则格式非常灵活,易于编写,适用于任何类型的日志文件。
Sigma 是一个开放的规则标准,允许您以通用形式描述对日志数据的搜索。这些规则可以转换并应用于许多日志管理或 SIEM 系统,甚至可以在命令行上与 grep 一起使用。
GitHub地址:https://github.com/SigmaHQ/sigma
使用方法:https://www.nextron-systems.com/2018/02/10/write-sigma-rules/
使用方法:https://github.com/SigmaHQ/sigma/wiki/Specification
2 Sigma规则
2.1 规则模板
- title: 小于50个字符的大写短标题
- id: 可以在如下网站生成 https://www.uuidgenerator.net/version4
- status: 状态
- description: 对检测规则的描述
- references:
- - 可以帮助读者或分析人员理解被触发规则的含义的所有引用的列表
- tags:
- - attack.execution # 例如 MITRE ATT&CK category
- - attack.t1059 # 例如 MITRE ATT&CK technique id
- - car.2014-04-003 # 例如 CAR id
- author: Michael Haag, Florian Roth, Markus Neis # 作者列表
- date: 2018/04/06 # 规则日期
- logsource: # 重要的字段映射在预定义或您的其他配置文件
- category: process_creation # 在这个例子中使用了process_creation
- product: windows # 产品
- detection:
- selection:
- FieldName: 'StringValue'
- FieldName: IntegerValue
- FieldName|modifier: 'Value'
- condition: selection
- fields:
- - 日志源中需要进一步研究的重要字段
- falsepositives:
- - 描述可能的假阳性情况,以帮助分析人员进行调查
- level: 四个级别 (low, medium, high, critical)
- type: //rec
- 必需的:
- title: //规则的简短标题,应包含规则应检测的内容(最多 256 个字符)
- 类型: //字符串
- 长度:
- min: 1
- max: 256
- logsource: //日志源 描述了检测所需的日志来源、平台、应用程序和类型
- 类型: //rec
- 可选的:
- category: //分类 例如防火墙,web,防病毒
- product: //产品 例如windows,apache
- service: //服务 例如sshd,applocker
- definition: //定义 字符串
- detection: //表示对日志数据的搜索的搜索标识符
- 类型: //rec
- 必需的:
- condition:
- 类型:
- 包括:
- - type: //str
- - type: //arr
- contents: //str
- length:
- min: 2
- 可选的:
- timeframe: //字符串 使用天、小时、分钟、秒的典型缩写 例如15s、30m、12h、7d、3M
- 其他:
- 类型: any
- 包括:
- - type: arr
- contents: //str
- - type: //map
- values:
- type: //any
- of:
- - type: //str
- - type: //arr
- contents: //str
- length:
- min: 2
- 可选择的:
- id: //Sigma 规则应由id属性中的全局唯一标识符标识。建议网络生成
- type: //any
- of:
- - type: //str
- length:
- min: 1
- max: 64
- related:
- type: //arr
- contents:
- type: //rec
- required:
- type:
- type: //any
- of:
- - type: //str
- value: derived
- - type: //str
- value: obsoletes
- - type: //str
- value: merged
- - type: //str
- value: renamed
- id:
- type: //any
- of:
- - type: //str
- length:
- min: 1
- max: 64
- - type: //arr
- contents: //str
- length:
- min: 1
- max: 64
- status: //声明规则的状态(stable、test、experimental)
- type: //any
- of:
- - type: //str
- value: stable //稳定的,可用于生产系统或仪表板
- - type: //str
- value: testing //一个几乎稳定的规则,可能需要一些微调
- - type: //str
- value: experimental //一种实验性规则,可能导致错误结果或噪音
- description: //规则和可以检测到的恶意活动的简短描述
- author: //规则作者
- license: //许可证
- references: //对规则来源的引用
- type: //arr
- contents: //str
- fields: //有价值显示给分析人员的日志字段列表
- type: //arr
- contents: //str
- falsepositives: //可能发生的已知误报列表
- type: //any
- of:
- - type: //str
- - type: //arr
- contents: //str
- length:
- min: 2
- level: //等级
- type: //any
- of:
- - type: //str
- value: low //值得注意的事件,但很少发生事件
- - type: //str
- value: medium //应该更频繁地手动审查的相关事件
- - type: //str
- value: high //应触发内部警报并需要及时审查的相关事件
- - type: //str
- value: critical //表示事件的高度相关事件。应立即审查关键事件
- tags: //标签 小写字母,下划线,连字符组成 尽量简短 预定义标签:https://github.com/SigmaHQ/sigma/wiki/Tags
- type: //arr
- contents: //str
- rest: //any
3 编些Sigma规则
3.1 获取存储库
下载或git存储库:https://github.com/SigmaHQ/sigma
./rules 规则库
./tools/sigmac 规则编译器
3.2 复制和编辑 YAML 文件
推荐VScode:https://code.visualstudio.com/
可以默认支持YAML突出显示和语法检查。
作者:Threathunter
链接:https://www.jianshu.com/p/cedef8f47488
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。