開發剖析器擴充功能

支援的服務:

本文說明如何建立剖析器擴充功能,從原始記錄資料擷取欄位,並對應至 Google Security Operations 平台中的目的地 UDM (Unified Data Model) 欄位。

本文概述剖析器擴充功能的建立程序:

建立剖析器擴充功能

剖析器擴充功能可讓您靈活擴充現有預設 (和自訂) 剖析器的功能。剖析器擴充功能可讓您彈性擴充現有預設 (或自訂) 剖析器的功能,而不必更換剖析器。擴充功能可讓您自訂剖析器管道,包括新增剖析邏輯、擷取及轉換欄位,以及更新或移除 UDM 欄位對應。

剖析器擴充功能與自訂剖析器不同。您可以為沒有預設剖析器的記錄類型建立自訂剖析器,或選擇不更新剖析器。

剖析器擷取和正規化程序

Google SecOps 會以原始記錄的形式接收原始記錄資料。預設 (和自訂) 剖析器會擷取核心記錄欄位並正規化,轉換為 UDM 記錄中的結構化 UDM 欄位。這只代表原始記錄資料的一部分。您可以定義剖析器擴充功能,擷取預設剖析器未處理的記錄值。啟用後,剖析器擴充功能就會成為 Google SecOps 資料擷取和正規化程序的一部分。

擷取和正規化工作流程

定義新的剖析器擴充功能

預設剖析器包含一組預先定義的對應指令,可指定如何擷取、轉換及正規化核心安全性值。您可以透過無程式碼 (對應資料欄位) 或程式碼片段方法定義對應指令,建立新的剖析器擴充功能:

  • 無程式碼方法

    無程式碼方法最適合從原生 JSON、XML 或 CSV 格式的原始記錄中,簡單擷取資料。您可以指定原始記錄來源欄位,並對應至目的地 UDM 欄位。

    例如,使用簡單的等式比較,擷取最多 10 個欄位的 JSON 記錄資料。

  • 程式碼片段方法

    程式碼片段方法可讓您定義指令,從原始記錄中擷取及轉換值,並指派給 UDM 欄位。程式碼片段使用的語法與預設 (或自訂) 剖析器相同,類似 Logstash。

    這種做法適用於所有支援的記錄格式。最適合用於下列情境:

    • 複雜的資料擷取或複雜的邏輯。
    • 需要 Grok 剖析器的非結構化資料。
    • 非 JSON 格式,例如 CSV 和 XML。

    程式碼片段會使用函式,從原始記錄資料中擷取特定資料。例如 Grok、JSON、KV 和 XML。

    在多數情況下,最好使用預設 (或自訂) 剖析器中採用的資料對應方法。

將新擷取的值合併至 UDM 欄位

啟用後,剖析器擴充功能會根據預先定義的合併原則,將新擷取的值合併到對應 UDM 記錄中的指定 UDM 欄位。例如:

  • 覆寫現有值:擷取的值會覆寫目的地 UDM 欄位中的現有值。

    唯一的例外狀況是重複欄位,您可以設定剖析器擴充功能,在將資料寫入 UDM 記錄中的重複欄位時附加新值。

  • 剖析器擴充功能優先:剖析器擴充功能中的資料對應指示,優先順序高於該記錄類型的預設 (或自訂) 剖析器。如果對應指令發生衝突,剖析器擴充功能會覆寫預設值。

    舉例來說,如果預設剖析器將原始記錄欄位對應至 event.metadata.description UDM 欄位,而剖析器擴充功能將不同的原始記錄欄位對應至同一個 UDM 欄位,則剖析器擴充功能會覆寫預設剖析器設定的值。

重複欄位選取器

無論是「對應資料欄位 (無程式碼)」或「編寫程式碼片段」方法,您都可以控管剖析器擴充功能如何將值儲存至「重複欄位」(支援值陣列的欄位,例如 principal.ip)。在「擴充功能」(擴充功能定義) 面板中,使用「重複欄位」欄位,其中提供「附加值」和「取代值」選項。

附加與取代行為

某些 UDM 欄位會儲存值陣列,例如 principal.ip 欄位。您可以使用「Repeated Fields」(重複欄位) 選取器,控制剖析器擴充功能如何將新擷取的資料儲存在重複欄位中:

  • 附加值:

    剖析器擴充功能會將新擷取的值,附加至 UDM 欄位中的現有值陣列。

  • 取代值:

    剖析器擴充功能會將 UDM 欄位中的現有值陣列,替換為新擷取的值。

只有在重複欄位位於階層最低層級時,剖析器擴充功能才能將資料對應至重複欄位。例如:

  • 系統支援將值對應至 udm.principal.ip,因為重複的 ip 欄位位於階層的最底層,且 principal 不是重複欄位。
  • 系統不支援將值對應至 udm.intermediary.hostname,因為 intermediary 是重複欄位,且不在階層的最底層。

下表提供範例,說明重複欄位選取器設定如何影響產生的 UDM 記錄。

選取「重複欄位」 記錄範例 剖析器擴充功能設定 生成的結果
附加值 {"protoPayload":{"@type":"type.AuditLog","authenticationInfo":{"principalEmail":""},"requestMetadata":{"callerIp":"1.1.1.1, 2.2.2.2"}}} 先決條件欄位:protoPayload.requestMetadata.callerIp
先決條件值:" "
先決條件運算子:NOT_EQUALS
原始資料欄位:protoPayload.requestMetadata.callerIp
目的地欄位:event.idm.read_only_udm.principal.ip
metadata:{event_timestamp:{}.....}principal:{Ip:"1.1.1.1, 2.2.2.2"} } }
附加值 {"protoPayload":{"@type":"type.AuditLog","authenticationInfo":{"principalEmail":""},"requestMetadata":{"callerIp":"2.2.2.2, 3.3.3.3", "name":"Akamai Ltd"}}} 先決條件 1:
先決條件欄位:protoPayload.requestMetadata.callerIp
先決條件值:" "
先決條件運算子:NOT_EQUALS
原始資料欄位:protoPayload.requestMetadata.callerIp
目的地欄位:event.idm.read_only_udm.principal.ip

前提 2:
原始資料欄位:protoPayload.requestMetadata.name
目的地欄位:event.idm.read_only_udm.metadata.product_name

套用擴充功能前,由預建剖析器產生的事件。
metadata:{event_timestamp:{} ... principal:{ip:"1.1.1.1"}}}

套用擴充功能後的輸出內容。
timestamp:{} idm:{read_only_udm:{metadata:{event_timestamp:{} .... product_name: "Akamai Ltd"}principal:{ip:"1.1.1.1, 2.2.2.2, 3.3.3.3"}}}

替換值 {"protoPayload":{"@type":"type..AuditLog","authenticationInfo":{"principalEmail":""},"requestMetadata":{"callerIp":"2.2.2.2"}}} 先決條件欄位:protoPayload.authenticationInfo.principalEmail
先決條件值:" "
先決條件運算子:NOT_EQUALS
原始資料欄位:protoPayload.authenticationInfo.principalEmail
目的地欄位:event.idm.read_only_udm.principal.ip
套用擴充功能前,由預建剖析器產生的 UDM 事件。
timestamp:{} idm:{read_only_udm:{metadata:{event_timestamp:{} ... principal:{ip:"1.1.1.1"}}}

套用擴充功能後的 UDM 輸出內容 timestamp:{} idm:{read_only_udm:{metadata:{event_timestamp:{} ....} principal:{ip:"2.2.2.2"}}}

限制

  • 每種記錄類型只能有一個剖析器擴充功能:每種記錄類型只能建立一個剖析器擴充功能。
  • 只能使用一種資料對應指令方法:您可以使用無程式碼或程式碼片段方法建構剖析器擴充功能,但不能同時使用這兩種方法。
  • 用於驗證的記錄範例:必須提供過去 30 天內的記錄範例,才能驗證 UDM 剖析器擴充功能。詳情請參閱「確保記錄類型有有效的剖析器」。
  • 基本剖析器錯誤:無法在剖析器擴充功能中識別或修正基本剖析器錯誤。
  • 重複欄位處理:在特定擴充功能中,只能使用單一方法 (附加或取代)。替換整個重複物件時請務必小心,以免意外遺失資料。
  • Additional.fields 會解讀為一組鍵/值組合,而非重複欄位:因此,只要將剖析器的 UDM 對應和擴充功能的 UDM 輸出內容各自的鍵/值新增至該組合,即可順暢合併兩者。
  • 消除歧義事件:剖析器擴充功能無法處理單一記錄中有多個不重複事件的記錄,例如 Google 雲端硬碟陣列。
  • XML 和無程式碼:XML 不支援無程式碼模式。請改用程式碼片段方法。
  • 剖析器語法與 YARA-L 偵測規則:擷取剖析器和剖析器擴充功能會在擷取時,使用 Logstash Grok 和設定語法搭配篩選器 (例如 grok、mutate、json、date 和 base64),將原始記錄剖析為 Unified Data Model (UDM)。剖析器無法使用 YARA-L 語法、結果區塊或產生器函式 (例如 yield)。YARA-L 2.0 嚴格來說是一種偵測引擎查詢語言,會在下游對標準化 UDM 事件進行評估,用於威脅警示,無法剖析原始記錄、變更 UDM 欄位或捨棄傳入的記錄流量。
  • 預設僅向前套用:根據預設,剖析器擴充功能只會套用至啟用後新擷取的記錄。如果基於重大業務需求,必須使用更新後的對應關係重新剖析歷來記錄,可以透過 Google Cloud 支援團隊要求執行後端記錄重播工作。詳情請參閱「重新剖析歷來資料 (記錄重播)」。
  • 剖析器邏輯無法存取擷取標籤:剖析器擴充功能無法讀取擷取標籤 (metadata.ingestion_labels),將值對應至 UDM 欄位,因為剖析器是在沙箱執行環境中執行,只能查看原始記錄主體。
  • 無程式碼方法的保留關鍵字:如果記錄包含下列任何保留關鍵字,請使用程式碼片段方法,而非無程式碼方法:
    • collectionTimestamp
    • createTimestamp
    • enableCbnForLoop
    • event
    • filename
    • message
    • namespace
    • output
    • onErrorCount
    • timestamp
    • timezone
  • 移除現有對應關係:您只能使用程式碼片段方法移除現有的 UDM 欄位對應關係。
  • 無法使用擴充功能移除主機名稱 UDM 欄位的對應關係:您無法使用擴充功能取消設定 (移除) 主機名稱 UDM 欄位 (例如 principal.hostname) 的對應關係。

剖析器概念

下列文件說明重要的剖析器概念:

必要條件

建立剖析器擴充功能的必要條件:

  • 記錄類型必須有運作中的預設 (或自訂) 剖析器。
  • Google SecOps 必須能使用預設 (或自訂) 剖析器,擷取及正規化原始記錄。
  • 確認目標記錄類型的預設 (或自訂) 剖析器,在過去 30 天內有擷取原始記錄資料。這項資料應包含您要擷取或用於篩選記錄檔記錄的欄位範例。這項資訊會用於驗證新的資料對應操作說明。

開始使用

建立剖析器擴充功能前,請先完成下列事項:

  1. 確認必要條件:

    請確認該記錄類型有運作中的剖析器。如果沒有剖析器,請建立自訂剖析器。

  2. 找出要從原始記錄中擷取的欄位:

    找出要從原始記錄擷取的欄位。

  3. 選取適當的 UDM 欄位:

    選取適當的對應 UDM 欄位,對應擷取的原始記錄欄位。

  4. 選擇剖析器擴充功能定義方法:

    選擇兩種擴充方法 (資料對應方法) 的其中一種,建立剖析器擴充功能。

確認必要條件

請確認您要擴充的記錄類型有運作中的剖析器,詳情請參閱下列各節:

確認記錄類型有運作中的剖析器

確認您要擴充的記錄類型,有有效的預設 (或自訂) 剖析器。

在下列清單中搜尋記錄類型:

確認記錄類型有自訂剖析器

如要確保記錄類型有自訂剖析器,請按照下列步驟操作:

  1. 在導覽列中,依序選取「設定」>「資料管理」>「剖析器」。如果使用的是 SIEM 專用平台,請依序前往「設定」>「剖析器」。
  2. 在「剖析器」表格中,搜尋要擴充的記錄類型。

確認記錄類型的剖析器已啟用

如要檢查記錄類型的剖析器是否有效,請按照下列步驟操作:

  1. 在導覽列中,依序選取「設定」>「資料管理」>「剖析器」。如果使用的是 SIEM 專用平台,請依序前往「設定」>「剖析器」。
  2. 在「剖析器」表格中,搜尋要擴充的記錄類型。

    如果記錄類型的剖析器未啟用,請啟用:

找出要從原始記錄擷取的欄位

分析要擷取資料的原始記錄,找出預設 (或自訂) 剖析器未擷取的欄位。請留意預設 (或自訂) 剖析器如何擷取原始記錄欄位,並對應至相應的 UDM 欄位。

如要找出要從原始記錄擷取的特定欄位,可以使用搜尋工具:

  • 如要存取搜尋工具,請依序前往「Investigation」(調查) >「SIEM Search」(SIEM 搜尋)。在搜尋查詢前輸入 raw=。詳情請參閱「搜尋原始記錄」。

  • 如要使用舊版搜尋工具,請按一下「SIEM Search」頁面頂端的「Go to Legacy search」。詳情請參閱「舊版方法:使用原始記錄搜尋提示」。

如要進一步瞭解如何在原始記錄中搜尋,請參閱:

選取適當的 UDM 欄位

現在您已找出要擷取的特定目標欄位,可以將這些欄位與對應的目的地 UDM 欄位配對。在原始記錄來源欄位和目的地 UDM 欄位之間建立明確的對應關係。您可以將資料對應至任何支援標準資料類型或重複欄位的 UDM 欄位。

選擇正確的 UDM 欄位

下列資源可協助簡化程序:

熟悉 UDM 的主要概念

  • 邏輯物件:事件和實體

    UDM 結構定義會說明儲存資料的所有可用屬性。每筆 UDM 記錄都會描述事件或實體。資料會根據記錄描述的是事件或實體,儲存在不同的欄位中。

    • UDM 事件物件會儲存環境中發生的動作相關資料。原始事件記錄會描述裝置 (例如防火牆或網路 Proxy) 記錄的動作。
    • UDM 實體物件會儲存 UDM 事件中參與者或實體的相關資料,例如環境中的資產、使用者或資源。
  • UDM 事件結構

  • UDM 實體的結構

  • UDM 名詞:名詞代表 UDM 事件中的參與者或實體。名詞可以是執行事件所述活動的裝置或使用者。名詞也可以是事件所述活動的「目標」裝置或使用者。

    UDM 名詞 說明
    principal 負責啟動事件所述動作的實體。
    target 動作的接收者或對象。在防火牆連線中,接收連線的機器就是目標。
    src 主體操作的來源實體。舉例來說,如果使用者將檔案從一部機器複製到另一部機器,則檔案和來源機器會以 src 表示。
    intermediary 在事件中扮演中介角色的任何實體,例如 Proxy 伺服器。這類外掛程式可以影響動作,例如封鎖或修改要求。
    observer 監控及回報事件,但不直接與流量互動的實體。例如網路入侵偵測系統,或安全資訊與事件管理系統。
    about 事件涉及的其他實體,但不屬於上述類別。例如電子郵件附件或程序啟動期間載入的 DLL。

    在實務上,主體和目標 Noun 物件最常使用。此外,請務必注意,上述說明是名詞的建議用法。實際用量可能會因預設或自訂基本剖析器的導入方式而異。

瞭解現有剖析器使用的資料對應

建議您瞭解預設 (或自訂) 剖析器使用的現有資料對應,也就是原始記錄來源欄位與目的地 UDM 欄位之間的對應。

如要查看原始記錄來源欄位與現有預設 (或自訂) 剖析器中使用的目的地 UDM 欄位之間的資料對應,請按照下列步驟操作:

  1. 在導覽列中,依序選取「設定」>「資料管理」>「剖析器」。如果使用的是 SIEM 專用平台,請依序前往「設定」>「剖析器」。
  2. 在「剖析器」表格中,搜尋要擴充的記錄類型。
  3. 前往該資料列,然後依序點選 「Menu」(選單) >「View」(查看)。

    在「預建」(或「自訂」) 分頁中,「剖析器程式碼」部分會顯示原始記錄來源欄位與現有預設 (或自訂) 剖析器中使用的目的地 UDM 欄位之間的資料對應。

使用 UDM 查詢工具

使用 UDM 查詢工具,找出與原始記錄來源欄位相符的 UDM 欄位。

Google SecOps 提供 UDM 查詢工具,可協助您快速找到目的地 UDM 欄位。如要存取 UDM 查詢工具,請依序前往「Investigation」(調查) >「SIEM Search」(SIEM 搜尋)。

如要瞭解如何使用 UDM 查詢工具,請參閱下列主題:

UDM 查詢工具範例

舉例來說,如果原始記錄中有一個名為「packets」的來源欄位,請使用 UDM 查詢工具,尋找名稱中含有「packets」的潛在目的地 UDM 欄位:

  1. 依序前往「調查」>「SIEM 搜尋」。

  2. 在「SIEM Search」(SIEM 搜尋) 頁面中,點選「UDM Lookup」(UDM 查詢)。

    「UDM Lookup」對話方塊隨即開啟。搜尋工具會依欄位名稱或欄位值比對 UDM 欄位:

    • 依欄位名稱查詢:比對您輸入的文字字串與包含該文字的欄位名稱。
    • 依欄位值查詢:比對您輸入的值與儲存的記錄資料中包含該值的欄位。
  3. 在「UDM Lookup」(UDM 查詢) 對話方塊的「Look up UDM fields/values」(查詢 UDM 欄位/值) 欄位中輸入「packets」,然後選取「UDM Fields」(UDM 欄位)。

    搜尋功能會顯示潛在 UDM 欄位清單,其中包含 UDM 欄位名稱中含有「packets」文字的欄位。

  4. 逐一按一下各列,即可查看每個 UDM 欄位的說明。

避免發生錯誤的重要 UDM 注意事項

  • 名稱相似的欄位:UDM 的階層結構可能會導致欄位名稱相似。請參閱預設剖析器指南。詳情請參閱「瞭解現有剖析器使用的資料對應」。
  • 任意欄位對應:如果資料無法直接對應至 UDM 欄位,請使用 additional 物件。詳情請參閱「將任意欄位對應至 UDM」。
  • 重複欄位:在程式碼片段中處理重複欄位時,請務必謹慎。取代整個物件可能會覆寫原始資料。使用無程式碼方法,可進一步控管重複欄位。詳情請參閱「重複欄位選取器」。
  • UDM 事件類型的必要 UDM 欄位:將 UDM metadata.event_type 欄位指派給 UDM 記錄時,每個 event_type 都需要 UDM 記錄中有一組不同的相關欄位。詳情請參閱「進一步瞭解如何指派 UDM metadata.event_type 欄位」。
  • 基本剖析器問題:剖析器擴充功能無法修正基本剖析器的錯誤。基本剖析器是建立 UDM 記錄的預設 (或自訂) 剖析器。建議您考慮強化剖析器擴充功能、修改基本剖析器,或預先篩選記錄等選項。
將任意欄位對應至 UDM

如果找不到適合儲存資料的標準 UDM 欄位,請使用 additional 物件,將資料儲存為自訂鍵/值組合。這樣一來,即使沒有相符的 UDM 欄位,您也能在 UDM 記錄中儲存重要資訊。

選擇剖析器擴充功能定義方法

選擇剖析器擴充定義方法前,請務必先完成下列章節:

接下來,請開啟「Parser Extension」(剖析器擴充功能) 頁面,並選取擴充功能方法,定義剖析器擴充功能:

開啟「Parser Extension」(剖析器擴充功能) 頁面

您可以在「Parser Extension」(剖析器擴充功能) 頁面定義新的剖析器擴充功能。

您可以透過下列方式開啟「Parser Extension」(剖析器擴充功能) 頁面:從「Settings」(設定) 選單、從「Raw Log Search」(原始記錄搜尋),或從舊版「Raw Log Search」(原始記錄搜尋):

從「設定」選單開啟

如要從「設定」選單開啟「剖析器擴充功能」頁面,請按照下列步驟操作:

  1. 在導覽列中,依序選取「設定」>「資料管理」>「剖析器」。如果使用的是 SIEM 專用平台,請依序前往「設定」>「剖析器」。

    「Parsers」(剖析器) 表格會依記錄類型顯示預設剖析器清單。

  2. 找到要擴充的記錄類型,依序點選 「Menu」(選單) >「Extend Parser」(擴充剖析器) >「Create Extension」(建立擴充功能)。

    「Parser Extension」(剖析器擴充功能) 頁面隨即開啟。

如要從「原始記錄搜尋」開啟「剖析器擴充功能」頁面,請按照下列步驟操作:

  1. 依序前往「調查」>「SIEM 搜尋」。
  2. 在搜尋欄位中,為搜尋引數加上前置字元 raw =,並用引號括住搜尋字詞。例如:raw = "example.com"。
  3. 按一下「執行搜尋」。 結果會顯示在「Raw Logs」(原始記錄) 面板中。
  4. 在「Raw Logs」(原始記錄) 面板中,按一下記錄 (資料列)。系統隨即會顯示「事件檢視器」面板。
  5. 在「Event Viewer」(事件檢視器) 面板中,按一下「Raw Log」(原始記錄) 分頁標籤。 系統會顯示原始記錄。
  6. 依序點選「管理剖析器」>「擴充剖析器」>「建立擴充功能」(或依序選取「建立擴充功能」>「下一步」)。

    「Parser Extension」(剖析器擴充功能) 頁面隨即開啟。

如要從舊版原始記錄搜尋開啟「剖析器擴充功能」頁面,請按照下列步驟操作:

  1. 使用舊版原始記錄搜尋,搜尋與要剖析的記錄類似的記錄。
  2. 在「時間軸」面板中選取事件 (或按一下原始記錄圖示),即可開啟原始記錄。
  3. 依序點選「管理剖析器」>「擴充剖析器」>「建立擴充功能」(或依序選取「建立擴充功能」>「下一步」)。

    「Parser Extension」(剖析器擴充功能) 頁面隨即開啟。

剖析器擴充功能頁面

頁面會顯示「原始記錄」和「擴充功能」(擴充功能定義) 面板:

  • 「Raw Log」(原始記錄) 面板:

    系統會顯示所選記錄類型的原始記錄資料範例。如果您是從「Raw Log Search」(原始記錄搜尋) 開啟頁面,樣本資料就是搜尋結果。您可以使用「View as」(檢視方式) 選單 (「Raw」(原始)、「JSON」、「CSV」、「XML」或「Hex/ASCII」(十六進位/ASCII)) 和「Wrap Text」(自動換行) 核取方塊設定範例格式。

    1. 確認顯示的原始記錄資料樣本,能代表剖析器擴充功能要處理的記錄。

    2. 按一下「Preview UDM Output」(預覽 UDM 輸出內容) (或「Show UDM Output」(顯示 UDM 輸出內容)),查看原始記錄資料範例的 UDM 輸出內容。

  • Extension (擴充功能定義) 面板:

    您可以使用兩種對應指令方法之一,定義剖析器擴充功能:對應資料欄位 (無程式碼) 或編寫程式碼片段 (或編寫程式碼片段)。您無法在同一個剖析器擴充功能中同時使用這兩種方法。

    視您選擇的方法而定,您可以指定要從傳入的原始記錄中擷取的來源記錄資料欄位,並將其對應至對應的 UDM 欄位,也可以編寫程式碼片段來執行這些工作等。

選取擴充方式

在「Parser Extension」(剖析器擴充功能) 頁面的「Extension」(擴充功能) 面板中,在「Extension Method」(擴充功能方法) 欄位中選取下列其中一種方法,建立剖析器擴充功能:

  • 對應資料欄位 (無程式碼) 方法:

    這種方法可讓您指定原始記錄中的欄位,並將其對應至目的地 UDM 欄位。

    這個方法適用於下列原始記錄格式:

    • 原生 JSON、原生 XML 或 CSV。
    • Syslog 標頭加上原生 JSON、原生 XML 或 CSV。您可以為下列格式的原始記錄建立資料欄位類型對應指示:JSON、XML、CSV、SYSLOG + JSON、SYSLOG + XML 和 SYSLOG + CSV。

    請參閱後續步驟:建立無程式碼 (對應資料欄位) 操作說明。

  • 編寫程式碼片段 (或編寫程式碼片段) 方法:

    這種方法可讓您使用類似 Logstash 的語法,指定從原始記錄中擷取及轉換值的指令,並將這些值指派給 UDM 記錄中的 UDM 欄位。

    • 程式碼片段使用的語法和區段與預設 (或自訂) 剖析器相同。詳情請參閱「剖析器語法」。

    • 這種方法適用於該記錄類型所有支援的資料格式。

    請參閱後續步驟:建立程式碼片段操作說明。

建立無程式碼 (對應資料欄位) 操作說明

無程式碼方法 (也稱為「對應資料欄位」方法) 可讓您指定原始記錄欄位的路徑,並對應至相應的目的地 UDM 欄位。

使用無程式碼方法建立剖析器擴充功能前,請務必先完成下列章節:

定義剖析器擴充功能的後續步驟如下:

  1. 設定重複欄位選取器
  2. 為每個欄位定義資料對應指令
  3. 提交並啟用剖析器擴充功能

為每個欄位定義資料對應指令

針對要從原始記錄中擷取的每個欄位,定義資料對應指令。指令應指定原始記錄中來源欄位的路徑,並對應至目的地 UDM 欄位。

  1. 如果「Raw Log」(原始記錄) 面板中顯示的原始記錄範例包含 Syslog 標頭,則會顯示「Syslog」和「Target」(目標) 欄位。(部分記錄格式不含 Syslog 標頭,例如原生 JSON、原生 XML 或 CSV)。

    Google SecOps 需要「Syslog」和「Target」欄位,才能預先處理 Syslog 標頭,擷取記錄的結構化部分。

    1. 定義下列欄位:

      • Syslog:這是使用者定義的模式,可預先處理 Syslog 標頭,並將其與原始記錄的結構化部分分開。

        使用 Grok 和規則運算式指定擷取模式,用於識別 Syslog 標頭和原始記錄訊息。詳情請參閱「定義 Syslog 擷取器欄位」。

      • 目標:Syslog 欄位中儲存記錄結構化部分的變數名稱。

        在擷取模式中指定變數名稱,用於儲存記錄的結構化部分。

      以下是「Syslog」和「Target」欄位的擷取模式和變數名稱範例。

      Syslog 擷取器欄位

    2. 在「Syslog」和「Target」(目標) 欄位中輸入值後,按一下「Validate」(驗證) 按鈕。

      驗證程序會檢查語法和剖析錯誤,然後傳回下列其中一項:

      • 成功:資料對應欄位會顯示。定義剖析器擴充功能的其餘部分。
      • 失敗:系統會顯示錯誤訊息。請先修正錯誤條件再繼續。
  2. 視需要定義先決條件指令。

    前置條件指令會將靜態值與原始記錄中的欄位進行比對,藉此找出剖析器擴充功能要處理的原始記錄子集。如果傳入的原始記錄符合前置條件,剖析器擴充功能就會套用對應指令。如果值不相符,剖析器擴充功能就不會套用對應指令。

    填寫下列欄位:

    • 先決條件欄位 (CSV 則為先決條件欄):原始記錄中的欄位 ID,包含要比較的值。如果記錄資料格式為 JSON 或 XML,請輸入欄位的完整路徑;如果資料格式為 CSV,請輸入資料欄位置。
    • 先決條件運算子:選取「等於」或「不等於」。
    • Precondition Value:與原始記錄中「Precondition Field」比較的靜態值。

    如需其他前置條件指示範例,請參閱「無程式碼 - 擷取具有前置條件值的欄位」。

  3. 將原始記錄資料欄位對應至目的地 UDM 欄位:

    • 「Raw Data Field」(原始資料欄位) (如果是 CSV,則為「Raw Data Column」(原始資料欄)):如果記錄資料格式為 JSON (例如:jsonPayload.connection.dest_ip) 或 XML (例如:/Event/Reason-Code),請輸入欄位的完整路徑;如果資料格式為 CSV,請輸入資料欄位置 (注意:索引位置從 1 開始)。

    • Destination Field:輸入用來儲存值的完整 UDM 欄位名稱,例如 udm.metadata.collected_timestamp.seconds。

  4. 如要繼續新增更多欄位,請按一下「Add」(新增),然後輸入下一個欄位的所有對應指令詳細資料。

如需其他對應欄位的範例,請參閱「無程式碼 - 擷取欄位」。

提交並啟用剖析器擴充功能

為要從原始記錄擷取的所有欄位定義資料對應指令後,請提交並啟用剖析器擴充功能。

按一下「提交」,儲存並驗證對應指令。

Google SecOps 會驗證對應指令:

  • 如果驗證程序成功,狀態會變更為「Live」(已啟用),且對應指令會開始處理傳入的記錄資料。
  • 如果驗證程序失敗,狀態會變更為「Failed」(失敗),且「Raw Log」(原始記錄) 欄位會顯示錯誤。

    以下是驗證錯誤的範例:

      ERROR: generic::unknown: pipeline.ParseLogEntry failed: LOG_PARSING_CBN_ERROR:
      "generic::invalid_argument: pipeline failed: filter mutate (7) failed: copy failure:
      copy source field \"jsonPayload.dest_instance.region\" must not be empty
      (try using replace to provide the value before calling copy)
    
      "LOG: {"insertId":"14suym9fw9f63r","jsonPayload":{"bytes_sent":"492",
      "connection":{"dest_ip":"10.12.12.33","dest_port":32768,"protocol":6,
      "src_ip":"10.142.0.238","src_port":22},"end_time":"2023-02-13T22:38:30.490546349Z",
      "packets_sent":"15","reporter":"SRC","src_instance":{"project_id":"example-labs",
      "region":"us-east1","vm_name":"example-us-east1","zone":"us-east1-b"},
      "src_vpc":{"project_id":"example-labs","subnetwork_name":"default",
      "vpc_name":"default"},"start_time":"2023-02-13T22:38:29.024032655Z"},
      "logName":"projects/example-labs/logs/compute.googleapis.com%2Fvpc_flows",
      "receiveTimestamp":"2023-02-13T22:38:37.443315735Z","resource":{"labels":
      {"location":"us-east1-b","project_id":"example-labs",
        "subnetwork_id":"00000000000000000000","subnetwork_name":"default"},
        "type":"gce_subnetwork"},"timestamp":"2023-02-13T22:38:37.443315735Z"}
    

    剖析器擴充功能的生命週期狀態

    剖析器擴充功能有下列生命週期狀態:

  • DRAFT:新建立的剖析器擴充功能,尚未提交。

  • VALIDATING:Google SecOps 正在根據現有原始記錄驗證對應指令,確保剖析欄位時不會發生錯誤。

  • LIVE:剖析器擴充功能已通過驗證,目前已在正式環境中。它會從傳入的原始記錄中擷取資料,並轉換為 UDM 記錄。

  • FAILED:剖析器擴充功能驗證失敗。

進一步瞭解 Syslog 擷取器欄位

Syslog 擷取器欄位可讓您定義 Grok、規則運算式,以及規則運算式模式中的命名權杖來儲存輸出內容,藉此將 Syslog 標頭與結構化記錄檔分隔。

定義 Syslog 擷取器欄位

「Syslog」和「Target」欄位中的值會共同定義剖析器擴充功能如何將 Syslog 標頭與原始記錄的結構化部分分隔。在「Syslog」Syslog欄位中,使用 Grok 和規則運算式語法組合定義運算式。運算式包含變數名稱,可識別原始記錄的結構化部分。在「Target」(目標) 欄位中,指定該變數名稱。

以下範例說明這些欄位如何搭配運作。

以下是原始記錄範例:

<13>1 2022-09-14T15:03:04+00:00 fieldname fieldname - - - {"timestamp": "2021-03-14T14:54:40.842152+0000","flow_id": 1885148860701096, "src_ip": "10.11.22.1","src_port": 51972,"dest_ip": "1.2.3.4","dest_port": 55291,"proto": "TCP"}

原始記錄包含下列部分:

  • Syslog 標頭:<13> 2022-09-14T15:03:04+00:00 fieldname fieldname - - -

  • JSON 格式事件:{"timestamp": "2021-03-14T14:54:40.842152+0000","flow_id": 1885148860701096, "src_ip": "10.11.22.1","src_port": 51972,"dest_ip": "1.2.3.4","dest_port": 55291,"proto": "TCP"}

如要將 Syslog 標頭與原始記錄的 JSON 部分分開,請在「Syslog」Syslog欄位中使用下列運算式範例: %{TIMESTAMP_ISO8601} %{WORD} %{WORD} ([- ]+)?%{GREEDYDATA:msg}

  • 運算式的這個部分會識別 Syslog 標頭: %{TIMESTAMP\_ISO8601} %{WORD} %{WORD} ([- ]+)?
  • 運算式的這個部分會擷取原始記錄的 JSON 區段: %{GREEDYDATA:msg}

這個範例包含變數名稱 msg。您可以自行選擇變數名稱。剖析器擴充功能會擷取原始記錄的 JSON 區隔,並指派給變數 msg。

在「Target」(目標) 欄位中,輸入變數名稱 msg。儲存在 msg 變數中的值,會輸入到您在剖析器擴充功能中建立的資料欄位對應指令。

使用原始記錄範例,下列區隔是資料對應指令的輸入內容:

{"timestamp": "2021-03-14T14:54:40.842152+0000","flow_id": 1885148860701096, "src_ip": "10.11.22.1","src_port": 51972,"dest_ip": "1.2.3.4","dest_port": 55291,"proto": "TCP"}

以下是填寫完成的「Syslog」和「Target」欄位:

Syslog 擷取器欄位

下表提供更多範例,包括記錄範例、Syslog 擷取模式、Target 變數名稱和結果。

原始記錄範例 Syslog 欄位 目標欄位 結果
<13>1 2022-07-14T15:03:04+00:00 suricata suricata - - - {\"timestamp\": \"2021-03-14T14:54:40.842152+0000\",\"flow_id\": 1885148860701096,\"in_iface\": \"enp94s0\",\"event_type\": \"alert\",\"vlan\": 522,\"src_ip\": \"1.1.2.1\",\"src_port\": 51972,\"dest_ip\": \"1.2.3.4\",\"dest_port\": 55291,\"proto\": \"TCP\"}" %{TIMESTAMP_ISO8601} %{WORD} %{WORD} ([- ]+)?%{GREEDYDATA:msg} msg field_mappings { field: "msg" value: "{\"timestamp\": \"2021-03-14T14:54:40.842152+0000\",\"flow_id\": 1885148860701096,\"in_iface\": \"enp94s0\",\"event_type\": \"alert\",\"vlan\": 522,\"src_ip\": \"1.1.2.1\",\"src_port\": 51972,\"dest_ip\": \"1.2.3.4\",\"dest_port\": 55291,\"proto\": \"TCP\"}" }
<13>1 2022-07-14T15:03:04+00:00 suricata suricata - - - {\"timestamp\": \"2021-03-14T14:54:40.842152+0000\"} - - - {\"timestamp\": \"2021-03-14T14:54:40.842152+0000\",\"flow_id\": 1885148860701096,\"in_iface\": \"enp94s0\",\"event_type\": \"alert\",\"vlan\": 522,\"src_ip\": \"1.1.2.1\",\"src_port\": 51972,\"dest_ip\": \"1.2.3.4\",\"dest_port\": 55291,\"proto\": \"TCP\"} %{TIMESTAMP_ISO8601} %{WORD} %{WORD} ([- ]+)?%{GREEDYDATA:msg1} ([- ]+)?%{GREEDYDATA:msg2} msg2 field_mappings { field: "msg2" value: "{\"timestamp\": \"2021-03-14T14:54:40.842152+0000\",\"flow_id\": 1885148860701096,\"in_iface\": \"enp94s0\",\"event_type\": \"alert\",\"vlan\": 522,\"src_ip\": \"1.1.2.1\",\"src_port\": 51972,\"dest_ip\": \"1.2.3.4\",\"dest_port\": 55291,\"proto\": \"TCP\"}" }
"<13>1 2022-07-14T15:03:04+00:00 suricata suricata - - - {\"timestamp\": \"2021-03-14T14:54:40.842152+0000\"} - - - {\"timestamp\": \"2021-03-14T14:54:40.842152+0000\",\"flow_id\": 1885148860701096,\"in_iface\": \"enp94s0\",\"event_type\": \"alert\",\"vlan\": 522,\"src_ip\": \"1.1.2.1\",\"src_port\": 51972,\"dest_ip\": \"1.2.3.4\",\"dest_port\": 55291,\"proto\": \"TCP\"}" %{TIMESTAMP_ISO8601} %{WORD} %{WORD} ([- ]+)?%{GREEDYDATA:message} ([- ]+)?%{GREEDYDATA:msg2} msg2 Error - message already exists in state and not overwritable.

進一步瞭解如何指派 UDM metadata.event_type 欄位

將 UDM metadata.event_type 欄位指派給 UDM 記錄時,系統會進行驗證,確保 UDM 記錄中包含必要的相關欄位。每個 UDM metadata.event_type 都需要一組不同的相關欄位,例如,沒有 user 的 USER_LOGIN 事件就沒有用處。

如果缺少必要的相關欄位,UDM 驗證會傳回錯誤:

  "error": {
    "code": 400,
    "message": "Request contains an invalid argument.",
    "status": "INVALID_ARGUMENT"
  }

Grok 剖析器會傳回更詳細的錯誤:

  generic::unknown:
  invalid event 0: LOG_PARSING_GENERATED_INVALID_EVENT:
  "generic::invalid_argument: udm validation failed: target field is not set"

如要找出 UDM event_type 指派作業的必要欄位,請使用 下列資源。其中,採用指南是 UDM 使用指南的補充資料,提供填入特定 UDM metadata.event_type 所需的最低必要 UDM 欄位。

例如,開啟文件並搜尋 GROUP_CREATION 事件類型。

您應該會看到下列 UDM 欄位下限,以 UDM 物件的形式呈現:

  {
      "metadata": {
          "event_timestamp": "2023-07-03T13:01:10.957803Z",
          "event_type": "GROUP_CREATION"
      },
      "principal": {
          "user": {
              "userid": "pinguino"
          }
      },
      "target": {
          "group": {
              "group_display_name": "foobar_users"
          }
      }
  }

建立程式碼片段操作說明

程式碼片段方法可讓您使用類似 Logstash 的語法,定義如何從原始記錄中擷取及轉換值,並將這些值指派給 UDM 記錄中的 UDM 欄位。

使用程式碼片段方法建立剖析器擴充功能之前,請務必先完成下列章節:

定義剖析器擴充功能的後續步驟如下:

  1. 如需提示和最佳做法,請參閱「撰寫程式碼片段指令的提示和最佳做法」。
  2. 建立程式碼片段操作說明
  3. 提交程式碼片段操作說明

撰寫程式碼片段操作說明的提示和最佳做法

程式碼片段指令可能會因 Grok 模式不正確、重新命名或取代作業失敗,或語法錯誤等問題而失敗。請參閱下列提示和最佳做法:

建立程式碼片段操作說明

程式碼片段指令使用的語法和區段與預設 (或自訂) 剖析器相同:

  • 第 1 節:從原始記錄中擷取資料。
  • 第 2 節:轉換擷取的資料。
  • 第 3 節:為 UDM 欄位指派一或多個值。
  • 第 4 節:將 UDM 事件欄位繫結至 @output 鍵。

如要使用程式碼片段建立剖析器擴充功能,請按照下列步驟操作:

  1. 在「Parser Extension」(剖析器擴充功能) 頁面的「CBN Snippet」(CBN 程式碼片段) 面板中,輸入程式碼片段來建立剖析器擴充功能。
  2. 按一下「Validate」(驗證),驗證對應操作說明。

程式碼片段指示範例

以下範例說明程式碼片段。

以下是原始記錄範例 (為求簡潔,省略了其他 jsonPayload 欄位):

  {
      "insertId": "00000000",
      "jsonPayload": {
          "packets_sent": "4"
      },
      "timestamp": "2022-05-03T01:45:00.150614953Z"
  }

以下程式碼片段範例會將 jsonPayload.packets_sent 中的值對應至 network.sent_bytes UDM 欄位:

filter {
  mutate {
    replace => {
      "jsonPayload.packets_sent" => ""
    }
  }
  # Section 1. extract data from the raw JSON log
  json {
    source => "message"
    array_function => "split_columns"
    on_error => "_not_json"
  }
  if [_not_json] {
    drop {
      tag => "TAG_UNSUPPORTED"
    }
  } else {
    # Section 2. transform the extracted data
    if [jsonPayload][packets_sent] not in ["", 0] {
      mutate {
        convert => {
          "jsonPayload.packets_sent" => "uinteger"
        }
        on_error => "_exception1"
      }
      # Section 3. assign the value to a UDM field
      mutate {
        Replace => {
          "event.idm.read_only_udm.network.sent_bytes" => "jsonPayload.packets_sent"
        }
        on_error => "_exception2"
      }
      if ![_exception1] and![_exception2] {
        # Section 4. Bind the UDM fields to the @output key
        mutate {
          merge => {
            "@output" => "event"
          }
        }
      }
    }
  }
}

提交程式碼片段操作說明

  1. 按一下「提交」,儲存對應操作說明。

  2. Google SecOps 會驗證對應指令。

    • 如果驗證程序成功,狀態會變更為「Live」(已啟用),且對應指令會開始處理傳入的記錄資料。
    • 如果驗證程序失敗,狀態會變更為「Failed」(失敗),且「Raw Log」(原始記錄) 欄位會顯示錯誤。

管理現有的剖析器擴充功能

您可以查看、編輯、刪除及控管現有剖析器擴充功能的存取權。

查看現有的剖析器擴充功能

  1. 在導覽列中,依序選取「設定」>「資料管理」>「剖析器」。如果使用的是 SIEM 專用平台,請依序前往「設定」>「剖析器」。
  2. 在剖析器清單中,找出要查看的剖析器 (記錄類型)。如果剖析器有名為 EXTENSION (或 EXTN) 的剖析器擴充功能,則會顯示在名稱旁邊。
  3. 前往該資料列,然後依序點選 「Menu」(選單) >「Extend Parser」(擴充剖析器) >「View Extension」(查看擴充功能)。

    系統會顯示「View Custom/Prebuilt Parser」>「Extension」分頁 (或「Extensions」分頁),其中會顯示剖析器擴充功能的詳細資料。摘要面板預設會顯示 LIVE 剖析器擴充功能。

編輯剖析器擴充功能

  1. 開啟「View Custom/Prebuilt Parser」>「Extension」分頁 (或「Extensions」分頁),如「查看現有的剖析器擴充功能」一節所述。

  2. 按一下「編輯額外資訊」(或「編輯」) 按鈕。

    「Parser Extension」(剖析器擴充功能) 頁面隨即顯示。

  3. 編輯剖析器擴充功能。

    • 如要取消編輯並捨棄變更,請按一下「捨棄草稿」(或「捨棄擴充功能」)。

    • 如要刪除剖析器擴充功能,請按一下「Delete Failed Extension」(刪除失敗的擴充功能) (或「Delete Extension」(刪除擴充功能))。

    • 完成編輯剖析器擴充功能後,按一下「Submit」(提交)。

      系統會執行驗證程序,驗證新設定。

刪除剖析器擴充功能

  1. 開啟「View Custom/Prebuilt Parser」>「Extension」分頁 (或「Extensions」分頁),如「查看現有的剖析器擴充功能」一節所述。

  2. 按一下「刪除擴充功能」按鈕。

控管剖析器擴充功能的存取權

根據預設,具備管理員角色的使用者可以存取剖析器擴充功能。您可以控管哪些人能查看及管理剖析器擴充功能。如要進一步瞭解如何管理使用者和群組,或指派角色,請參閱「角色式存取控管」。

下表列出 Google SecOps 的新角色。

功能 動作 說明
剖析器 刪除 刪除剖析器擴充功能。
剖析器 編輯 建立及編輯剖析器擴充功能。
剖析器 查看 查看剖析器擴充功能。

使用剖析器擴充功能移除 UDM 欄位對應

您可以使用剖析器擴充功能,移除現有的 UDM 欄位對應。

  1. 依序點選「設定」>「資料管理」>「剖析器」。如果使用的是 SIEM 專用平台,請依序前往「設定」>「剖析器」。
  2. 請使用下列任一方法查看「Parser Extension」(剖析器擴充功能) 頁面:
    • 如要查看現有擴充功能,請依序點選 「Menu」(選單) >「Extend Parser」(擴充剖析器) >「View Extension」(查看擴充功能)。
    • 如要建立新的剖析器擴充功能,請依序點選 「Menu」(選單) >「Extend Parser」(擴充剖析器) >「Create Extension」(建立擴充功能)。
  3. 選取「Write Code Snippets」(編寫程式碼片段) (或「Write code snippet」(編寫程式碼片段)) 做為擴充功能方法,新增自訂程式碼片段,移除特定 UDM 欄位的值。

    如果是現有擴充功能,請在「Extension」(擴充功能) (或「Extensions」(擴充功能)) 分頁中,按一下「Edit Extension」(編輯擴充功能) (或「Edit」(編輯)),然後新增程式碼片段。

    如需程式碼片段範例,請參閱「程式碼片段 - 移除現有對應」。

  4. 請按照提交程式碼片段操作說明中的步驟提交擴充功能。

時區處理和時間戳記格式

Google SecOps 會將時間戳記標準化並序列化為 RFC 3339 UTC 格式,精確度可達微秒 (YYYY-MM-DDTHH:MM:SS.ffffffZ)。如果來源記錄僅提供秒級精確度,平台會自動在缺少的數字後方補零 (.000000Z),以維持結構定義一致性。

如果事件時間戳記早於擷取時間 (ingested_timestamp < event_timestamp),通常是因為來源發出本機時鐘時間戳記,但沒有 ISO 時區偏移 (預設為世界標準時間),或時鐘偏移。您可以透過下列任一方法解決時區不一致的問題:

  • 在剖析器擴充功能中調整時間戳記:在程式碼片段剖析器擴充功能中使用 date 篩選器,指定來源時區:

    if [raw_log] =~ /EST/ {
      date {
        match => [ "timestamp_str", "MMM dd HH:mm:ss" ]
        timezone => "America/New_York"
        target => "event.metadata.event_timestamp"
      }
    }
    
  • 設定轉寄站收集器時區覆寫:依序前往「設定」>「資料管理」>「轉寄站」,編輯目標收集器,啟用「覆寫時區」,然後從「時區」選單中選取來源 IANA 時區 (例如 Europe/Paris),在擷取期間自動調整時間戳記。

還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求解答。