使用数据表格

支持的语言:

数据表是多列数据结构,可让您将自己的数据输入到 Google Security Operations。它们可以充当包含已定义列且在行中存储了数据的对照表。 您可以使用 Google SecOps 网页界面、Data Tables API 或 YARA-L 查询,在 Google SecOps 账号中创建或导入数据表。

使用数据 RBAC 为数据表分配范围

如需使用数据表,您需要使用基于数据角色的访问权限控制 (data RBAC) 为数据表分配范围。通过为数据表分配范围,您可以控制哪些用户和资源可以访问和使用该数据表。如需了解详情,请参阅为数据表配置数据 RBAC

使用 Google SecOps 网页界面管理数据表

以下部分介绍了如何使用网页界面管理数据表,包括如何访问数据表、添加新数据表并修改其内容、将数据导入表格、添加行、使用逗号或制表符分隔数据,以及如何从账号中移除数据表。

访问数据表格

如需访问数据表页面,请执行以下操作:

  • 在左侧边栏中,依次选择调查 > 数据表

如需查找特定的数据表,请在边栏顶部的搜索字段中输入其名称。

添加新数据表

如需向 Google SecOps 添加新的数据表,请完成以下步骤:

  1. 点击边栏右上角的 创建

  2. 创建新数据表对话框中,为新表命名,并可选择性地添加说明。

  3. 点击创建。新数据表会显示在主窗口中,并可随时接受数据。

将数据导入到数据表中

如需向数据表中添加数据,您可以按如下方式将其直接导入到 Google SecOps 中:

  1. 点击导入数据

  2. 选择标准 CSV 文件(只有 CSV 文件可以导入 Google SecOps)。

  3. 准备好将数据导入数据表后,点击打开

将数据类型映射到数据表列

您可以使用网页界面或 API 将单个数据字段映射到数据列,并将重复的数据字段映射到数据列,具体操作如下:

  • 在网页界面和 API 中,都使用 | 字符分隔数据字段值。在网页界面中,如果任何值包含 | 字符,系统默认将其视为重复值。

  • 对于 API 请求,请将 repeated_values 设置为 true

如需了解详情,请参阅重复字段

在以下示例中,数据表列 Field_value 包含多个字段的值:

Field_value Field_name
altostrat.com FQDN
192.0.2.135 IP
charlie userid
示例 主机名

上表拆分为四列,每列仅映射到一个字段类型,然后才能用于本文档中介绍的任何数据表使用情形。

FQDN IP Userid 主机名
altostrat.com 192.0.2.135 charlie 示例

将特定列指定为键列

将列标记为键列可唯一标识该列中的值,防止数据重复,并改进规则和搜索的数据发现。

指定支持重复字段的特定列

旨在存储多值字段或重复字段的列在创建数据表时必须明确指定为重复

将列名称映射到实体字段(可选)

创建数据表时,您可以将数据表的列名称映射到实体字段。

在以下示例数据表格中,UseridRole 列分别映射到 entity.user.useridentity.user.attribute.role.name

Userid
(映射到 entity.user.userid)
电子邮件 角色
(映射到 entity.user.attribute.role.name)
jack jack123@gmail.com 管理员
tony tony123@gmail.com 工程师

您可以使用 DataTable 资源的 mapped_column_path 字段将数据表列映射到实体 proto 字段。

对于没有定义实体路径的列(例如此示例表中的 Email),您必须手动指定数据类型。与参考列表一样,数据表支持的数据类型为 numberstringregexcidr

您可以通过指定 join 条件,在数据表中同时包含已映射和未映射的列。

未映射的列存储在表联接到的实体的 additional 字段中。这些值以键值对的形式添加,其中 key 是列名,value 是相应的行值。

向数据表中添加新行

如需添加新行,请按以下步骤操作:

  1. 详细信息标签页上,右键点击现有行,然后选择在上方添加行

  2. 输入新行的数据,其中第一行被视为表格标题:

    1. 使用英文逗号或制表符分隔数据字段。
    2. 请务必将每个数据项与相应的数据列匹配。
    3. 详细信息标签页中输入行数据时,该数据会填充到表格编辑器中。

修改数据表中的行

如需修改某一行,请完成以下操作:

  1. 点击要更改的字段。然后,该字段会变为可修改状态。

  2. 完成更改后,点击保存

指定是使用英文逗号还是制表符来分隔数据

如需使用逗号或制表符分隔数据,请执行以下操作:

  1. 点击导入数据旁边的 修改分隔符类型

  2. 修改分隔符类型对话框中,从分隔符菜单中选择逗号制表符

搜索数据表格行

您可以使用网页界面在数据表中搜索特定信息。在详细信息标签页中,在搜索字段中输入搜索字符串,然后点击搜索。系统会显示包含搜索字符串的行。

管理表格行 TTL

如需管理表行的存留时间 (TTL) 值,请执行以下操作:

  1. 点击显示每行的 TTL。系统会显示一个 TTL 列,指明每行是否已过期。如果未过期,则显示过期前的剩余时间。

  2. 点击默认行过期时间以显示更新默认行过期对话框,并调整表行 TTL。

  3. 小时天数中输入新的 TTL 值。最小值为 24 小时。最大值为 365 天。

  4. 点击保存

删除表格行

如需删除某行,请右键点击该行,然后选择删除行

如需删除多行,请选择要移除的每一行。然后,右键点击任意所选行,并选择删除行

移除数据表

如需移除数据表,请执行以下操作:

  1. 从左侧的数据表列表中选择一个数据表。

  2. 点击删除

使用 Chronicle API 管理数据表

您还可以使用 Chronicle API 中提供的 REST 资源来管理 Google SecOps 中的数据表。该 API 可以复制网页界面中的所有功能,并包含一些额外的功能,让您能够以更高的性能和更大的规模管理数据表。

以下是数据表 REST 资源:

示例:过滤条件语法

以下 Chronicle API 示例展示了如何使用 filter 语法在数据表行中搜索 google.com

curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://staging-chronicle.sandbox.googleapis.com/v1alpha/projects/{$PROJECT}/locations/${REGION}/instances/${INSTANCE}/dataTables/${DATA_TABLE_NAME}/dataTableRows?filter=google.com

在 Google SecOps 中使用数据表

将数据表导入到 Google SecOps 实例后,您可以使用 YARA-L 查询来过滤、增强和丰富数据。本文档包含许多采用 YARA-L 语法的示例,您可以将这些示例纳入 Google SecOps 中。

您可以在搜索和规则中将数据表与 YARA-L 查询搭配使用。数据表可用于以下用途:

  • 使用数据表过滤 UDM 事件或实体数据。您可以通过将 UDM 遥测事件和实体与数据表中的条目进行比较来过滤它们。

  • 将数据表用作多列参考列表。您可以使用数据表作为多列参考列表。虽然参考列表可以访问单个维度的数据,但数据表可让您访问多个维度的数据,从而实现数据过滤。

  • 将数据表与事件或实体联接。您可以使用等值 (=) 运算符将 UDM 事件关联到数据表,以进行基于行的比较。通过此比较,您可以过滤数据。只有当语句中的所有条件都与数据表中的单行匹配时,基于行的比较才会评估为 true

使用数据表过滤 UDM 事件和实体数据

您可以通过将 UDM 事件和实体与数据表中的条目进行比较来过滤它们。

您可以采用以下任一方式将 UDM 事件与数据表相关联:

  • 使用等值运算符 (=, !=, >, >=, <, <=) 进行基于行的比较。例如 $<udm_variable>.<field_path> = %<data_table_name>.<column_name>

  • 使用 in 关键字进行基于列的比较。 例如,$<udm_variable>.<field_path> in %<data_table_name>.<column_name>

参考列表一样,每个数据表列支持的数据类型可以是 numberstringregexCIDR

如需使用 number 类型的列进行基于列的比较和联接,请使用以下语法。此示例搜索包含 target.port 8080 的事件。

%table.number_field = target.port
%table.number_field = 8080
target.port in %table.number_field

如需使用 CIDRregex 类型的表格列进行基于行的比较,请使用以下语法:

net.ip_in_range_cidr($e.principal.ip, %<data_table_name>.<column_name>)

re.regex($e.principal.hostname, %<data_table_name>.<column_name>)

如需使用 CIDRregex 类型的表格列进行基于列的比较,请使用以下语法:

$e.principal.ip in cidr %cidr_data_table.column_name

$e.principal.hostname in regex %regex_data_table.column_name

在比较数据表中属于 CIDR 或正则表达式数据类型的列时,cidrregex 关键字是可选的。您还可以将 not 运算符与数据表搭配使用。以下示例查询会过滤掉 IP 地址 ($e.principal.ip) 与 cidr_data_tablebenign_ip 列列出的任何 CIDR 范围都不匹配的条目:

not $e.principal.ip in %data_table.benign_ip

将数据表用作多列参考列表

您可以使用数据表作为多列参考列表。虽然参考列表可以访问单个维度(一列)中的数据,但数据表支持多列,让您可以跨多个维度过滤和访问数据。

您可以使用 in 关键字将 UDM 事件与数据表相关联,以进行基于列的比较,从而将特定 UDM 字段中的值与数据表的单个列中的值进行匹配。

在以下示例中,badApps 数据表包含两列:hostnameip。查询会分别匹配这两个值(基于 UDM 字段的值和基于数据表的值,两者均为字符串数据类型)。

规则示例:

rule udm_in_data_table {
meta:
  description = "Use data table as multicolumn reference list"
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.security_result.action = "ALLOW"
$e.target.asset.asset_id = $assetid
     
// Event hostname matches at least one value in table column hostname.
$e.target.hostname in %badApps.hostname
    
// Event IP matches at least one value in table column ip.
$e.target.ip in %badApps.ip
match:
$assetid over 1h

condition:
$e
}

搜索示例:

events:
    $e.metadata.event_type = "NETWORK_CONNECTION"
    $e.security_result.action = "ALLOW"
    $e.target.asset.asset_id = $assetid
  
    // Event hostname matches at least one value in table column hostname.
    $e.target.hostname in %badApps.hostname
     
    // Event IP matches at least one value in table column ip.
    $e.target.ip in %badApps.ip

将数据表与 UDM 事件或实体联接

您可以使用等值和比较运算符 (=, !=, >, >=, <, <=) 将 UDM 事件关联到数据表,以执行基于行的比较。此方法可让您通过将 UDM 事件中的值与数据表中的行进行匹配来过滤数据。如果您使用多个比较语句,则所有字段或条件都必须匹配同一数据表行。

您必须在 UDM 字段和数据表行之间添加至少一个 join 条件,才能在查询中使用运算符(例如 not, !=, >, >=, <, <=)。Google SecOps 会将包含数据表 join 的任何规则视为多事件规则,因此您还需要在规则定义中添加相应的 match 部分。

发生联接时,关联的数据表行会显示在 Google 搜索中。如需了解详情,请参阅在 Google 搜索中查看数据表行

以下示例使用 string 类型的数据表列。此 YARA-L 查询通过确认 user ID 是否存在于表中,来检查用户登录事件是否与 example_table 中的某一行匹配。只有当数据表中同一行同时满足这两个条件时,规则才会触发。

// Check if a user exists in a data table and that the user is active for all user login events.

规则示例:

rule udm_join_data_table {
meta:
    description = "Join data table with UDM event"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "ALLOW"
$e.principal.user.userid = $userid

// Event must match at least 1 row in the table where the uid in the table
// row is the userid on the event and the active date in the same table
// row is before the event timestamp
%example_table.uid = $userid
$e.principal.hostname = %example_table.hostname

match:
$userid over 1h

condition:
$e
}

搜索示例:

events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "ALLOW"
$e.principal.user.userid = $userid

// Event must match at least 1 row in the table where the uid in the table
// row is the userid on the event and the active date in the same table
// row is before the event timestamp
%example_table.uid = $userid
$e.principal.hostname = %example_table.hostname

以下示例展示了数据表和 UDM 事件数据如何协同工作。根据上述 YARA-L 查询中的逻辑,如果用户具有 user ID 32452,则在检测中,该用户会显示为系统中的 hostname,并与数据表中的 hostname 相匹配。

数据表格
uid title 主机名
32452 HR host1
64452 金融 host2
46364 IT host3
UDM 事件表
主账号 元数据 security_result 主账号
32452 USER_LOGIN 允许 host1
64589 USER_LOGIN 允许 host9
87352 USER_LOGIN 允许 host4

将 YARA-L 查询的结果写入数据表

您可以将 YARA-L 查询的结果写入数据表。借助此功能,您可以根据 Google SecOps 数据创建数据表,并使用这些表来过滤和增强其他数据。

您可以使用 YARA-L 查询写入语法执行以下操作:

  • 定义用于将查询结果写入数据表的 YARA-L 语法。

  • 将数据表用于威胁情报、突发事件响应和其他安全用例。

  • 数据应符合 YARA-L 语法和惯例。

使用 YARA-L 将检测结果和提醒写入数据表

您可以使用 YARA-L 查询将检测结果和提醒发送到数据表。

使用 write_row 函数,您可以使用规则的结果覆盖数据表中具有匹配键的数据表行。如果未在表中找到相应键,则添加新行。

在 YARA-L 查询的导出部分中指定 write_row 函数。将数据写入数据表必须是查询的最终操作。这会导致结果变量被写入数据表。

export:
  %<data_table_name>.write_row(
  data_table_column_x_name: <value>,
  data_table_column_y_name: <value>,
  ...,
  ...,
  data_table_column_z_name: <value>
)
// depending on the key column(s), the rows will be updated for existing keys 
and appended for new keys

使用 YARA-L 修改数据表

以下示例展示了如何使用 YARA-L 修改数据表:

TableName: ip_user_domain_table(主键的键列在创建时定义)

ip_address employee_id* 网域
192.0.2.10 Dana altostrat.com
192.0.2.20 Quinn altostrat.com
192.0.2.30 Lee cymbalgroup.com

* 表示主键。

以下查询可捕获 principal.ipprincipal.user.employee_idtarget.domain 的唯一组合。它会根据 target.domain 的普遍程度过滤结果:

events:
    $e.principal.ip = $principal_ip
    $e.principal.user.employee_id = $principal_user_employee_id
    $e.target.domain.name = $target_domain
    $e.target.domain.prevalence.day_count < 5

// To run this query as a rule, add Condition Section here 
// condition:$e

查询结果:

ip empid 网域
192.0.2.10 Dana altostrat.com
192.0.2.30 Lee examplepetstore.com
192.0.2.20 Quinn altostrat.com

示例:使用 write_row 将查询输出写入数据表

规则示例:

rule udm_write_data_table {
meta:
    description = "Writeto data table"
events:
  $e.principal.user.employee_id = $principal_user_employee_id
  $e.target.domain.name = $target_domain
  $e.target.domain.prevalence.day_count < 5

outcome:
  $hostname = $target_domain
  $principal_emp_id = $principal_user_employee_id
 
condition:
  $e

export:
  %ips_with_hostnames.write_row(
      employeeid:$principal_emp_id,
      hostname:$hostname
  )
}

搜索示例:

events:
  $e.principal.user.employee_id = $principal_user_employee_id
  $e.target.domain.name = $target_domain
  $e.target.domain.prevalence.day_count < 5

outcome:
  $hostname = $target_domain
  $principal_emp_id = $principal_user_employee_id

export:
  %ips_with_hostnames.write_row(
      employeeid:$principal_emp_id,
      hostname:$hostname
  )

示例:了解 write_row

在以下示例中,userip 用作主键。检测表中持续存在的每次检测都会导致查询的导出部分对函数调用进行一次评估。

规则示例:

rule udm_write_data_table {
meta:
    description = "Write data table"
events:
    $e.metadata.event_type = "USER_LOGIN"
    all $e.security_result.action != "BLOCK"
    all $e.security_result.action != "UNKNOWN_ACTION"

    $user = $e.principal.user.userid
    $ip = $e.target.ip
    $ts = $e.metadata.event_timestamp.seconds

match:
    $user, $ip over 1h

outcome:
    $first_seen = min($ts)

condition:
    $e

export:
    %successful_logins.write_row(user:$user, ip:$ip)
}

搜索示例:

events:
    $e.metadata.event_type = "USER_LOGIN"
    all $e.security_result.action != "BLOCK"
    all $e.security_result.action != "UNKNOWN_ACTION"

    $ts = $e.metadata.event_timestamp.seconds

outcome:
    $user = $e.principal.user.userid
    $ip = $e.target.ip[0]

export:
    %successful_logins.write_row(user:$user, ip:$ip)

以下是活动数据:

metadata: {
  event_type: USER_LOGIN
  event_timestamp: { seconds: 1283299200 }
}
principal: {
  user: {
    userid: "charlie"
  }
}
target: {
  ip: ["192.0.2.135", "192.0.2.136"]
}
security_result: {
  action: ALLOW
}

当此查询作为规则执行时,系统会返回以下检测结果:

检测 ID 匹配 $user 匹配 $ip
0 charlie 192.0.2.135
1 charlie 192.0.2.136

数据表包含以下内容:

用户 ip
charlie 192.0.2.135
charlie 192.0.2.136

以下搜索查询展示了在搜索中支持将标量值写入数据表。

events:
    $e.metadata.event_type = "NETWORK_CONNECTION"

export:
  %summary_table.write_row(col_name: $e.metadata.product_name, Vendor_name: $e.metadata.vendor_name)

使用数据表丰富实体图

您可以使用数据表来添加、移除或替换规则中实体图内呈现的实体。使用规则 setup 部分中的函数来指明应如何将数据表与 events 部分中引用的实体事件合并、附加或用于从中移除实体。

您可以使用以下规则模板修改实体图:

rule entity_graph_template {

  meta:
    ...

  setup:
    // import the data table into entity graph
    <enrichment_keyword> <join_condition>

  events:
    ...

  match:
    ...

  condition:
    ...
}

您可以使用以下 YARA-L 2.0 函数通过数据表增强实体图:

  • graph_override:使用数据表中的数据覆盖实体图中符合联接条件的行。

    例如:

    [graph_override](?tab=t.0#heading=h.v0fps7eke1if)

  • graph_append:将数据表中的行附加到实体图中的行。graph_append 操作需要一个数组,该数组包含数据表变量和实体事件变量,而不是联接条件。

    在下例中,$g1 是实体图变量,example_table 是数据表:

    graph_append [$g1, %example_table]

    对于 append 函数,数据表应包含以下列以验证实体:

    • start_time(映射到 metadata.interval.start_time.seconds

    • end_time(映射到 metadata.interval.end_time.seconds

    无法使用网页界面将数据表列映射到元数据字段。对于 append 用例,需要使用 Chronicle API (https://cloud.google.com/chronicle/docs/reference/rest/v1alpha/projects.locations.instances.dataTables/create) 创建数据表

  • graph_exclude:移除实体图表中与 join 条件匹配的行。

    例如:

    [graph_exclude](?tab=t.0#heading=h.o0qbb5paki6g)

联接条件必须是数据表列与实体图字段之间的等式表达式。对于 graph_overridegraph_exclude 函数,访问数据表的语法如下所示:

<data_table_name>.<column_name>

为事件部分中的 <entity_variable> 指定的任何过滤条件都会在通过数据表进行增强后应用。

在实体图中的实体通过数据表中的实体进行丰富后,实体图中的实体变量必须与 UDM 实体联接。

使用数据表中的数据替换实体图

使用 graph_override 函数时,实体图和数据表中同时存在的字段会被数据表中的字段替换。实体图中存在但数据表中不存在的字段保持不变。包含实体图中不存在但数据表中存在的字段。

只有映射的数据表列会替换实体图的列。未映射的列会添加到数据表联接到的实体图的 additional 字段中。

示例:基于单个联接进行匹配

在以下示例中,实体图中的行(与数据表列和实体图字段 ($g1.graph.entity.ip = %example_table.my_ip) 之间的联接条件相匹配)会被数据表覆盖。

rule rule_override {
  meta:
    description = "Override entity context with data table before joining with UDM event"

  setup:
    //Rows in the entity graph that match the join condition are overridden by the data table
    graph_override ($g1.graph.entity.ip = %example_table.my_ip)

  events:
    $e.metadata.event_type = "NETWORK_CONNECTION"
    $e.security_result.action = "ALLOW"

    // Filter will be applied after graph is overridden by data table
    $g1.graph.entity.hostname = "ftp01"

    // Accessing unmapped columns
    $g1.graph.additional.fields["Owner"] = "alice"

    // Joining the UDM event with the enriched entity graph
    $e.target.ip = $iocip
    $g1.graph.entity.ip = $iocip

  match:
    $iocip over 1h

  condition:
    $e and $g1
}

若要使用数据表的未映射列(例如“所有者”),请使用 $g1.graph.entity.owner = "alice" is $g1.graph.additional.fields["Owner"] = "alice" 的等效语句。这是因为数据表的所有未映射列都会进入实体图 ($g1)additional 字段。

下表展示了一个替换操作,其中当数据表中的 IP 字段与实体图中的 IP 字段匹配时,实体图中的行会得到丰富。

现有实体图
主机名 IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
数据表格
主机名 IP MAC 所有者
ftp01 10.1.1.4 …:bb alice
h1 10.1.1.6 …:cc bob
h2 10.1.1.7 …:dd chris
h3 10.1.1.4 …:ee doug

丰富实体图
主机名 IP MAC 所有者
ftp01 10.1.1.4 …:bb alice
www01 10.1.1.5 …:02
h3 10.1.1.4 …:ee doug

示例:匹配多个联接

在以下示例中,实体图中的行(与多个联接条件 [$g1.graph.entity.ip = %example_table.my_ip$g1.graph.entity.hostname = %example_table.my_hostname] 相匹配)会被数据表覆盖。

rule rule_override {
meta:
    description = "Override Entity context with Data Table before joining with UDM event"
setup:
  // example with more than one condition
  graph_override ($g1.graph.entity.ip = %example_table.my_ip and
  $g1.graph.entity.hostname = %example_table.my_hostname) 
events:
  $e.metadata.event_type = "NETWORK_CONNECTION"
  $e.security_result.action = "ALLOW"

  // Filter will be applied after graph is overridden by data table
  $g1.graph.entity.hostname = "ftp01"

  // joining the UDM event with the enriched entity graph
  $e.target.ip = $iocip
  $g1.graph.entity.ip = $iocip

match:
  $iocip over 1h

condition:
  $e and $g1
}

下表展示了一项替换操作,其中当数据表中的 IP 字段和主机名字段与实体图中的 IP 字段和主机名字段都匹配时,实体图的行会得到丰富。

现有实体图
主机名 IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
数据表格
主机名 IP MAC 所有者
ftp01 10.1.1.4 …:bb alice
h1 10.1.1.5 …:cc bob
h2 10.1.1.6 …:dd chris
h3 10.1.1.4 …:ee doug
丰富实体图
主机名 IP MAC 所有者
ftp01 10.1.1.4 …:bb alice
www01 10.1.1.5 …:02

将数据表中的数据附加到实体图

使用 graph_append 函数时,无需指定联接条件。

在以下示例中,数据表中的所有行都会附加到实体图中的行。

rule rule_append {
meta:
  description = "Data table append entity"
   
setup:
  graph_append [$g1, %example_table]

events:
    // filter UDM events
  $e.metadata.event_type = "NETWORK_CONNECTION"
  $e.security_result.action = "ALLOW"

  // Join the filtered UDM events with the enriched graph
  $e.target.ip = $iocip
  $g1.graph.entity.ip = $iocip

match:
  $iocip over 1h

condition:
  $e and $g1
}

下表示例展示了附加操作,其中数据表的行附加到实体图中的行:

现有实体图
主机名 IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
数据表格
IP MAC 所有者
10.1.1.4 …:01 alice
10.1.1.6 …:cc bob
10.1.1.7 …:dd chris
10.1.1.4 …:ee doug
丰富实体图
主机名 IP MAC 所有者
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
10.1.1.4 …:bb alice
10.1.1.6 …:cc bob
10.1.1.7 …:dd chris
10.1.1.4 …:ee doug

使用 graph_exclude 从实体图中移除行

使用 graph_exclude 函数时,实体图中与联接条件匹配的行会从实体图中移除。

在以下示例中,实体图中与指定联接条件(数据表列与实体图字段之间)匹配的所有行都会被移除。数据表中的任何行都不会添加到实体图中。

rule rule_exclude {

    meta:
    setup:
      graph_exclude ($g1.graph.entity.ip = %example_table.ip)

    events:
        $e.metadata.event_type = "NETWORK_CONNECTION"
        $e.security_result.action = "ALLOW"
        $e.target.ip = $iocip
        $g1.graph.entity.ip = $iocip

    match:
        $iocip over 1h

    condition:
        $e and $g1
}

下表展示了一个排除操作,其中移除了实体图与数据表的 IP 字段匹配的行:

现有实体图
主机名 IP MAC
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
数据表格
IP MAC 所有者
10.1.1.4 …:bb alice
10.1.1.6 …:cc bob
10.1.1.7 …:dd chris
丰富实体图
主机名 IP MAC
www01 10.1.1.5 …:02

限制

  • Google SecOps 账号的数据表数量上限:1,000。

  • 仅支持上传 CSV 文件类型。

  • 在查询中引用参考列表时,in 语句数量的限制也适用于数据表中的 in 语句。

  • 一个查询中的 in 语句数上限:10

  • 查询中 StringNumber 数据类型列的 in 语句数量上限:7

  • 包含正则表达式运算符的 in 语句数量上限:4

  • 含 CIDR 运算符的 in 语句数上限:2

  • 每个数据表的列数上限:1,000。

  • 每个数据表的行数上限:1,000 万。

  • 一个账号中所有数据表的总数据量上限:1 TB。

  • 文本和表格编辑器视图中数据表格行的网页显示上限:10,000 行

  • 将文件上传到网页中的新数据表格时,行数上限为:10,000 行

  • 通过 API 创建数据表的文件上传大小上限:1 GB

  • 设置部分不允许使用占位符。

  • 如果数据表的未映射列的数据类型设置为 string,则只能与 UDM 事件或 UDM 实体的字符串字段联接。

  • 仅在数据类型设置为 cidrregex(CIDR 或正则表达式)的数据表中使用未映射的列。

  • 数据表查找:不支持正则表达式通配符,搜索字词不得超过 100 个字符。

联接

  • 将数据表与事件联接时,不支持提取检测的所有事件样本。

  • 与实体和 UDM 不同,数据表不支持占位符。这意味着您无法:

    • 将一组过滤条件应用于数据表,并将其与 UDM 实体联接。

    • 在将同一数据表与另一个 UDM 占位符联接时,对该数据表应用一组不同的过滤条件。

    例如,一个名为 dt 的数据表,包含 3 列:my_hostnameorgmy_email,并具有以下规则:

    events:
    $e1.principal.hostname =  %dt.my_hostname
    %dt.org ="hr"
    
    $e2.principal.email =  %dt.my_email
    %dt.org !="hr"
    

系统会先应用数据表中的所有过滤条件,然后将数据表中经过过滤的行与 UDM 联接。在这种情况下,空数据表与 e1e2 联接,因为数据表 dt 上的两个过滤条件相互矛盾 (%dt.org ="hr" and %dt.org !="hr")。

将数据表格与规则搭配使用

将数据表与规则搭配使用时,存在以下限制。

运行频率

对于包含数据表的规则,不支持实时运行频率。

输出到数据表

  • 数据表中的重复字段列不支持 anyall 修饰符。

  • 数据表中重复字段列不支持数组索引。

  • 您只能将结果变量导出到数据表格。您无法直接导出事件路径或数据表列。

  • 列列表必须包含数据表的主键列。

  • 您最多只能设置 20 个结果。

  • 如果数据表不存在,则会创建一个新表,其中所有列都具有默认的字符串数据类型,并遵循指定的顺序。

  • 一次只能有一条规则写入数据表。如果某条规则尝试写入另一条规则已在写入的数据表,则该规则的编译会失败。

  • 无法保证生产方规则可以在数据表的使用方规则启动之前向该数据表添加行。

  • 规则对结果行的数量有限制。结果和持久性数据不得超过 10,000 行。数据表也存在同样的限制;单次规则执行最多可以向数据表输出 10,000 行。

  • 如果数据表中已存在具有相同主键的行,则非主键列将被替换为新值。

通过数据表丰富实体

  • 您只能对单个实体图变量应用一种丰富操作(overrideappendexclude)。

  • 每次丰富化操作只能使用一个数据表。

  • 您可以在 YARA-L 规则的 setup 部分中定义最多两个任意类型的富集操作。

在以下示例中,替换操作应用于实体图变量 $g1,而 append 操作应用于实体图变量 $g2

    setup:
    graph_override($g1.graph.entity.user.userid = %table1.myids)
    graph_append [$g2, %table1]

在上述示例中,同一数据表 (table1) 用于增强不同的实体图。您还可以使用不同的数据表来增强不同的实体图,如下所示:

    setup:
    graph_override($g1.graph.entity.user.userid = %table1.myids)
    graph_append [$g2, %table2]

将数据表与 Google 搜索搭配使用时,存在以下限制。

  • 您无法使用 Chronicle API 对数据表运行搜索查询。您只能通过网页界面运行搜索查询。

  • 单次查询执行最多可向数据表输出 100 万行或 1 GB 的数据,以先达到的限额为准。

  • 如果搜索输出到数据表的事件行超过 5 MB,系统会跳过这些事件行。

  • 搜索不支持实体丰富功能。

  • 数据表不支持客户管理的加密密钥 (CMEK) 客户。

  • 每位客户每分钟的写入次数上限为 6 次。

  • 不支持 API。

  • 统计信息查询不支持使用数据表联接。

  • 数据表和数据表联接仅支持 UDM 事件,不支持实体。

    支持:%datatable1.column1 = %datatable2.column1 不支持:graph.entity.hostname = %sample.test

  • 您无法在 export 部分的统计信息查询中添加 match 变量。

    例如,以下内容不受支持:

  match:
      principal.hostname
  export:
      %sample.write_row(
      row: principal.hostname
    )

需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。