开发高级安全信息模型 (ASIM) 分析程序(公共预览版)

高级安全信息模型 (ASIM) 用户在查询中使用统一的分析程序而不是表名,从而以规范化的格式查看数据并添加所有与查询中的架构相关的数据。 统一分析程序进而使用特定于源的分析程序来处理每个源的特定详细信息。

Microsoft Sentinel 为许多数据源提供内置的特定于源的分析程序。 在下列情况下,可能需要修改或开发这些特定于源的分析程序:

  • 如果设备提供适用于 ASIM 架构的事件,但设备的特定于源的分析程序和相关架构在 Microsoft Sentinel 中不可用。

  • 如果 ASIM 特定于源的分析程序可用于你的设备时,但你的设备以不同于 ASIM 分析程序所需的方法或格式发送事件。 例如:

    • 源设备可能配置为以非标准方式发送事件。

    • 你的设备的版本可能不同于 ASIM 分析程序支持的版本。

    • 中间系统可能会收集、修改和转发这些事件。

若要了解分析程序如何适用于 ASIM 体系结构,请参阅 ASIM 体系结构图

重要

ASIM 当前处于预览状态。 Azure 预览版补充条款包含适用于 beta 版、预览版或其他尚未正式发布的 Azure 功能的其他法律条款。

自定义 ASIM 分析程序开发过程

以下工作流介绍了开发特定于源的自定义 ASIM 分析程序的大致步骤:

  1. 收集示例日志

  2. 确定从源发送的事件所表示的架构。 有关详细信息,请参阅架构概述

  3. 将源事件字段映射到已标识的架构。

  4. 为源开发一个或多个 ASIM 分析程序。 需要为与源相关的每个架构开发筛选分析程序和无参数的分析程序。

  5. 测试分析程序。

  6. 将分析程序部署到 Microsoft Sentinel 工作区。

  7. 更新相关的 ASIM 统一分析程序以引用新的自定义分析程序。 有关详细信息,请参阅管理 ASIM 分析程序

  8. 你可能还希望为主要 ASIM 分发版贡献分析程序。 贡献的分析程序也可以在所有工作区中作为内置分析程序提供。

本文将指导你完成过程的开发、测试和部署步骤。

收集示例日志

若要构建有效的 ASIM 分析程序,需要一组具有代表性的日志,因此在大多数情况下需要设置源系统并将其连接到 Microsoft Sentinel。 如果没有可用的源设备,云即用即付服务让你可以部署许多设备以进行开发和测试。

此外,查找日志的供应商文档和示例可有助于确保广泛的日志格式覆盖范围,从而加速开发并减少错误。

一组具有代表性的日志应包括:

  • 具有不同事件结果的事件。
  • 具有不同响应操作的事件。
  • 用户名、主机名和 ID 以及其他需要值规范化的字段的不同格式。

提示

使用同一架构的现有分析程序启动新的自定义分析程序。 使用现有分析程序对于筛选分析程序以确保它们接受架构所需的所有参数尤其重要。

规划映射

在开发分析程序之前,请将源事件中可用的信息映射到你已标识的架构:

  • 映射所有必填字段,最好也映射建议的字段。
  • 尝试将源中可用的任何信息映射到规范化字段。 如果无法作为所选架构的一部分使用,请考虑映射到其他架构中可用的字段。
  • 将源中的字段值映射到 ASIM 允许的规范化值。 原始值存储在单独的字段中,例如 EventOriginalResultDetails

开发分析程序

为每个相关架构都开发一个筛选分析程序和一个无参数的分析程序。

自定义分析程序是在 Microsoft Sentinel 日志页面开发的 KQL 查询。 分析程序查询有三个部分:

筛选器>分析>准备字段

筛选

筛选相关记录

在许多情况下,Microsoft Sentinel 中的表包含多个事件类型。 例如:

  • Syslog 表包含来自多个源的数据。
  • 自定义表可以包含来自单个源的信息,该源提供多种事件类型并可适应各种架构。

因此,分析程序应该首先仅筛选与目标架构相关的记录。

KQL 中的筛选是使用 where 运算符进行的。 例如,Sysmon 事件 1 报告进程创建,因此规范化为 ProcessEvent 架构。 Sysmon 事件 1 事件是 Event 表的一部分,你将使用以下筛选器:

Event | where Source == "Microsoft-Windows-Sysmon" and EventID == 1

重要

分析程序不应按时间进行筛选。 使用分析程序的查询将应用时间范围。

使用播放列表按源类型进行筛选

在某些情况下,事件本身不包含允许筛选特定源类型的信息。

例如,Infoblox DNS 事件作为 Syslog 消息发送,很难与从其他源发送的 Syslog 消息区分开来。 在这种情况下,分析程序依赖于定义相关事件的源列表。 此列表保留在 Sources_by_SourceType 播放列表中。

若要在分析程序中使用 ASimSourceType 播放列表,请在分析程序筛选部分中使用 _ASIM_GetSourceBySourceType 函数。 例如,Infoblox DNS 分析程序在筛选部分中添加以下内容:

  | where Computer in (_ASIM_GetSourceBySourceType('InfobloxNIOS'))

若要在分析程序中使用此示例,请执行以下操作:

  • Computer 替换为包含源的源信息的字段名称。 对于任何基于 Syslog 的分析程序,可以将其保留为 Computer

  • InfobloxNIOS 标记替换为你为分析程序选择的值。 通知分析程序用户,他们必须使用你选择的值更新 ASimSourceType 播放列表以及发送此类事件的源列表。

基于分析程序参数进行筛选

开发筛选分析程序时,请确保分析程序接受相关架构的筛选参数,如该架构的参考文章中所述。 使用现有分析程序作为起点可确保分析程序包含正确的函数签名。 在大多数情况下,实际筛选代码也类似于筛选分析程序,因为架构相同。

筛选时,请确保:

  • 在使用物理字段分析之前进行筛选。 如果筛选后的结果不够准确,请在分析后重复该测试以微调结果。 有关更多信息,请参阅筛选优化
  • 如果参数未定义且仍具有默认值,则不进行筛选。

以下示例显示了如何对字符串参数(默认值通常为“*”)和列表参数(默认值通常为空列表)实现筛选。

srcipaddr=='*' or ClientIP==srcipaddr
array_length(domain_has_any) == 0 or Name has_any (domain_has_any)

筛选优化

为了确保分析器保持良好的性能,请注意以下筛选建议:

  • 始终根据内置字段而不是分析的字段进行筛选。 尽管有时使用已分析的字段进行筛选更简单,但这会显著影响性能。
  • 使用有利于优化性能的运算符。 具体而言,请使用 ==hasstartswith。 使用 containsmatches regex 之类的运算符也会对性能造成很大的影响。

为保持性能而提供的筛选建议不一定总是很容易遵循。 例如,使用 has 不如使用 contains 那么准确。 在其他情况下,匹配内置字段(例如 SyslogMessage)不如比较提取的字段(例如 DvcAction)那么准确。 在这种情况下,建议仍旧使用性能优化的运算符而不是内置字段进行预筛选,并在分析后使用更准确的条件重复筛选。

有关示例,请参阅以下 Infoblox DNS 分析程序代码片段。 该分析器首先检查 SyslogMessage 字段是否 has(包含)单词 client。 但是,术语可能在消息中的其他位置使用,因此分析 Log_Type 字段后,分析程序会再次检查 client 一词是否位于字段的值中。

Syslog | where ProcessName == "named" and SyslogMessage has "client"
…
      | extend Log_Type = tostring(Parser[1]),
      | where Log_Type == "client"

备注

分析程序不应按时间筛选数据,因为使用分析程序的查询已针对时间进行筛选。

分析

查询选择相关的记录后,可能需要分析这些记录。 通常,如果在一个文本字段中传达多个事件字段,则需要进行分析。

下面按性能优化顺序列出了执行分析的 KQL 运算符。 第一个运算符提供优化程度最高的性能,最后一个运算符提供优化程度最低的性能。

运算符 说明
split 分析分隔值的字符串。
parse_csv 分析 CSV(逗号分隔值)行格式的值的字符串。
parse-kv 从字符串表达式中提取结构化信息,并以键/值形式表示该信息。
parse 使用某种模式(可以是性能较好的简化模式,也可以是正则表达式)分析任意字符串中的多个值。
extract_all 使用正则表达式分析任意字符串中的单一值。 extract_all 的性能类似于 parse(如果后者使用正则表达式)。
extract 使用正则表达式提取任意字符串中的单个值。

如果需要单个值,则使用 extract 的性能比使用 parseextract_all 更好。 但是,对同一源字符串多次激活 extract 则不如单次激活 parseextract_all 高效,因此应避免此操作。
parse_json 分析 JSON 格式的字符串中的值。 如果只需要 JSON 中的少量几个值,则使用 parseextractextract_all 可提供更好的性能。
parse_xml 分析 XML 格式的字符串中的值。 如果只需要 XML 中的少量几个值,则使用 parseextractextract_all 可提供更好的性能。

规范化

映射字段名称

最简单的规范化形式是将原始字段重命名为其规范化名称。 为此,请使用运算符 project-rename。 使用项目重命名可确保该字段仍作为物理字段进行管理,并且处理该字段时的性能更高。 例如:

 | project-rename
    ActorUserId = InitiatingProcessAccountSid,
    ActorUserAadId = InitiatingProcessAccountObjectId,
    ActorUserUpn = InitiatingProcessAccountUpn,

规范化字段格式和类型

在许多情况下,提取的原始值需要规范化。 例如,在 ASIM 中,MAC 地址使用冒号作为分隔符,而源可能会发送连字符分隔的 MAC 地址。 用于转换值的主要运算符是 extend,还有一组广泛的 KQL 字符串、数字和日期函数也可用于转换值。

此外,确保分析程序输出字段与架构中定义的类型匹配,这对于分析程序正常工作至关重要。 例如,可能需要将表示日期和时间的字符串转换为日期时间字段。 在这种情况下,todatetimetohex 等函数非常有用。

例如,原始唯一事件 ID 可能以整数的形式发送,但 ASIM 要求该值为字符串以确保数据源之间的广泛兼容性。 因此,分配源字段时,请使用 extendtostring,而不是 project-rename

  | extend EventOriginalUid = tostring(ReportId),

派生的字段和值

提取源字段的值后,可能需要将其映射到为目标架构字段指定的值集。 将可用数据映射到目标值时,iffcaselookup 函数可以提供帮助。

例如,Microsoft DNS 分析器使用 iff 语句基于事件 ID 和响应代码分配 EventResult 字段,如下所示:

   extend EventResult = iff(EventId==257 and ResponseCode==0 ,'Success','Failure')

若要映射多个值,请使用 datatable 运算符定义映射并使用 lookup 执行映射。 例如,某些源报告数字 DNS 响应代码和网络协议,而架构则要求使用这两者更常见的文本标签表示形式。 以下示例演示如何使用 datatablelookup 派生所需的值:

   let NetworkProtocolLookup = datatable(Proto:real, NetworkProtocol:string)[
        6, 'TCP',
        17, 'UDP'
   ];
    let DnsResponseCodeLookup=datatable(DnsResponseCode:int,DnsResponseCodeName:string)[
      0,'NOERROR',
      1,'FORMERR',
      2,'SERVFAIL',
      3,'NXDOMAIN',
      ...
   ];
   ...
   | lookup DnsResponseCodeLookup on DnsResponseCode
   | lookup NetworkProtocolLookup on Proto

请注意,当映射只有两个可能的值时,lookup 很有用且高效。

映射条件比较复杂时,请合并 iffcaselookup。 以下示例演示了如何将 lookupcase 结合使用。 如果找不到 lookup 值,则上面的 lookup 示例会在字段 DnsResponseCodeName 中返回空值。 下面的 case 示例通过使用 lookup 操作的结果(如果可用)并指定在没有操作结果可用时的其他条件来扩充它。

   | extend DnsResponseCodeName = 
      case (
        DnsResponseCodeName != "", DnsResponseCodeName,
        DnsResponseCode between (3841 .. 4095), 'Reserved for Private Use',
        'Unassigned'
      )

Microsoft Sentinel 为常见查找值提供方便使用的函数。 例如,可以使用以下函数之一实现上述的 DnsResponseCodeName 查找:


| extend DnsResponseCodeName = _ASIM_LookupDnsResponseCode(DnsResponseCode)

| invoke _ASIM_ResolveDnsResponseCode('DnsResponseCode')

第一个选项接受要查找的值作为参数,并让你选择输出字段以用作一般查找函数。 第二个选项更适用于分析程序,采用源字段的名称作为输入,并更新所需的 ASIM 字段,在本例中为 DnsResponseCodeName

有关 ASIM 帮助函数的完整列表,请参阅 ASIM 函数

扩充字段

除了源中可用的字段外,生成的 ASIM 事件还包括分析程序应生成的扩充字段。 在许多情况下,分析程序可以将常量值分配给字段,例如:

  | extend                  
     EventCount = int(1),
     EventProduct = 'M365 Defender for Endpoint',
     EventVendor = 'Microsoft',
     EventSchemaVersion = '0.1.0',
     EventSchema = 'ProcessEvent'

分析程序应设置的另一种扩充字段是类型字段,用于指定相关字段中存储的值的类型。 例如,SrcUsernameType 字段指定 SrcUsername 字段中存储的值类型。 可以在实体说明中找到有关类型字段的详细信息。

在大多数情况下,还会向类型分配常量值。 但是,在某些情况下,必须根据实际值来确定类型,例如:

   DomainType = iif (array_length(SplitHostname) > 1, 'FQDN', '')

Microsoft Sentinel 提供用于处理扩充的有用函数。 例如,使用以下函数基于字段 Computer 中的值自动分配字段 SrcHostnameSrcDomainSrcDomainTypeSrcFQDN

  | invoke _ASIM_ResolveSrcFQDN('Computer')

此函数将按如下所示设置字段:

计算机字段 输出字段
server1 SrcHostname:server1
SrcDomain、SrcDomainType、SrcFQDN 全部为空
server1.microsoft.com SrcHostname:server1
SrcDomain:microsoft.com
SrcDomainType:FQDN
SrcFQDN:server1.microsoft.com

函数 _ASIM_ResolveDstFQDN_ASIM_ResolveDvcFQDN 执行与填充相关 DstDvc 字段类似的任务。有关 ASIM 帮助函数的完整列表,请参阅 ASIM 函数

在结果集中选择字段

分析程序可以选择在结果集中选择字段。 删除不需要的字段可以提高性能,并通过避免规范化字段和剩余源字段之间的混淆来增加清晰度。

以下 KQL 运算符用于在结果集中选择字段:

运算符 说明 何时在分析器中使用
project-away 删除字段。 对于要从结果集中删除的特定字段,请使用 project-away。 建议不要从结果集中删除未规范化的原始字段,除非它们会造成混淆,或者非常大,并且可能会影响性能。
project 选择之前已存在的字段,或者作为语句的一部分创建的字段,并删除所有其他字段。 不建议在分析器中使用,因为分析器不应删除未规范化的任何其他字段。

如果需要删除特定的字段(例如,在分析过程中使用的临时值),请使用 project-away 从结果中将其删除。

例如,在分析自定义日志表时,请使用以下命令删除仍具有类型描述符的剩余原始字段:

    | project-away
        *_d, *_s, *_b, *_g

处理分析变体

重要

不同的变体表示不同的事件类型(通常映射到不同的架构),开发不同的分析程序

在许多情况下,事件流中的事件包括需要不同分析逻辑的变体。 若要分析单个分析程序中的不同变体,请使用条件语句(例如 iffcase),或使用 union 结构。

若要要使用 union 处理多个变体,请为每个变体创建单独的函数并使用 union 语句来组合结果:

let AzureFirewallNetworkRuleLogs = AzureDiagnostics
    | where Category == "AzureFirewallNetworkRule"
    | where isnotempty(msg_s);
let parseLogs = AzureFirewallNetworkRuleLogs
    | where msg_s has_any("TCP", "UDP")
    | parse-where
        msg_s with           networkProtocol:string 
        " request from "     srcIpAddr:string
        ":"                  srcPortNumber:int
    …
    | project-away msg_s;
let parseLogsWithUrls = AzureFirewallNetworkRuleLogs
    | where msg_s has_all ("Url:","ThreatIntel:")
    | parse-where
        msg_s with           networkProtocol:string 
        " request from "     srcIpAddr:string
        " to "               dstIpAddr:string
    ...
union parseLogs,  parseLogsWithUrls…

若要避免重复事件和过度处理,请确保每个函数首先使用原生字段仅筛选出要分析的事件。 此外,如果需要,请在 union 语句之前在每个分支上使用 project-away。

部署分析器

通过将分析程序复制到 Azure Monitor 日志页面并将查询保存为函数来手动部署分析程序。 此方法可用于测试。 有关详细信息,请参阅创建函数

若要部署大量分析程序,建议使用分析程序 ARM 模板,如下所示:

  1. 基于每个架构的相关模板创建 YAML 文件,并在其中添加查询。 从与你的架构和分析程序类型相关的 YAML 模板开始,筛选或无参数。

  2. 使用 ASIM Yaml 到 ARM 模板转换器,将 YAML 文件转换为 ARM 模板。

  3. 如果部署更新,请使用门户或函数删除 PowerShell 工具删除旧版本的函数。

  4. 使用 Azure 门户PowerShell 部署模板。

还可使用关联模板将多个模板合并到单个部署过程

提示

ARM 模板可以合并不同的资源,因此你的分析程序可与连接器、分析规则或播放列表一起部署,以命名一些有用的选项。 例如,分析器可以引用与其一起部署的监视列表。

测试分析程序

本部分介绍 ASIM 提供的用于测试分析程序的测试工具。 即使有了该工具,但分析程序也是代码,有时很复杂,因此除了自动测试之外,我们还建议使用标准的质量保证实践,例如代码评审。

安装 ASIM 测试工具

若要测试 ASIM,将 ASIM 测试工具部署到 Microsoft Sentinel 工作区,其中:

  • 分析程序已部署。
  • 分析程序使用的源表可用。
  • 分析程序使用的源表填充了各种相关事件的集合。

验证输出架构

若要确保分析程序生成有效的架构,请使用 ASIM 架构测试程序,方法是在 Microsoft Sentinel 日志页面运行以下查询:

<parser name> | getschema | invoke ASimSchemaTester('<schema>')

按如下所示处理结果:

Error 操作
缺少必填字段 [<Field>] 将该字段添加到分析程序。 在许多情况下,这将是派生值或常量值,而不是源中已有的字段。
当必填列 [<Field>] 存在时,缺少的字段 [<Field>] 是必填的 将该字段添加到分析程序。 在许多情况下,此字段表示它引用的现有列的类型。
当列 [<Field>] 存在时,缺少的字段 [<Field>] 是必填的 将该字段添加到分析程序。 在许多情况下,此字段表示它引用的现有列的类型。
缺少用于为现有列 [<Field>] 起别名的必填别名 [<Field>] 将该别名添加到分析程序
缺少用于为现有列 [<Field>] 起别名的建议别名 [<Field>] 将该别名添加到分析程序
缺少用于为现有列 [<Field>] 起别名的可选别名 [<Field>] 将该别名添加到分析程序
缺少用于为缺失列 [<Field>] 起别名的必填别名 [<Field>] 此错误附带别名字段的类似错误。 更正别名字段错误,将此别名添加到分析程序。
字段 [<Field>] 的类型不匹配。 它当前为 [<Type>],应该为 [<Type>] 请确保规范化字段的类型是正确的,通常的方法是使用转换函数,例如 tostring
信息 操作
缺少建议的字段 [<Field>] 请考虑将此字段添加到分析程序。
信息 操作
缺少用于为不存在的列 [<Field>] 起别名的建议别名 [<Field>] 如果将别名字段添加到分析程序,请确保也添加此别名。
缺少用于为不存在的列 [<Field>] 起别名的可选别名 [<Field>] 如果将别名字段添加到分析程序,请确保也添加此别名。
缺少可选字段 [<Field>] 虽然可选字段通常缺失,但值得查看列表以确定是否可以从源映射任何可选字段。
额外的未规范化字段 [<Field>] 尽管未规范化的字段有效,但值得查看列表以确定任何未规范化的值是否可映射到可选字段。

注意

错误将阻止使用分析程序的内容正常工作。 警告不会阻止内容工作,但可能会降低结果的质量。

验证输出值

若要确保分析程序生成有效值,请使用 ASIM 数据测试程序,方法是在 Microsoft Sentinel 日志页面运行以下查询:

<parser name> | limit <X> | invoke ASimDataTester ('<schema>')

指定架构的操作是可选的。 如果未指定架构,则 EventSchema 字段用于标识事件应遵循的架构。 如果事件不包含 EventSchema 字段,则只会验证公用字段。 如果将架构指定为参数,则此架构将用于测试所有记录。 这对于未设置 EventSchema 字段的较旧分析程序非常有用。

注意

即使未指定架构,函数名称之后也需要空括号。

此测试是资源密集型的,可能无法用于整个数据集。 将 X 设置为查询不会超时的最大数字,或者使用时间范围选取器设置查询的时间范围。

按如下所示处理结果:

消息 操作
(0) Error:列类型不匹配 [<Field>]。 它当前为 [<Type>],应该为 [<Type>] 请确保规范化字段的类型是正确的,通常的方法是使用转换函数,例如 tostring
(0) 错误:字段的无效值(列出最多 10 个)[<Field>] 类型为 [<Logical Type>] 请确保分析程序将正确的源字段映射到输出字段。 如果映射正确,请更新分析程序,将源值转换为正确的类型、值或格式。 请参阅逻辑类型列表,详细了解每个逻辑类型的正确值和格式。

请注意,测试工具仅列出了 10 个无效值的示例。
(1) 警告: 必填字段 [<Field>] 中存在空值 应填充必填字段,而不只是定义必填字段。 检查是否可以针对当前源为空的记录,从其他源填充字段。
(2) 信息: 建议的字段 [<Field>] 中存在空值 通常应填充建议的字段。 检查是否可以针对当前源为空的记录,从其他源填充字段。
(2) 信息: 可选字段 [<Field>] 中存在空值 检查别名字段是强制的还是建议的,如果是,是否可以从其他源填充它。

许多消息还报告生成消息的记录数及其总样本百分比。 此百分比是问题重要性的良好指标。 例如,对于建议的字段:

  • 90% 的空值可能指示一个普遍的分析问题。
  • 25% 的空值可能指示未正确分析的事件变体。
  • 少量空值可能是一个微不足道的问题。

注意

错误将阻止使用分析程序的内容正常工作。 警告不会阻止内容工作,但可能会降低结果的质量。

贡献分析程序

你可能希望将分析程序贡献给主要 ASIM 分发版。 如果分析程序被接受,它们将作为 ASIM 内置分析程序提供给每个客户。

若要贡献分析程序,请执行以下操作:

记录接受的警告

如果认为 ASIM 测试工具列出的警告对分析程序有效,请使用“Exceptions”部分将接受的警告记录到分析程序 YAML 文件中,如以下示例所示。

Exceptions:
- Field: DnsQuery 
  Warning: Invalid value
  Exception: May have values such as "1164-ms-7.1440-9fdc2aab.3b2bd806-978e-11ec-8bb3-aad815b5cd42" which are not valid domains names. Those are related to TKEY RR requests.
- Field: DnsQuery
  Warning: Empty value in mandatory field
  Exception: May be empty for requests for root servers and for requests for RR type DNSKEY

YAML 文件中指定的警告应该是用于唯一标识的警告消息简短形式。 该值用于在执行自动测试时匹配警告消息并忽略它们。

示例提交指南

在排查分析程序问题并确保分析程序的未来更新符合旧示例时,需要使用示例数据。 提交的示例应包括分析程序支持的任何事件变体。 请确保示例事件包括所有可能的事件类型、事件格式和变体,例如表示成功和失败活动的事件。 此外,请确保表示值格式方面的变化。 例如,如果主机名可以表示为 FQDN 或简单主机名,则示例事件应同时包含这两种格式。

要提交事件示例,请使用以下步骤:

  • Logs 屏幕中,运行一个查询,以仅从源表中提取分析程序选择的事件。 例如,对于 Infoblox DNS 分析程序,使用以下查询:
    Syslog
    | where ProcessName == "named"
  • 使用“导出到 CSV”选项将结果导出到名为 <EventVendor>_<EventProduct>_<EventSchema>_IngestedLogs.csv 的文件,其中 EventProductEventProductEventSchema 是分析程序分配给这些字段的值。

  • Logs 屏幕中,运行将会输出架构或分析程序输入表的查询。 例如,对于同一 Infoblox DNS 分析程序,查询为:

    Syslog
    | getschema
  • 使用“导出到 CSV”选项将结果导出到名为 <TableName>_schema.csv 的文件,其中 TableName 是分析程序使用的源表的名称。

  • 在文件夹 /Sample Data/ASIM 的 PR 中同时包含这两个文件。 如果文件已存在,则将 GitHub 句柄添加到名称,例如:<EventVendor>_<EventProduct>_<EventSchema>_SchemaTest_<GitHubHanlde>.csv

测试结果提交指南

测试结果对于验证分析程序的正确性并了解报告的任何异常非常重要。

要提交测试结果,可使用以下步骤:

  • 运行测试部分所述的分析程序测试。

  • 并使用“导出到 CSV”选项将测试结果导出到分别名为 <EventVendor>_<EventProduct>_<EventSchema>_SchemaTest.csv<EventVendor>_<EventProduct>_<EventSchema>_DataTest.csv 的文件。

  • 在文件夹 /Parsers/ASim<schema>/Tests 的 PR 中同时包含这两个文件。

后续步骤

本文讨论如何开发 ASIM 分析程序。

了解有关 ASIM 分析程序的更多信息:

了解有关 ASIM 的大致信息: