创建情境感知分析

借助 Chronicle,您可以将遥测、实体情境、关系和漏洞作为 Chronicle 帐号中的单个检测来查看。它提供了实体情境化,以便您能够了解遥测中的行为模式以及这些模式中受影响实体的情境。

示例:

  • 显示尝试以暴力破解的方式登录的帐号的权限。
  • 由资产托管的数据的重要性,该资产也是出站网络活动的来源。

客户可以使用此情境化来进行检测过滤、启发式提醒优先级排序、分类和调查。

安全分析师和检测工程师通常会根据事件遥测(出站网络连接)的基本模式进行检测,从而创建大量检测结果,以便分析师进行分类。分析师会尝试将触发提醒的原因与威胁的严重性结合起来考虑。

情境感知分析在检测编写和执行工作流中整合了高级的增强功能,使您能够提供以下附加功能:

  • 在检测执行时(而不是在人工分类阶段)提供相关情境,以对检测进行启发式情境风险评分
  • 减少从不同的 IT 安全系统(EDR 控制台、防火墙/代理日志、CMDB 和 IAM 上下文、漏洞扫描结果)中分类和手动拼接信息的时间
  • 使分析师和检测工程师能够过滤出全部的威胁集群,这些威胁可能会对企业构成极小风险或无风险(例如,沙盒环境中的恶意软件测试、没有敏感数据或访问的开发网络中的漏洞和异常活动,等等)

编写用于情境感知分析的规则

您可以使用 Detection Engine 规则在 Chronicle 帐号中搜索实体情境数据。

如需搜索实体情境数据,请完成以下操作:

  1. 使用 udm 或实体指定来源。

    $eventname.[<source>].field1.field2 对于实体情境,<source> 为“graph”。对于 UDM 事件,<source> 为“udm”。如果省略该项,则 <source> 默认为 udm。

  2. 指定实体数据:

    $e1.graph.entity.hostname = "my-hostname"

    $e1.graph.entity.relations.relationship = "OWNS"

  3. 指定 UDM 事件数据。以下语句是等效的。

    $e1.udm.principal.asset_id = "my_asset_id"

    $e1.principal.asset_id = "my_asset_id"

您可以为实体情境创建许多与 UDM 事件相同类型的规则,其中包括:

  • 多事件规则

  • 将实体情境与其他实体情境进行比较

  • 将实体情境与 UDM 事件进行比较

  • 实体情境中的重复字段

  • 滑动窗口

  • 计算检测的风险评分

与 UDM 事件不同,实体情境没有特定的时间戳。每个实体情境都会提供关联的有效时间范围。时间范围不必从某天的边界开始,可以是任意时段。

  • 利用窗口化将 UDM 事件与实体情境进行比较时,实体情境代表指定窗口内的常量值。
  • 如果存在相邻日期的存储桶并且其中的实体情境会更改其值,则 Chronicle 会尝试匹配所有实体情境值,并返回找到的所有匹配项。

示例规则

搜索具有管理员情境的实体

以下规则会搜索与管理员权限相关联的实体。它会查找具有管理员权限的用户尝试登录或退出系统的时间。

rule LoginLogout {
  meta:
  events:
    $log_in.metadata.event_type = "USER_LOGIN"
    $log_in.principal.user.user_display_name = $user
    $log_in.principal.user.userid = "alice"

    $log_out.metadata.event_type = "USER_LOGOUT"
    $log_out.principal.user.user_display_name = $user
    $log_out.principal.user.userid = "alice"

    $log_in.metadata.event_timestamp.seconds <=
     $log_out.metadata.event_timestamp.seconds

    $context.graph.entity.user.user_display_name = $user
    $context.graph.entity.resource.attribute.roles.type = "ADMINISTRATOR"

  match:
    $user over 2m

  condition:
    $log_in and $log_out and $context
}

滑动窗口示例

以下滑动窗口示例有效。

rule Detection {
  meta:
  events:
    $e1.graph.entity.hostname = $host
    $e2.udm.principal.hostname = $host

  match:
    // Using e2 (a UDM event) as a pivot.
    $host over 3h after $e2

  condition:
    $e1 and $e2
}

无效滑动窗口示例

以下滑动窗口示例无效。实体情境不能用作滑动窗口的数据透视表。

rule Detection {
  meta:
  events:
    $e1.graph.entity.hostname = $host
    $e2.udm.principal.hostname = $host

  match:
    // Attempting to use $e1 (an entity context) as a pivot. Invalid.
    $host over 3h after $e1

  condition:
    $e1 and $e2
}

使用结果部分的登录示例

以下示例使用 outcome 部分计算检测的风险评分。

rule Detection {
  meta:
  events:
    $auth.metadata.event_type = "USER_LOGIN"
    $auth.metadata.vendor_name = "Acme"
    $auth.metadata.product_name = "Acme SSO"
    $auth.target.user.userid = $user
    $auth.target.user.termination_date.seconds > 0

    $auth.metadata.event_timestamp.seconds >
       $context.graph.entity.user.termination_date.seconds

    $context.graph.metadata.vendor_name = "Microsoft"
    $context.graph.metadata.product_name = "Azure Active Directory"
    $context.graph.metadata.entity_type = "USER"
    $context.graph.entity.user.userid = $user
    $context.graph.entity.user.termination_date.seconds > 0

  match:
    $user over 15m

  outcome:
    $risk_score = max(
        if ( $auth.metadata.event_type = "USER_LOGIN", 50) +
        if (
            $context.graph.entity.user.title = "Remote" nocase or
            $context.graph.entity.user.title = "Temp" nocase or
            $context.graph.entity.user.title = "Vendor" nocase, 40) +
        if ( $context.graph.entity.user.title = "Legal" nocase, 10)
    )

  condition:
    $auth and $context
}

可疑进程启动示例

以下示例根据存储为实体情境的 IOC 情境数据评估 UDM 事件进程数据。

rule ProcessLaunch {
  meta:
  events:
    $ioc.graph.metadata.vendor_name = "ACME"
    $ioc.graph.metadata.product_name = "IOCs"
    $ioc.graph.metadata.entity_type = "FILE"
    $ioc.graph.entity.file.sha256 = $hash

    $process.metadata.event_type = "PROCESS_LAUNCH"
    $process.principal.hostname = $hostname
    (
        not $process.target.process.file.sha256 = "" and
        $process.target.process.file.sha256 = $hash
    )

  match:
    $hash over 15m

  condition:
    $ioc and $process
}

实体情境的其他限定符

如需创建使用实体情境的事件变量,必须在事件名称后提供 <source><source> 必须是 graph

以下模式会引用实体情境:

  • $e.graph.entity.hostname

请注意,您可以通过两种等效的方法来引用 UDM 事件:

  • $u.udm.principal.asset_id
  • $u.principal.asset_id

您可以在规则文本中混搭使用所有这些限定符。您也可以对同一事件使用不同的限定符。

零默认值

当您对事件运行规则时,事件中的字段可能会被自动省略。如果字段被省略,则字段默认为零值。

例如,省略的字符串值默认为 ""

如果您让两个都被省略的字段等同,则它们可能都默认为零值。这样可能会在这两个字段匹配时导致意外匹配,因为它们都具有零值。您可以通过明确指定零值来避免这种情况。

例如,如果您的规则基于两个字段让两个事件等同,那么有可能这两个字段都为空,从而导致匹配:

$e1.field1 = $e2.field2

如果数据中同时省略 e1.field1e2.field2,则 "" = "" 为 true,从而导致匹配。

通过指定以下内容:

$e1.field1 = $e2.field2
$e1.field != ""

您可以确保不会仅因为 e1.field1e2.field2 不包含任何数据而导致匹配。

结果部分

Detection Engine 支持 outcome 部分,可让您从规则中获取更多信息。系统会针对每个检测对 outcome 部分中定义的逻辑求值。如果规则生成了 N 个检测,则这 N 个检测中的每个检测都可能会导致不同的结果。

以下是使用 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
}

outcome 部分中,您必须定义一个名为 $risk_score 的变量。$risk_score 的值必须是一个整数,用以帮助确定需要检查的最重要的检测的优先级。

您可以使用条件逻辑和聚合函数来计算 $risk_score 的值。

请注意,上面的示例表达式包含以下语法模式来指定条件语句:

if(BOOL_CLAUSE, THEN_CLAUSE)
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)

BOOL_CLAUSE 的求值结果必须为布尔值。BOOL_CLAUSE 表达式的格式与 events 部分中的表达式类似。例如,该类表达式可以包含以下内容:

  • 具有比较运算符的 UDM 字段名称,例如 $context.graph.entity.user.title = "Vendor"
  • events 部分中定义的变量名称,例如 $severity = "HIGH"
  • 返回布尔值的函数,例如 re.regex($e.network.email.from, .*altostrat\.com)

THEN_CLAUSE 和 ELSE_CLAUSE 必须是整数字面量。

如果未包含 ELSE_CLAUSE,则求值结果为默认值。例如: if($e.field = "a", 5) 等同于 if($e.field = "a", 5, 0)

您可以将条件表达式理解为“如果 BOOL_CLAUSE 为 true,则返回 THEN_CLAUSE,否则返回 ELSE_CLAUSE”。

用于计算 $risk_score 值的表达式必须由聚合函数进行封装。Chronicle 支持 maxminsum 函数。

当规则包含指定必须存在多个事件的 condition 部分时,聚合函数便很重要。例如,如果您的条件部分是:

condition:
   #u > 2

并且 risk_score 计算包含以下行:

+ if($u.principal.hostname = "my-hostname")

由于存在多个 u 事件,因此聚合函数会针对各个可能的事件执行操作。

使用结果部分时,请注意以下事项:

  • outcome 部分中的变量名称必须是 $risk_score
  • $risk_score 变量必须用来存储整数。
  • 用于计算 $risk_score 的表达式是数学语句,支持加法和减法运算符。
  • 表达式可以包含以下内容:
    • 整数字面量
    • 条件语句
  • 您只能在多事件规则中使用 outcome 部分,因为这些规则是具有 match 部分的规则。
  • 您可以为多事件规则添加 outcome 部分,用以仅对 UDM 事件数据求值。您不必添加实体情境数据。
  • outcome 部分不能包含尚未在 events 部分中定义的事件。您只能关联已在 events 部分中关联的事件。同样,您无法定义尚未在 events 部分中定义的新占位符变量。