默认检测规则
YARA-L 规则语言
YARA-L 是由 Google 开发的检测规则语言。YARA-L 的目的是将检测从仅限数据查询的形式转变为实际的事件驱动型调查。YARA-L 派生自恶意软件分析中常用的 YARA 语言。L 代表日志。借助 YARA-L,您可以利用检测中来自多个来源的所有信息,并将这些事件关联起来,生成可采取行动的提醒。如需了解详情,请参阅 YARA-L 2.0 语言概览。
Google Security Operations 示例检测规则
为了帮助您更快地采用 Google 安全运营检测引擎,我们提供了一个包含示例规则的 GitHub 代码库。此代码库包含几类不同的检测规则,包括:
- Google Cloud CloudAudit
- Google Workspace
- 信息性警告
- 恶意软件
- MITRE ATT&CK
- SOC Prime 规则
- 可疑事件
每个类别在查看数据源和指定要使用的事件和匹配语句时采用特定方法。
示例规则和调整
以下规则会创建事件变量 $e1
,用于跟踪事件类型。事件变量可以是任何对所评估数据有意义的值。此事件中要评估的 UDM 字段为 metadata.eventype
,因此只需将其称为 e1
即可。接下来的几行代码会在 e1
中搜索正则表达式匹配的具体出现情况。在 Google Security Operations 中创建检测的条件是,每当事件 $e1
发生时。出于调优目的,系统提供了 not
条件,用于排除命令行参数的某些非恶意路径。如果您发现其他已知文件路径中经常出现误报,可以向此规则添加其他 not
条件。
rule suspicious_unusual_location_svchost_execution
{
meta:
author = "Google Cloud Security"
description = "Windows 'svchost' executed from an unusual location"
yara_version = "YL2.0"
rule_version = "1.0"
events:
$e1.metadata.event_type = "PROCESS_LAUNCH"
re.regex($e1.principal.process.command_line, `\bsvchost(\.exe)?\b`) nocase
not re.regex($e1.principal.process.command_line, `\\Windows\\System32\\`) nocase
condition:
$e1
}
指定多个事件变量
借助 YARA-L,您可以在一条规则中使用多个事件变量。在以下示例中,规则包含事件 $e1
和 $e2
。该条件用于指明触发检测的逻辑条件。
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
}
规则结果部分
使用“结果”部分在规则检测中设置保留变量,以便为下游使用提供丰富信息。例如,您可以添加严重程度评分信息,该信息依赖于所分析事件的数据。以下检测会检查两个事件,以归因 $hostname
值。如果值 $hostnames
在 5 分钟内匹配,系统会应用严重程度得分。使用时间段时,Google Security Operations 检测引擎只会检查您指定的离散时间段。
rule OutcomeRuleMultiEvent {
meta:
author = "noone@google.com"
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)
)
$asset_id_list =
array(
if($u.principal.asset_id = "",
"Empty asset id",
$u.principal.asset_id
)
)
$asset_id_distinct_list = array_distinct($u.principal.asset_id)
$asset_id_count = count($u.principal.asset_id)
$asset_id_distinct_count = count_distinct($u.principal.asset_id)
condition:
$u and $asset_context and $risk_score > 50 and not arrays.contains($asset_id_list, "id_1234")
}
总结
YARA-L 是一种灵活的检测语言,可让您检查安全事件,而不仅仅是返回数据查询。事件变量用于跟踪规则的条件部分中使用的字段值。您可以使用单个事件、一段时间内的多个事件,为单个值(例如来自不同数据源的 $hostname)关联来源,甚至可以使用正则表达式等工具来提供匹配项。请务必根据您自己的环境调整规则,您可以在逻辑中指定排除项来实现这一点。您还可以使用引用列表将项分组,然后在规则中引用该列表。请注意,Google 安全运营团队不需要针对每项检测发出提醒。您可以出于多种目的跟踪检测,并仅针对您确定的环境中最重要的检测发出提醒。