使用資料表

支援的國家/地區:

資料表是多欄資料結構,可用於將自有資料輸入 Google Security Operations。資料表還能做為對照表使用,裡面的資料欄經過定義,資料則會儲存在資料列。您可以透過以下方式建立資料表或將資料表匯入 Google SecOps 帳戶:利用 Google SecOps 網頁介面、資料表 API,或使用 YARA-L 2.0 總覽查詢。

使用資料 RBAC 將範圍指派給資料表

如要使用資料表,您必須使用資料角色型存取權控管 (資料 RBAC),將範圍指派給資料表。為資料表指派範圍後,您就能控管哪些使用者和資源可以存取及使用資料表。詳情請參閱「設定資料表的資料 RBAC」。

使用 Google SecOps 網頁介面管理資料表

以下章節說明如何使用網頁介面管理資料表,包括如何存取資料表、新增資料表、編輯內容、新增資料列,以及如何從帳戶中移除資料表。

存取資料表

如要前往「資料表」頁面,請按照下列步驟操作:

  • 在側欄中,依序選取「調查」>「資料表」

如要尋找特定資料表,請在「資料表」側欄頂端的「搜尋」欄位中輸入資料表名稱。

新增資料表

新增資料表時,您可以手動輸入 CSV 資料、貼上 CSV 資料,或將 CSV 或 TSV 檔案匯入資料表。

儲存新的資料表後,就永久無法變更下列設定:

如要將新的資料表新增至 Google SecOps,請按照下列步驟操作:

  1. 在側欄中,依序選取「調查」>「資料表」

  2. 在「資料表」側欄頂端,按一下 「建立」

  3. 在「Create New Data Table」(建立新的資料表) 對話方塊中,為資料表命名,並視需要新增說明。

  4. 執行下列其中一個步驟:

    • 手動輸入 CSV 資料,或將 CSV 資料貼到「文字」(編輯模式) 區域。
    • 如要從 CSV 或 TSV 檔案將資料匯入資料表,請按照下列步驟操作:
    1. 按一下「匯入檔案」
    2. 前往檔案並按一下「開啟」。「匯入檔案」對話方塊會隨即開啟。
    3. 如果您在上一個步驟中選取了 TSV 檔案,請按照下列步驟操作:
      1. 在「分隔符類型」清單中,選取「自動偵測」或「Tab」
      2. 從「從這個資料列開始匯入」清單中,指定要從檔案的哪個資料列開始匯入資料。
    4. 按一下 [Import Data] (匯入資料)
  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 範例

指定索引鍵資料欄

新增資料表時,您可以將特定資料欄指定為索引鍵資料欄。

將資料欄標示為鍵資料欄,可確保該資料欄中的值具有唯一性,避免資料重複,並提升規則和搜尋的資料探索效率。

指定支援重複欄位的資料欄

新增資料表時,您可以指定特定資料欄支援重複欄位。

如要儲存多值欄位或重複欄位的資料欄,建立資料表時必須明確指定為「重複」

將資料欄名稱對應至實體欄位 (選填)

新增資料表時,您可以將資料表的資料欄名稱對應至實體欄位。

在下列範例資料表中,UseridRole 欄分別對應至 entity.user.useridentity.user.attribute.role.name

Userid
(對應至 entity.user.userid)
電子郵件 角色
(對應至 entity.user.attribute.role.name)
插孔 jack123@gmail.com 管理員
tony tony123@gmail.com 工程師

您可以使用 DataTable 資源的 mapped_column_path 欄位,將資料表欄位對應至實體 proto 欄位。

如果資料欄沒有定義實體路徑,例如這個範例表格中的 Email,您必須手動指定資料類型。與參照清單相同,資料表支援的資料類型為 numberstringregexcidr

您可以指定 join 條件,在資料表中同時納入已對應和未對應的資料欄。

未對應的資料欄會儲存在資料表所加入實體的 additional 欄位中。這些會以鍵/值組合的形式新增,其中 key 是資料欄名稱,value 則是對應的列值。

在資料表中新增資料列

如要新增資料列,請按照下列步驟操作:

  1. 在「詳細資料」分頁中,選取「表格」編輯模式。
  2. 在現有資料列上按一下滑鼠右鍵,然後選取「在上方新增資料列」
  3. 輸入新資料列的資料。第一列會視為表格標題。請務必將每個資料項目對應至適當的資料欄和資料類型。
  4. 按一下 [儲存]

編輯資料表中的資料列

如要編輯資料列,請按照下列步驟操作:

  1. 按一下要變更的欄位。欄位會變成可編輯狀態。
  2. 修改所需的設定。
  3. 按一下 [儲存]

搜尋資料表列

您可以使用網頁介面,在資料表中搜尋特定資訊。在「詳細資料」分頁中,於搜尋欄位輸入搜尋字串,然後按一下「搜尋」。系統會顯示包含搜尋字串的資料列。

管理資料表列的存留時間

如要管理資料表列的存留時間 (TTL) 值,請按照下列步驟操作:

  1. 按一下「顯示各列的存留時間」。系統會顯示存留時間資料欄,指出每列是否已過期。如果尚未過期,則會顯示到期前的剩餘時間。

  2. 按一下「預設資料列到期時間」,顯示「更新預設資料列到期時間」對話方塊,並調整資料表資料列的存留時間。

  3. 在「小時」或「天數」中輸入新的 TTL 值。最小值為 24 小時。最大值為 365 天。

  4. 按一下 [儲存]

刪除表格列

如要刪除資料列,請在該列上按一下滑鼠右鍵,然後選取「刪除資料列」

如要刪除多列,請選取要移除的每一列。然後在任何選取的列上按一下滑鼠右鍵,並選擇「刪除列」

移除資料表

如要移除資料表,請按照下列步驟操作:

  1. 從側欄的「資料表」清單中選取資料表。

  2. 按一下「Delete」(刪除)

使用 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 事件或實體合併。

資料表中的列和欄比較

比較類型 主要邏輯 常見運算子 語法範例 使用時機
以列為準 同一列中的所有條件都必須相符 =!=>>=<<= $e.field = %table.col_a 同一列中多個資料欄值之間的關係很重要時。
以資料欄為準 值必須存在於資料欄的「任何位置」 ININ regexIN 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 事件中與資料表資料列相符的值篩選資料,請考慮使用下列聯結語法:

    • 正確的 JOIN 語法:

      以資料列為準的「組合排除」需要 left outer 聯結和檢查 nullswhere 子句。

    • 錯誤的 JOIN 語法:

      請勿在多個以資料列為準的等號條件周圍加上 NOT。這種語法無法達到「如果找到這個組合就排除」的效果。

      舉例來說,請勿使用以下語法:NOT (field1 = %table.col1 AND field2 = %table.col2)

      這是因為系統仍會逐列套用比對。如果任何資料列未通過內部合併條件,NOT 會導致該資料列的評估結果為 true,可能包括事件而非排除事件。

  • 如要使用 以資料列為準的比較,請使用 CIDRregex 類型的資料表資料欄,並採用下列語法:

    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)

  • 如要使用 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 會將含有資料表的任何規則視為多事件規則,因此規則定義中必須有對應的 match 區段。join

彙整完成後,連結的資料表資料列就會顯示在 Google 搜尋中。詳情請參閱「在 Google 搜尋中查看資料表列」。

  • 查詢的 event 區段支援資料表預留位置,但必須連結至 UDM 事件或 UDM 實體。

    以下範例使用 string 類型的資料表欄。

    • 這個 YARA-L 查詢範例會檢查使用者登入事件是否與 example_table 中的資料列相符。

    • 其中一個條件是 user ID 存在於 example_table 中。

    • 規則觸發時,example_table 的同一列必須符合這兩項條件。

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

規則範例:

  ```none
  // 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
  }
  ```

搜尋範例:

  ```none
  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 hostname
    32452 HR host1
    64452 金融 host2
    46364 IT host3

    UDM 事件資料表
    principal metadata 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

使用 YARA-L 修改資料表

以下說明如何使用 YARA-L 修改資料表:

TableNameip_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.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

    資料表包含下列項目:

    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://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" 的對等陳述式。這是因為資料表的所有未對應欄都會進入實體圖的 additional 欄位 ($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.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 資料。只有在新增資料表並匯入定位點分隔值 (TSV) 檔案時,資料表才會支援定位點分隔值。

  • 資料表欄位不支援逗號 (,) 字元。

  • 在查詢中參照參照清單時,in 陳述式的數量限制也適用於資料表中的 in 陳述式。

  • 查詢中 in 陳述式的數量上限 (適用於 StringNumber 資料類型資料欄):7 個。

  • 含規則運算式運算子的 in 陳述式數量上限為 4 個。

  • 含 CIDR 運算子的 in 陳述式數量上限:2。

  • 每個資料表最多可有 1,000 個資料欄。

  • 每個資料表最多可有 1 千萬列。

  • 帳戶中所有資料表資料量的總上限:1 TB。

  • 在文字和表格編輯器檢視畫面中,網頁上顯示的資料表列數上限為 10,000 列。

  • 建立資料表時,上傳檔案的大小上限為 10 GB。

  • 設定部分不允許使用預留位置。

  • 資料類型設為 string 的資料表未對應資料欄,只能與 UDM 事件或 UDM 實體的字串欄位聯結。

  • 在資料表中,只能使用資料類型設為 cidrregex 的未對應資料欄 (適用於 CIDR 或規則運算式)。

  • 資料表查詢:不支援規則運算式萬用字元,搜尋字詞最多 100 個半形字元。

規則中資料表聯結的限制

規則中的資料表聯結有下列限制。

  • 使用資料表與事件聯結時,系統不支援擷取所有事件樣本以進行偵測。

  • 與實體和 UDM 不同,資料表不支援預留位置。這會導致下列限制:

    • 您無法將一組篩選器套用至資料表,並與 UDM 實體聯結。

    • 將同一個資料表與另一個 UDM 預留位置聯結時,無法套用不同的篩選器組合。

    舉例來說,假設有名為 dt 的資料表,其中包含 my_hostnameorgmy_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") 會導致資料表空白,然後與 e1e2 聯結。

使用含規則的資料表時的限制

搭配規則使用資料表時,請注意下列限制。

執行頻率的限制

含有資料表的規則不支援即時執行頻率。

輸出至資料表的限制

  • 資料表中的重複欄位資料欄不支援 anyall 修飾符。

  • 資料表中的重複欄位資料欄不支援陣列索引。

  • 您只能將結果變數匯出至資料表。您無法直接匯出事件路徑或資料表欄。

  • 資料欄清單必須包含資料表的主鍵欄。

  • 最多可有 20 個結果。

  • 如果資料表不存在,系統會建立新資料表,並為所有資料欄指派預設的 string 資料類型,順序則依指定而定。

  • 一次只能有一項規則寫入資料表。如果某項規則嘗試寫入另一個規則已寫入的資料表,規則編譯就會失敗。

  • 我們無法保證生產端規則能在資料表的取用端規則啟動前,將資料列新增至資料表。

  • 單一規則的結果列數量設有限制。結果、保存的資料和資料表最多只能有 10,000 列。

  • 更新資料列時,所有非鍵值資料欄的新值都會取代舊值。所有更新 (包括新增資料列) 大約需要五分鐘,才能用於查詢。

從資料表擴充實體的限制

  • 您只能對單一實體圖表變數套用一項擴充作業 (overrideappendexclude)。

  • 每項擴充作業只能使用一個資料表。

  • 您可以在 YARA-L 規則的 setup 區段中,定義最多兩項任何類型的擴充作業。

在下列範例中,override 作業會套用至實體圖表變數 $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 搜尋資料表時的限制

搭配 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 專業人員尋求答案。