使用数据表格
数据表是多列数据结构,可让您将自己的数据输入 Google Security Operations。 它们可以充当包含已定义列且数据存储在行中的查询表。您可以使用 Google SecOps 界面、数据表 API 或在规则中使用 YARA-L 查询,在 Google SecOps 账号中创建或导入数据表。
使用 Google SecOps 界面管理数据表
以下部分介绍了如何使用界面管理数据表,包括如何访问数据表、添加新的数据表并修改其内容、将数据导入表中、添加行、使用英文逗号或制表符分隔数据,以及如何从您的账号中移除数据表。
访问您的数据表格
如需前往“数据表格”页面,请前往左侧导航边栏,然后依次点击检测 > 数据表格。您可以在侧边栏顶部的搜索字段中输入名称,以搜索现有的数据表。
添加新的数据表
如需向 Google SecOps 添加新的数据表,请完成以下步骤:
点击边栏右上角的添加 添加。
在创建新的数据表格对话框中,为新表格指定名称,并(可选)添加说明。
点击创建。新的数据表会显示在主窗口中,并准备接受数据。
将数据导入数据表
如需向数据表中添加数据,您可以按以下步骤将数据直接导入 Google SecOps:
点击导入数据。
选择一个标准 CSV 文件(只有 CSV 文件可以导入 Google SecOps)。
准备好将数据导入数据表后,点击打开。
向数据表中添加新的数据行
如需手动向数据表格添加新的数据行,您可以直接输入,并将第一行用作表格标题。为此,请执行以下操作:
在详细信息标签页中,将光标放在现有行的末尾,然后按 Enter 键。
输入新的数据行:
- 使用英文逗号或制表符分隔数据字段。
- 请务必将每个数据项与相应的数据列进行匹配。
- 当您在详细信息标签页中输入行数据时,系统会在表格编辑器中填充相应数据。
指定是使用英文逗号还是制表符分隔数据
如需使用逗号或制表符分隔数据,请执行以下操作:
点击导入数据旁边的
修改分隔符类型。在修改分隔符类型对话框中,从分隔符菜单中选择英文逗号或制表符。
移除数据表
如需移除数据表格,请执行以下操作:
从左侧的数据表列表中选择一个数据表。
点击删除。
使用 Chronicle API 管理数据表
您还可以使用 Chronicle API 中提供的 REST 资源在 Google SecOps 中管理数据表。该 API 的功能与界面相当,还包含一些其他功能,可让您以更高的性能和更大的规模管理数据表。
以下是数据表 REST 资源:
在 Google SecOps 中使用数据表
将数据表导入 Google SecOps 实例后,您可以使用规则对数据进行过滤、增强和丰富。本文档包含许多使用 YARA-L 语法的示例,您可以将这些示例纳入实例中的 Google SecOps 规则中。如需详细了解如何在 Google SecOps 中修改规则,请参阅使用规则编辑器管理规则。
您可以通过以下方式将数据表与规则搭配使用:
使用数据表过滤 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>
。`
与引用列表一样,每个数据表格列支持的数据类型可以是 string
、regex
或 CIDR
。
如需使用类型为 CIDR 或正则表达式的数据表格列进行基于行的比较,请使用以下语法:
net.ip_in_range_cidr($e.principal.ip, %<data_table_name>.<column_name>)
re.regex($e.principal.hostname, %<data_table_name>.<column_name>)
如需使用类型为 CIDR 或正则表达式的数据表格列进行基于列的比较,请使用以下语法:
$e.principal.ip in cidr %cidr_data_table.column_name
$e.principal.hostname in regex %regex_data_table.column_name
如果您将列的数据类型指定为 CIDR 或正则表达式,请排除关键字 cidr
或 regex
。
您还可以将 not
运算符与数据表搭配使用。以下示例规则会滤除 IP 地址 ($e.principal.ip
) 与 cidr_data_table
中 benign_ip
列中列出的任何 CIDR 范围不匹配的条目:
not $e.principal.ip in cidr %cidr_data_table.benign_ip
将数据表与 UDM 事件或实体联接
您可以使用数据表格,通过等式运算符 (=, !=, >, >=, <, <=
) 进行基于行的比较来过滤 UDM 事件。
在以下示例中,YARA-L 规则会检查用户登录时,其用户 ID 是否存在于数据表 (example_table
) 中。此外,它还会检查在匹配发生的数据表同一行中,用户账号在登录事件注册之前是否处于活跃状态。
// Check if a user exists in a data table and the user is active for all user login events.
rule udm_join_data_table {
meta:
description = "Join data table with UDM event"
event:
$e.metadata.event_type = USER_LOGIN
$e.security_result.action = ALLOW
$e.principal.user.userid = $userid
// Event must match at least one row in the table where the uid in the table
// row is the userid for 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
}
以下示例展示了数据表格和 UDM 事件数据。根据上文中的 YARA-L 规则中的逻辑,由于系统中用户的主机名与数据表中的主机名相匹配,因此用户 ID 为 32452 的用户会显示在检测结果中。
数据表格 | ||
uid | title | 主机名 |
32452 | HR | host1 |
64452 | 财经 | host2 |
46364 | IT | host3 |
UDM 事件表 | |||
principal | 元数据 | security_result | principal |
32452 | USER_LOGIN | 允许 | host1 |
64589 | USER_LOGIN | 允许 | host9 |
87352 | USER_LOGIN | 允许 | host4 |
将数据表格用作多列参考列表
您可以将数据表格用作多列引用列表。参考列表只能访问单个维度中的数据,而数据表可让您访问多个维度中的数据,从而实现数据过滤。
您可以使用 in
关键字将 UDM 事件关联到数据表,以便进行基于列的比较。
您可以使用引用列表所用的相同语法,将数据表引用为多列引用列表:
%<data_table_name>.<column_name>.
在以下示例中,系统会针对具有可疑端口和协议组合的网络连接触发提醒。Port
和 protocol
是 badApps
数据表中的列。
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 port matches at least one value in table column port
$e.target.port in %badApps.port
// event IP matches at least 1 value in table column protocol
$e.target.network.ip in %badApps.ip
match:
$assetid over 1h
condition:
$e
}
将数据类型映射到单个数据表列
将每种数据类型映射到单个数据表列。包含多个字段值的任何列都必须先拆分,然后才能用作数据表格。
在以下示例中,数据表格列 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 | 示例 |
… | … | … | … |
将列名称映射到实体字段
创建数据表时,您可以将数据表的列名称映射到实体字段。
在以下示例数据表中,Userid
和 Role
列会映射到 entity.user.userid
和 entity.user.attribute.role.name
:
用户 ID
(映射到 entity.user.userid) |
电子邮件 | 角色
(映射到 entity.user.attribute.role.name) |
插头 | jack123@gmail.com | 管理员 |
tony | tony123@gmail.com | 工程师 |
Email
列是重复字段,因此无法映射到实体路径 entity.user.email_address
。您无法将数据表格的列映射到重复字段。
您可以使用 DataTable 资源的 mapped_column_path
字段将数据表的列映射到实体 proto 字段。
对于未定义实体路径的列(例如本示例表中的 Email
),您必须定义数据类型。与参考列表一样,数据表支持的数据类型为 string
、regex
和 cidr
。
您可以使用联接条件在数据表中指定已映射和未映射的列。未映射的列会作为键值对(其中键为列名称,值为该列的行值)添加到实体(数据表联接到的)的 additional
字段。
将 YARA-L 查询的结果写入数据表
您可以将 YARA-L 查询的结果写入数据表。借助此功能,您可以根据 Google SecOps 数据创建数据表,并使用这些表来过滤和增强其他数据。
您可以针对以下用途对数据表使用 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.ip
、principal.user.employee_id
和 target.domain
的唯一组合。它会根据 target.domain
的流行程度过滤结果:
rule unique_principal_userid_and_ip_and_target_domain_with_low_prevalence {
meta:
author = "GP"
description = "Captures unique combinations of principal.ip,
principal.user.employee_id, and target.domain where
target.domain.prevalence is less than 5"
rule_version = "1.0"
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
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 write_to_data_table {
meta:
author = "GP"
description = "Captures uniqueprincipal.user.employee_id, and target.domain where target.domain.prevalence is less than 5"
rule_version = "1.0"
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,
)
}
示例:了解 write_row
在以下示例中,user
和 ip
是主键。在检测表中保留的每项检测都会导致对规则的导出部分中的函数调用进行一次评估。
规则如下:
rule successful_logins_by_user_to_ip {
meta:
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(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 |
数据表格包含以下内容:
user | ip |
charlie | 192.0.2.135 |
charlie | 192.0.2.136 |
使用数据表丰富实体图
您可以使用数据表添加、移除或替换实体图中显示的实体。使用规则 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]
graph_exclude
:移除实体图中与联接条件匹配的行。例如:
[graph_exclude](?tab=t.0#heading=h.o0qbb5paki6g)
联接条件必须是数据表列与实体图字段之间的等式表达式。对于 graph_override
和 graph_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
}
如需使用数据表中未映射的列(例如“Owner”),请使用 $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 | Owner |
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 |
限制
在规则中引用引用列表时对
in
语句数量的限制也适用于数据表中的in
语句。仅支持上传 CSV 文件类型。
数据表的大小上限为 10 GB。
租户中所有数据表中数据量的总和上限为 1 TB。
规则中的
in
语句数量上限(无论是否包含特殊运算符):7包含
regex
运算符的in
语句数上限:4包含
cidr
运算符的in
语句数上限:2新版设置部分不允许使用占位符。
数据表中数据类型设为
string
且未映射的列只能与 UDM 事件或 UDM 实体的字符串字段联接。仅使用数据表中未映射的列,并将数据类型设为
cidr
或regex
,以便使用 CIDR 或正则表达式。您无法将数据表格的列映射到重复字段。
将数据表格与规则搭配使用
将数据表与规则搭配使用时,存在以下限制:
运行频率
包含数据表的规则不支持实时运行频率。
联接
与实体和 UDM 不同,数据表不支持占位符。这意味着,您无法对数据表应用一组过滤条件,将其与 UDM 实体联接,然后对同一数据表应用另一组过滤条件,同时将其与另一个 UDM 占位符变量联接。
例如,一个名为
dt
的数据表,其中包含 3 列:my_hostname
、org
和my_email
,并且具有以下规则:
events:
$e1.principal.hostname = %dt.my_hostname
%dt.org ="hr"
$e2.principal.email = %dt.my_email
%dt.org !="hr"
系统会先应用数据表上的所有过滤条件,然后将数据表中被滤除的行与 UDM 联接。在本例中,空数据表与 e1
和 e2
联接,因为数据表 dt
上的两个过滤条件相互矛盾 (%dt.org ="hr" and %dt.org !="hr"
)。
输出到数据表
您只能将结果变量导出到数据表中。您无法直接导出事件路径或数据表格列。
列列表必须包含数据表的主键列。
您最多只能设置 20 个结果。
数据表列不支持重复值,因此写入数据表的所有结果变量都必须是单个值。
如果数据表不存在,系统会按照指定的顺序创建一个新表,并为所有列设置默认的字符串数据类型。
一次只能有一个规则写入数据表。如果某个规则尝试写入另一个规则正在写入的数据表,则规则编译会失败。
我们无法保证生产方规则可以在数据表的使用方规则开始之前向数据表添加行。
规则对结果行数有限制。结果和持久化数据的上限为 10,000 行。同样的限制也适用于数据表格;单次规则执行最多只能向数据表格输出 10,000 行。
如果数据表中已存在具有相同主键的行,则非主键列将替换为新值。
您只能对单个实体图变量应用一个丰富操作(
override
、append
或exclude
)。每次丰富操作只能使用一个数据表。
您最多可以在 YARA-L 规则的
setup
部分定义两项任何类型的丰富操作。
在以下示例中,系统会对实体图变量 $g1
应用替换操作,并对实体图变量 $g2
应用 append
操作。
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]