搜索数据表格

支持:

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

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

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

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

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

访问数据表

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

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

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

添加新数据表

添加新数据表时,您可以手动输入 CSV 数据、粘贴 CSV 数据,或将 CSV 或 TSV 文件导入数据表。

保存新数据表格后,以下配置就是永久性的了,无法更改:

如需向 Google SecOps 添加新的数据表,请执行以下操作:

  1. 在边栏中,依次选择调查 > 数据表。

  2. 在数据表边栏顶部,点击 创建。

  3. 在创建新数据表对话框中,为表格命名,并根据需要添加说明。

  4. 执行下列其中一项操作:

    • 手动输入 CSV 数据,或将 CSV 数据粘贴到文本(编辑模式)区域。
    • 如需将数据从 CSV 或 TSV 文件导入到数据表格中,请执行以下操作:
    1. 点击导入文件。
    2. 找到相应文件,然后点击打开。系统将打开导入文件对话框。
    3. 如果您在上一步中选择了 TSV 文件,请执行以下操作:
      1. 从分隔符类型列表中,选择自动检测或制表符。
      2. 在开始在以下行中导入列表中,指定要从文件中的哪一行开始导入数据。
    4. 点击导入数据。
  5. 选择表格修改模式,然后根据需要配置以下内容:

  6. 点击保存。新数据表会显示在数据表边栏中,并可随时接受更多数据。

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

添加新的数据表时,您可以将数据类型(字符串、正则表达式、CIDR 或数字)映射到数据表列。

您可以使用网页界面或 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 示例
… … … …

指定键列

添加新数据表时,您可以将特定列指定为键列。

将某个列标记为键列,可唯一标识该列中的值,防止数据重复,并提高规则和搜索的数据发现效率。

指定支持重复字段的列

添加新数据表时,您可以指定特定列来支持重复字段。

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

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

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

在以下示例数据表中,Userid 和 Role 列分别映射到 entity.user.userid 和 entity.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),您必须手动指定数据类型。与参考列表一样,数据表支持的数据类型为 number、string、regex 和 cidr。

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

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

向数据表添加新行

如需添加新行,请执行以下操作:

  1. 在详细信息标签页中,选择表格修改模式。
  2. 右键点击现有行,然后选择在上方添加行。
  3. 输入新行的数据。第一行会被视为表头。请务必将每个数据项与相应的数据列和数据类型相匹配。
  4. 点击保存。

修改数据表中的行

如需修改行,请执行以下操作:

  1. 点击要更改的字段。该字段变为可修改状态。
  2. 进行更改。
  3. 点击保存。

搜索数据表行

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

管理表行 TTL

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

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

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

  3. 以小时或天为单位输入新的 TTL 值。最小值为 1 小时。最大值为 365 天。

  4. 点击保存。

行级 TTL 替换行为

行会继承在表级层应用的 TTL。您还可以为各个行设置特定的 TTL,并且此行级 TTL 的优先级高于表级默认 TTL。添加新行时,其 TTL 会从创建时间开始计算。

删除表格行

如需删除行,请右键点击相应行,然后选择删除行。

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

移除数据表

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

  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 事件或实体联接起来。

数据表中的基于行的比较和基于列的比较

比较类型 关键逻辑 常用运算符 示例语法 何时使用
基于行的 所有条件必须在同一行中匹配 =、!=、>、>=、<、<= $e.field = %table.col_a 当同一行中多个列值之间的关系很重要时。
基于列 值必须存在于列中的任意位置 IN、IN regex、IN cidr $e.field IN %table.col_b 检查单列中的一组值中是否存在某个值。

使用基于行的或基于列的比较方法将 UDM 事件关联到数据表:

  • 如需使用基于行的比较将 UDM 事件与数据表相关联,请使用等值运算符(=、!=、>、>=、<、<=)。

    例如:$<udm_variable>.<field_path> = %<data_table_name>.<column_name>

    • 如果您使用多个比较语句,则所有字段或条件都必须在同一数据表行中匹配。
    • 如需在查询中使用运算符(例如 not、!=、>、>=、<、<=),您必须在 UDM 字段和数据表行之间添加至少一个 join 条件。

    • Google SecOps 会将任何包含数据表 join 的规则视为多事件规则,这需要在规则定义中包含 match 部分。

  • 如需通过将 UDM 事件中的值与数据表中的行进行匹配来过滤数据,请考虑使用以下联接语法:

    • 正确的联接语法:

      例如,基于行的“组合排除”需要 left outer 联接和检查 nulls 的 where 子句。

    • 错误的联接语法:

      请勿将 NOT 封装在多个基于行的等值条件周围。此语法无法实现“如果找到此组合,则排除”的效果。

      例如,请勿使用以下语法:NOT (field1 = %table.col1 AND field2 = %table.col2)

      这是因为匹配仍按行应用。如果任何行未能满足内部组合条件,NOT 会导致该行的评估结果为 true,可能会包含相应事件,而不是排除相应事件。

  • 如需将 CIDR 或 regex 类型的数据表列用于基于行的比较,请使用以下语法:

    net.ip_in_range_cidr($e.principal.ip, %<data_table_name>.<column_name>)
    
    re.regex($e.principal.hostname, %<data_table_name>.<column_name>)
    
  • 如需使用基于列的比较将 UDM 事件与数据表相关联,请使用 in 关键字。

    例如:$<udm_variable>.<field_path> in %<data_table_name>.<column_name>

  • 如需滤除字段值存在于指定列(例如屏蔽清单或许可清单)中的事件,请使用以下语法:NOT (... IN %table.column)

    例如:not ($evt_username in %my_data_table.username)

  • 如需使用 CIDR 或 regex 类型的数据表列进行基于列的比较,请使用以下语法:

    $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 %data_table.benign_ip
    

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

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

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

在以下示例中,badApps 数据表包含两列:hostname 和 ip。查询会分别匹配这两个值(基于 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 搜索中查看数据表行。

  • 查询的 event 部分中的数据表支持占位符,但这些占位符必须与 UDM 事件或 UDM 实体相关联。

  • 以下示例使用 string 类型的数据表列。

    • 此 YARA-L 查询示例用于检查用户登录事件是否与 example_table 中的某一行匹配。

      • 一个条件是 user ID 存在于 example_table 中。
      • 这两个条件必须在 example_table 的同一行中匹配,规则才能触发。
    • 规则示例:

      // Check if user exists in a data table and is active in 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 data table 
      // where the uid in the data table row is the userid on the event 
      // and the active date in the same data 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 data table 
      // where the uid in the data table row is the userid on the event 
      // and the active date in the same data 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 事件表
    principal 元数据 security_result principal
    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
    
  • 示例:将搜索结果导出到数据表

    events:
      $e.metadata.event_type = "USER_LOGIN"
      $e.security_result.action = "ALLOW"
    
    outcome:
      $user = $e.principal.user.userid
      $ip = $e.target.ip[0] // Assuming target.ip is an array
      $timestamp = $e.metadata.event_timestamp.seconds
    
    export:
      // Write to the data table named 'successful_logins'
      %successful_logins.write_row(
        user: $user,          // Maps $user variable to 'user' column
        ip: $ip,              // Maps $ip variable to 'ip' column
        first_seen: $timestamp // Maps $timestamp variable to 'first_seen' column
      )
    

使用 YARA-L 修改数据表

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

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

IP 地址 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 的普及率过滤结果:

  • 示例

    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

在以下示例中,user 和 ip 用作主键。检测表中保留的每次检测都会导致查询的导出部分中的函数调用进行一次评估。

  • 规则示例:

    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

    数据表包含以下内容:

    user 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://docs.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_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" 的等效语句如下。 这是因为数据表的所有未映射列都会进入实体图的 additional 字段 ($g1)。

下表说明了覆盖操作,其中当数据表中的 IP 字段与实体图中的 IP 字段匹配时,实体图中的行会得到丰富。

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

丰富的实体图
主机名 IP MAC Owner
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 Owner
ftp01 10.1.1.4 …:bb alice
h1 10.1.1.5 …:cc 波波头
h2 10.1.1.6 …:dd chris
h3 10.1.1.4 …:ee doug
丰富的实体图
主机名 IP MAC Owner
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 波波头
10.1.1.7 …:dd chris
10.1.1.4 …:ee doug
丰富的实体图
主机名 IP MAC Owner
ftp01 10.1.1.4 …:01
www01 10.1.1.5 …:02
10.1.1.4 …:bb alice
10.1.1.6 …:cc 波波头
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 Owner
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

API 速率限制

在调用 Google SecOps Data Table 和 Data Table Row REST API 端点时,系统会针对每个项目和用户强制执行以下每分钟查询次数 (QPM) 配额:

资源 API 操作 速率限制(标准)
DataTables CreateDataTable (data_table/create_requests) 60 QPM
DataTables GetDataTable (data_table/get_requests) 120 QPM
DataTables ListDataTables (data_table/list_requests) 120 QPM
DataTables UpdateDataTable (data_table/update_requests) 60 QPM
DataTables DeleteDataTable (data_table/delete_requests) 60 QPM
DataTableRows CreateDataTableRow (data_table_row/create_requests) 60 QPM
DataTableRows GetDataTableRow (data_table_row/get_requests) 120 QPM
DataTableRows ListDataTableRows (data_table_row/list_requests) 120 QPM
DataTableRows UpdateDataTableRow (data_table_row/update_requests) 60 QPM
DataTableRows DeleteDataTableRow (data_table_row/delete_requests) 60 QPM
DataTableRows BulkCreateDataTableRows(同步 / 异步) 30 QPM
DataTableRows BulkReplaceDataTableRows(同步 / 异步) 30 QPM
DataTableRows BulkUpdateDataTableRows(同步 / 异步) 10 QPM
DataTableRows BulkDeleteDataTableRows(同步 / 异步) 30 QPM
DataTableRows BulkGetDataTableRows (data_table_row/bulk_get_requests) 120 QPM

限制

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

  • 数据表仅支持 CSV 数据。仅当添加新数据表并导入制表符分隔值 (TSV) 文件时,数据表才支持制表符分隔值。

  • 数据表字段不支持逗号 (,) 字符。

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

  • String 和 Number 已指定数据类型和格式的列的查询中 in 语句的数量上限:10。

  • 使用正则表达式运算符的 in 语句数上限:5。

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

  • = (JOIN) 语句数上限:10。

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

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

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

  • 数据表中的最大数据量:10 GB。

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

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

  • 仅使用数据表中数据类型设置为 cidr 或 regex 的未映射列,分别用于 CIDR 或正则表达式。

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

规则中数据表联接的限制

以下限制适用于规则中的数据表联接。

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

  • 与实体和 UDM 不同,数据表不支持占位符。这会导致以下限制:

    • 您无法对数据表应用一组过滤条件,然后将其与 UDM 实体联接。

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

    例如,一个名为 dt 的数据表,其中包含三列: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 联接。在这种情况下,dt 表上的矛盾过滤条件 (%dt.org ="hr" and %dt.org !="hr") 会导致数据表为空,然后该表会与 e1 和 e2 联接。

使用包含规则的数据表的限制

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

运行频率限制

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

输出到数据表的限制

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

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

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

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

  • 您最多可以设置 20 个结果。

  • 如果数据表不存在,系统会按照指定的顺序,为所有列创建具有默认 string 数据类型的新表。

  • 最多可以有 5 条规则同时向一个数据表写入数据。

  • 无法保证提供方规则能在该数据表的消费方规则启动之前向数据表添加行。

  • 单个规则的结果行数有限制。结果和持久性数据以及数据表的行数上限为 10,000 行。

  • 更新行时,所有非键列的新值都会替换旧值。任何更新(包括添加新行)大约需要五分钟才能可供查询。

通过数据表进行实体丰富处理的限制

  • 您只能对单个实体图变量应用一种丰富操作(override、append 或 exclude)。

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

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

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

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

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

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

将数据表与 Google 搜索搭配使用时的限制

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

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

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

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

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

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

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

    支持:%datatable1.column1 = %datatable2.column1

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

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

    例如,不支持以下操作:

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

使用 Chronicle API 或 Terraform 重命名或删除数据表时的限制

  • 不支持通过平台或 API 重命名。
  • 如果数据表被规则引用,则无法删除该数据表(通过平台或 API)。
  • 在 Terraform 中,重命名数据表会触发销毁和重新创建操作。如果数据表被规则引用,此操作将失败,因为 API 会阻止删除旧表。
  • Terraform 中的数据丢失风险:即使规则未引用某个数据表,使用 Terraform 重命名该数据表也会导致数据永久丢失。Terraform 会销毁现有表,并将其替换为新的空表,该表不会保留原始表中的任何数据。
  • 建议的解决方法:
    • 使用新名称创建新数据表。
    • 更新规则,开始使用新的数据表。
    • 删除旧数据表。

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