YARA-L 2.0 语言概览
YARA-L 2.0 是一种计算机语言,用于创建搜索企业日志数据的规则,因为它被注入到您的 Chronicle 帐号中。YARA-L 语法派生自 VirusTotal 开发的 YARA 语言。该语言与 Chronicle Detection Engine 配合使用,让您可以在大量数据中寻找威胁和其他事件。另请参阅 YARA-L 2.0 语言语法
YARA-L 2.0 示例规则
以下示例展示了使用 YARA-L 2.0 编写的规则。每个示例都展示了如何关联规则语言中的事件。
不同城市的登录信息
以下规则会在 5 分钟内搜索从两个或多个城市登录过您的企业的用户:
rule DifferentCityLogin {
meta:
events:
$udm.metadata.event_type = "USER_LOGIN"
$udm.principal.user.userid = $user
$udm.principal.location.city = $city
match:
$user over 5m
condition:
$udm and #city > 1
}
Match 变量:$user
事件变量:$udm
占位符变量:$city
和 $user
下面介绍了此规则的工作原理:
- 对用户名为 (
$user
) 的事件进行分组,并在找到匹配项时返回该值 ($user
)。 - 时间范围为 5 分钟,表示只有间隔不到 5 分钟的事件相关联。
- 搜索事件类型为 USER_LOGIN 的事件组 (
$udm
)。 - 对于该事件组,该规则会将用户 ID 命名为
$user
,并将登录城市命名为$city.
- 如果 5 分钟时间范围内事件组 (
$udm
) 中的不同$city
值数量大于 1,则返回匹配项。
快速创建和删除用户
以下规则可搜索在 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
事件的情况,并在发现时返回匹配项。
单事件与多事件
以下示例规则展示了如何创建用于搜索单个事件的规则,然后对其进行修改以搜索多个事件。
下面是该规则的单个事件版本:
rule SingleEventRule {
meta:
author = "noone@altostrat.com"
events:
$e.metadata.event_type = "USER_LOGIN"
condition:
$e
}
此规则仅搜索用户的登录事件,然后返回在 Chronicle 帐号中存储的企业数据中首次遇到的事件。
下面是该规则的多事件版本:
rule MultiEventRule {
meta:
author = "noone@altostrat.com"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.principal.user.userid = $user
match:
$user over 10m
condition:
#e >= 10
}
该规则会搜索在 10 分钟内至少登录了 10 次的用户。
IP 地址范围内的单个事件
以下示例展示了一条规则,用于搜索两个特定用户和特定 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
}
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 正则表达式示例搜索从 altostrat.com 网域收到电子邮件的事件。由于 nocase
已添加到 $host
变量 regex
比较和 regex
函数,因此这些比较都不区分大小写。
rule RegexRuleExample {
meta:
author = "noone@altostrat.com"
events:
$e.principal.hostname = $host
$host = /.*HoSt.*/ nocase
re.regex($e.network.email.from, `.*altostrat\.com`) nocase
match:
$host over 10m
condition:
#e > 10
}
滑动窗口规则示例
以下 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
}
零值排除示例
如果规则未指定 allow_zero_values
选项,则系统不会从匹配变量值返回零值。但是,对于其他引用的事件字段,除非您明确指定此类条件,否则不会排除零值。如需了解详情,请参阅此处。
rule ExcludeZeroValues {
meta:
"author" = "noone@google.com"
events:
$e1.metadata.event_type = "NETWORK_DNS"
$e1.principal.hostname = $hostname
// $e1.principal.user.userid may be empty string.
$e1.principal.user.userid != "Guest"
$e2.metadata.event_type = "NETWORK_HTTP"
$e2.principal.hostname = $hostname
// $e2.target.asset_id cannot be empty string as explicitly specified.
$e2.target.asset_id != ""
match:
// $hostname cannot be empty string.
$hostname over 1h
condition:
$e1 and $e2
}
具有结果部分的规则示例
您可以在 YARA-L 2.0 规则中添加可选的 outcome
部分,以提取每次检测的其他信息。如需了解本部分及其用法的概述,请参阅本部分的语法。
rule DetectionWithOutcomeSectionAndConditionalsAndAddition {
meta:
events:
$u.udm.principal.hostname = $hostname
$asset_context.graph.entity.hostname = $hostname
$severity = $asset_context.graph.entity.asset.vulnerabilities.severity
match:
$hostname over 5m
outcome:
$risk_score =
max(
100
+ if($hostname = "my-hostname", 100, 50)
+ if($severity = "HIGH", 10)
+ if($severity = "MEDIUM", 5)
+ if($severity = "LOW", 1)
)
condition:
$u and $asset_context
}