你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 ArcSight 检测规则迁移到 Microsoft Sentinel

本文介绍如何识别、比较 ArcSight 检测规则并将其迁移到 Microsoft Sentinel 分析规则。

识别和迁移规则

Microsoft Sentinel 使用机器学习分析来创建高保真的且可处理的事件,某些现有检测在 Microsoft Sentinel 中可能是多余的。 因此,请不要盲目地迁移所有检测和分析规则。 在识别现有检测规则时请查看这些注意事项。

  • 确保选择能够证明规则迁移合理的用例,同时考虑业务优先级和效率。
  • 确认你是否了解 Microsoft Sentinel 规则类型
  • 确认你是否理解规则术语
  • 查看过去 6-12 个月未触发任何警报的任何规则,并确定这些规则是否仍然相关。
  • 消除你在日常中会忽略的低级别威胁或警报。
  • 使用现有功能,并检查 Microsoft Sentinel 的内置分析规则是否可以解决你当前用例的需求。 由于 Microsoft Sentinel 使用机器学习分析来生成高保真且可操作的事件,因此可能不再需要某些现有检测。
  • 确认连接的数据源并查看数据连接方法。 重新访问数据收集对话,确保打算检测的用例的数据深度和广度足够。
  • 浏览社区资源(例如 SOC Prime Threat Detection Marketplace),以检查你的规则是否可用。
  • 考虑 Uncoder.io 等联机查询转换器是否适用于你的规则。
  • 如果规则不可用或无法转换,则需要使用 KQL 查询手动创建规则。 查看规则映射以创建新查询。

详细了解迁移检测规则的最佳做法

若要将分析规则迁移到 Microsoft Sentinel,请执行以下操作:

  1. 验证是否为要迁移的每个规则准备好了一个测试系统。

    1. 为迁移的规则准备验证过程,包括完整测试方案和脚本。

    2. 确保团队具有有用的资源可用于测试迁移的规则。

    3. 确认已连接全部所需的数据源,并检查数据连接方法。

  2. 验证你的检测是否是作为 Microsoft Sentinel 中的内置模板提供的:

    • 如果内置规则足以满足需求,请使用内置规则模板为你自己的工作区创建规则。

      在 Microsoft Sentinel 中,转到“配置”>“分析”>“规则模板”选项卡,然后创建并更新每个相关的分析规则。

      有关详细信息,请参阅直接检测威胁

    • 如果 Microsoft Sentinel 内置规则未涵盖你的检测,请尝试使用联机查询转换器(例如 Uncoder.io)将查询转换为 KQL。

      确定触发条件和规则操作,然后构建并检查 KQL 查询。

    • 如果内置规则和联机规则转换器都不足以满足需求,则需要手动创建规则。 在这种情况下,请使用以下步骤开始创建规则:

      1. 确定要在规则中使用的数据源。 需要在 Microsoft Sentinel 中的数据源与数据表之间创建一个映射表,以标识要查询的表。

      2. 确定数据中的要在规则中使用的任何属性、字段或实体。

      3. 确定规则条件和逻辑。 在此阶段,可以使用规则模板作为示例来了解如何构造 KQL 查询。

        考虑筛选器、关联规则、活动列表、参考集、监视列表、检测异常情况、聚合等。 可以使用旧式 SIEM 提供的参考来了解如何以最佳方式映射查询语法

      4. 确定触发条件和规则操作,然后构建并检查 KQL 查询。 检查查询时,请考虑 KQL 优化指导资源。

  3. 使用每个相关用例来测试规则。 如果该规则未提供预期的结果,可以检查 KQL 并再次测试。

  4. 如果对结果满意时,可以考虑迁移该规则。 根据需要为规则操作创建一个 playbook。 有关详细信息,请参阅使用 Microsoft Sentinel 中的 playbook 自动响应威胁

详细了解分析规则:

比较规则术语

下表阐明了 Microsoft Sentinel 与 ArcSight 中的规则在概念上的差别。

ArcSight Microsoft Sentinel
规则类型 • 筛选规则
• 联接规则
• 活动列表规则
• 等等
• 计划的查询
• 融合
• Microsoft 安全
• 机器学习 (ML) 行为分析
条件 在规则条件中定义 在 KQL 中定义
触发器条件 • 在操作中定义
• 在聚合中定义(用于事件聚合)
阈值:查询结果数
操作 • 设置事件字段
• 发送通知
• 创建新案例
• 添加到活动列表
• 等等
• 创建警报或事件
• 与逻辑应用集成

映射和比较规则示例

在各种方案中使用这些示例来比较 ArcSight 和 Microsoft Sentinel 中的规则并相互映射这些规则。

规则 说明 示例检测规则 (ArcSight) 示例 KQL 查询 资源
筛选器 (AND) 包含 AND 条件的示例规则。 该事件必须与所有条件匹配。 筛选器 (AND) 示例 筛选器 (AND) 示例 字符串筛选器:
字符串运算符

数值筛选器:
数值运算符

日期时间筛选器:
ago
Datetime
between
now

分析:
parse
extract
parse_json
parse_csv
parse_path
parse_url
筛选器 (OR) 包含 OR 条件的示例规则。 该事件可以匹配任何条件。 筛选器 (OR) 示例 筛选器 (OR) 示例 字符串运算符
in
嵌套的筛选器 包含嵌套筛选条件的示例规则。 该规则包括 MatchesFilter 语句,其中还包括筛选条件。 嵌套筛选器示例 嵌套筛选器示例 示例 KQL 函数
示例参数函数
join
where
活动列表(查找) 使用 InActiveList 语句的示例查找规则。 活动列表(查找)示例 活动列表(查找)示例 • 播放列表等效于活动列表功能。 详细了解播放列表
实现查找的其他方式
关联(匹配) 使用 Matching Event 语句针对一组基本事件定义条件的示例规则。 关联(匹配)示例 关联(匹配)示例 联接运算符:
join
join with time window
shuffle
Broadcast
Union

定义语句:
let

聚合:
make_set
make_list
make_bag
pack
关联(时间窗口) 使用 Matching Event 语句定义针对一组基本事件的条件并使用 Wait time 筛选条件的示例规则。 关联(时间窗口)示例 关联(时间窗口)示例 join
Microsoft Sentinel 规则和联接语句

筛选器 (AND) 示例:ArcSight

下面是 ArcSight 中的一个示例筛选器规则,其中包含 AND 条件。

说明示例筛选器规则的示意图。

筛选器 (AND) 示例:KQL

下面是 KQL 中的一个筛选器规则,其中包含 AND 条件。

SecurityEvent
| where EventID == 4728
| where SubjectUserName =~ "AutoMatedService"
| where isnotempty(SubjectDomainName)

此规则假定 Azure 监视代理 (AMA) 会收集 Windows 安全事件。 因此,该规则将使用 Microsoft Sentinel SecurityEvent 表。

请考虑以下最佳做法:

  • 若要优化查询,请尽可能避免使用不区分大小写的运算符:=~
  • 如果值不区分大小写,请使用 ==
  • 从筛选出最多数据的 where 语句开始对筛选器进行排序。

筛选器 (OR) 示例:ArcSight

下面是 ArcSight 中的一个示例筛选器规则,其中包含 OR 条件。

说明示例筛选器规则(或者 (or))的示意图。

筛选器 (OR) 示例:KQL

以下是在 KQL 中编写具有 OR 条件的筛选器规则的几种方法。

第一个选项是使用 in 语句:

SecurityEvent
| where SubjectUserName in
 ("Adm1","ServiceAccount1","AutomationServices")

第二个选项是使用 or 语句:

SecurityEvent
| where SubjectUserName == "Adm1" or 
SubjectUserName == "ServiceAccount1" or 
SubjectUserName == "AutomationServices"

虽然这两个选项在性能上是相同的,但建议使用第一个选项,它更易于阅读。

嵌套筛选器示例:ArcSight

下面是 ArcSight 中的一个示例嵌套筛选器规则。

说明示例嵌套筛选器规则的示意图。

下面是 /All Filters/Soc Filters/Exclude Valid Users 筛选器的一项规则。

说明“排除有效用户”筛选器的示意图。

嵌套筛选器示例:KQL

以下是在 KQL 中编写具有 OR 条件的筛选器规则的几种方法。

第一个选项是使用带有 where 语句的直接筛选器:

SecurityEvent
| where EventID == 4728 
| where isnotempty(SubjectDomainName) or 
isnotempty(TargetDomainName) 
| where SubjectUserName !~ "AutoMatedService"

第二个选项是使用 KQL 函数:

  1. 使用 ExcludeValidUsers 别名将以下查询另存为 KQL 函数。

        SecurityEvent
        | where EventID == 4728
        | where isnotempty(SubjectDomainName)
        | where SubjectUserName =~ "AutoMatedService"
        | project SubjectUserName
    
  2. 使用以下查询筛选 ExcludeValidUsers 别名。

        SecurityEvent    
        | where EventID == 4728
        | where isnotempty(SubjectDomainName) or 
        isnotempty(TargetDomainName)
        | where SubjectUserName !in (ExcludeValidUsers)
    

第三个选项是使用参数函数:

  1. 创建一个以 ExcludeValidUsers 作为名称和别名的参数函数。

  2. 定义函数的参数。 例如:

        Tbl: (TimeGenerated:datatime, Computer:string, 
        EventID:string, SubjectDomainName:string, 
        TargetDomainName:string, SubjectUserName:string)
    
  3. parameter 函数具有以下查询:

        Tbl
        | where SubjectUserName !~ "AutoMatedService"
    
  4. 运行以下查询以调用参数函数:

        let Events = (
        SecurityEvent 
        | where EventID == 4728
        );
        ExcludeValidUsers(Events)
    

第四个选项是使用 join 函数:

let events = (
SecurityEvent
| where EventID == 4728
| where isnotempty(SubjectDomainName) 
or isnotempty(TargetDomainName)
);
let ExcludeValidUsers = (
SecurityEvent
| where EventID == 4728
| where isnotempty(SubjectDomainName)
| where SubjectUserName =~ "AutoMatedService"
);
events
| join kind=leftanti ExcludeValidUsers on 
$left.SubjectUserName == $right.SubjectUserName

注意事项:

  • 建议你使用带有 where 语句的直接筛选器(第一个选项),因为它很简单。 若要优化性能,请避免使用 join(第四个选项)。
  • 若要优化查询,请尽可能避免使用不区分大小写的 =~!~ 运算符。 如果值不区分大小写,请使用 ==!= 运算符。

活动列表(查找)示例:ArcSight

下面是 ArcSight 中的一个活动列表(查找)规则。

说明示例活动列表规则(查找 (lookup))的示意图。

活动列表(查找)示例:KQL

此规则假设在 Microsoft Sentinel 中存在一个带有帐户字段的 Cyber-Ark 异常帐户监视列表。

let Activelist=(
_GetWatchlist('Cyber-Ark Exception Accounts')
| project Account );
CommonSecurityLog
| where DestinationUserName in (Activelist)
| where DeviceVendor == "Cyber-Ark"
| where DeviceAction == "Get File Request"
| where DeviceCustomNumber1 != ""
| project DeviceAction, DestinationUserName, 
TimeGenerated,SourceHostName, 
SourceUserName, DeviceEventClassID

从筛选出最多数据的 where 语句开始对筛选器进行排序。

关联(匹配)示例:ArcSight

下面是一个示例 ArcSight 规则,它使用 Matching Event 语句针对一组基本事件定义条件。

说明示例关联规则(匹配 (matching))的示意图。

关联(匹配)示例:KQL

let event1 =(
SecurityEvent
| where EventID == 4728
);
let event2 =(
SecurityEvent
| where EventID == 4729
);
event1
| join kind=inner event2 
on $left.TargetUserName==$right.TargetUserName

最佳做法:

  • 若要优化查询,请确保较小的表位于 join 函数的左侧。
  • 如果表的左侧相对较小(最多 100K 条记录),请添加 hint.strategy=broadcast 以获得更好的性能。

关联(时间窗口)示例:ArcSight

下面是一个示例 ArcSight 规则,它使用 Matching Event 语句定义针对一组基本事件的条件,并使用 Wait time 筛选条件。

说明示例关联规则(时间范围 (time window))的示意图。

关联(时间窗口)示例:KQL

let waittime = 10m;
let lookback = 1d;
let event1 = (
SecurityEvent
| where TimeGenerated > ago(waittime+lookback)
| where EventID == 4728
| project event1_time = TimeGenerated, 
event1_ID = EventID, event1_Activity= Activity, 
event1_Host = Computer, TargetUserName, 
event1_UPN=UserPrincipalName, 
AccountUsedToAdd = SubjectUserName 
);
let event2 = (
SecurityEvent
| where TimeGenerated > ago(waittime)
| where EventID == 4729
| project event2_time = TimeGenerated, 
event2_ID = EventID, event2_Activity= Activity, 
event2_Host= Computer, TargetUserName, 
event2_UPN=UserPrincipalName,
 AccountUsedToRemove = SubjectUserName 
);
 event1
| join kind=inner event2 on TargetUserName
| where event2_time - event1_time < lookback
| where tolong(event2_time - event1_time ) >=0
| project delta_time = event2_time - event1_time,
 event1_time, event2_time,
 event1_ID,event2_ID,event1_Activity,
 event2_Activity, TargetUserName, AccountUsedToAdd,
 AccountUsedToRemove,event1_Host,event2_Host, 
 event1_UPN,event2_UPN

聚合示例:ArcSight

下面是一个包含聚合设置的示例 ArcSight 规则:10 分钟内匹配 3 次。

说明示例聚合规则的示意图。

聚合示例:KQL

SecurityEvent
| summarize Count = count() by SubjectUserName, 
SubjectDomainName
| where Count >3

后续步骤

在本文中,你已了解如何将迁移规则从 ArcSight 映射到 Microsoft Sentinel。