パーサー拡張機能

以下でサポートされています。

このドキュメントでは、未加工ログデータからフィールドを抽出して Google Security Operations プラットフォーム内の宛先 UDM(統合データモデル)フィールドにマッピングするためのパーサー拡張機能を作成する方法について説明します。

このドキュメントでは、次のパーサー拡張機能の作成プロセスの概要について説明します。

パーサー拡張機能を作成する

パーサー拡張機能を使用すると、既存のデフォルト(およびカスタム)パーサーの機能を柔軟に拡張できます。デフォルト(およびカスタム)パーサーに代わるものではなく、パーサー パイプラインをシームレスにカスタマイズするためのものであり、新しい解析変換ロジックと、フィールドの抽出、操作、マッピングを可能にします。

パーサー拡張機能はカスタム パーサーとは異なります。デフォルト パーサーがないログタイプの場合は、カスタム パーサーを作成できます。また、パーサーの更新をオプトアウトすることもできます。

パーサーの抽出と正規化プロセス

Google SecOps は、元のログデータを未加工ログとして受信します。デフォルト(およびカスタム)パーサーは、コアログ フィールドを抽出して正規化し、UDM レコード内の構造化 UDM フィールドに格納します。これは、元の未加工ログデータのサブセットのみを表します。パーサー拡張機能を定義すると、デフォルト パーサーで処理されないログ値を抽出できます。有効化されると、パーサー拡張機能は Google SecOps のデータ抽出と正規化プロセスの一部になります。

取り込みと正規化のワークフロー

新しいパーサー拡張機能を定義する

デフォルトのパーサーには、コア セキュリティ値の抽出、変換、正規化方法を指定する、事前定義されたマッピング指示のセットが含まれています。新しいパーサー拡張機能は、ノーコード(データ フィールドをマッピングする)アプローチまたはコード スニペット アプローチを使用してマッピング指示を定義することで作成できます。

  • ノーコード アプローチ

    ノーコード アプローチは、ネイティブ JSON、XML、CSV 形式の未加工ログからの単純な抽出に最適です。未加工ログソース フィールドを指定し、対応する宛先 UDM フィールドをマッピングできます。

    たとえば、単純な等価比較を使用して、最大 10 個のフィールドを含む JSON ログデータを抽出します。

  • コード スニペット アプローチ

    コード スニペットを使用すると、未加工ログから値を抽出して変換し、UDM フィールドに割り当てるための指示を定義できます。コード スニペットは、デフォルト(またはカスタム)パーサーと同じ、Logstash に似た構文を使用します。

    このアプローチは、サポートされているすべてのログ形式に適用できます。次のようなシナリオに最適です。

    • 複雑なデータ抽出や複雑なロジック。
    • Grok ベースのパーサーを必要とする非構造化データ。
    • CSV や XML など、JSON 以外の形式。

    コード スニペットは、関数を使用して未加工のログデータから特定のデータを抽出します。たとえば、Grok、JSON、KV、XML などです。

    ほとんどの場合、デフォルト(またはカスタム)パーサーで使用されたデータ マッピング アプローチを使用することをおすすめします。

新しく抽出された値を UDM フィールドに統合する

有効化されると、パーサー拡張機能は、事前定義された統合原則に従って、新しく抽出された値を対応する UDM レコード内の指定された UDM フィールドに統合します。次に例を示します。

  • 既存の値を上書きする: 抽出された値は、宛先 UDM フィールドの既存の値を上書きします。

    唯一の例外は繰り返しフィールドです。UDM レコード内の繰り返しフィールドにデータを書き込むときに新しい値を追加するように、パーサー拡張機能を構成できます。

  • パーサー拡張機能が優先される: パーサー拡張機能でのデータ マッピング指示は、そのログタイプのデフォルト(またはカスタム)パーサーのデータ マッピング指示よりも優先されます。マッピング指示に競合がある場合、パーサー拡張機能はデフォルトで設定された値を上書きします。

    たとえば、デフォルトのパーサーが未加工ログフィールドを event.metadata.description UDM フィールドにマッピングし、パーサー拡張機能が別の未加工ログフィールドを同じ UDM フィールドにマッピングする場合、パーサー拡張機能は、デフォルトのパーサーによって設定された値を上書きします。

制限事項

  • ログタイプごとに 1 つのパーサー拡張機能: ログタイプごとに作成できるパーサー拡張機能は 1 つだけです。
  • データ マッピング指示のアプローチは 1 つだけ: ノーコード アプローチまたはコード スニペット アプローチのいずれかを使用してパーサー拡張機能を作成できますが、両方のアプローチを組み合わせて使用することはできません。
  • 検証用のログサンプル: UDM パーサー拡張機能を検証するには、過去 30 日間のログサンプルが必要です。詳細については、ログタイプのアクティブなパーサーがあることを確認するをご覧ください。
  • 基本パーサー エラー: 基本パーサー エラーは、パーサー拡張機能内で特定または修正できません。
  • コード スニペットでの繰り返しフィールド: コード スニペットで繰り返しオブジェクト全体を置き換える場合は、予期しないデータ損失を回避するよう注意してください。詳細については、繰り返しフィールド セレクタの詳細をご覧ください。
  • イベントの曖昧性解消: パーサー拡張機能は、1 つのレコードに複数の一意のイベントを含むログ(Google ドライブアレイなど)を処理できません。
  • XML とノーコード: エンコードに関する問題が発生する可能性があるため、XML にはノーコード アプローチはおすすめしません。XML にはコード スニペット アプローチを使用します。
  • 遡及データなし: 未加工ログデータを遡及的に解析することはできません。

パーサーのコンセプト

次のドキュメントでは、重要なパーサーのコンセプトについて説明します。

前提条件

パーサー拡張機能の作成の前提条件:

  • そのログタイプに対して有効なデフォルト(またはカスタム)パーサーが存在する必要があります。
  • Google SecOps がデフォルト(またはカスタム)パーサーを使用して未加工のログを取り込んで正規化できる必要があります。
  • ターゲット ログタイプのアクティブなデフォルト(またはカスタム)パーサーが過去 30 日以内に未加工ログデータを取り込んでいることを確認します。このデータには、ログレコードの抽出またはフィルタに使用するフィールドのサンプルが含まれている必要があります。これは、新しいデータ マッピング指示の検証に使用されます。

始める

パーサー拡張機能を作成する前に、次のことを行います。

  1. 前提条件を確認する:

    ログタイプに対応する有効なパーサーがあることを確認します。まだパーサーがない場合は、カスタム パーサーを作成します。

  2. 未加工ログから抽出するフィールドを特定する:

    未加工ログから抽出するフィールドを特定します。

  3. 適切な UDM フィールドを選択する:

    抽出された未加工ログ フィールドをマッピングするために、適切な対応する UDM フィールドを選択します。

  4. パーサー拡張機能定義のアプローチを選択する:

    パーサー拡張機能を作成するための 2 つの拡張アプローチ(データ マッピング アプローチ)のいずれかを選択します。

前提条件を確認する

次のセクションで説明するように、拡張するログタイプにアクティブなパーサーがあることを確認します。

ログタイプにアクティブなパーサーがあることを確認する

拡張するログタイプに対してアクティブなデフォルト(またはカスタム)パーサーがあることを確認します。

次のリストでログタイプを検索します。

ログタイプにカスタム パーサーがあることを確認する

ログタイプのカスタム パーサーがあることを確認するには:

  1. ナビゲーション バーで、[SIEM の設定] > [パーサー] を選択します。
  2. [パーサー] テーブルで、拡張するログタイプを検索します。

ログタイプに対してパーサーがアクティブであることを確認する

ログタイプに対してパーサーがアクティブかどうかを確認する手順は次のとおりです。

  1. ナビゲーション バーで、[SIEM の設定] > [パーサー] を選択します。
  2. [パーサー] テーブルで、拡張するログタイプを検索します。

    ログタイプのパーサーがアクティブでない場合は、アクティブにします。

未加工のログから抽出するフィールドを特定する

データの抽出元となる未加工ログを分析して、デフォルト(またはカスタム)パーサーで抽出されないフィールドを特定します。デフォルト(またはカスタム)パーサーが未加工ログフィールドを抽出して対応する UDM フィールドにマッピングする方法に注意してください。

未加工ログから抽出する特定のフィールドを特定するには、検索ツールを使用してフィールドを特定します。

未加工ログでの検索の詳細については、以下をご覧ください。

適切な UDM フィールドを選択する

抽出する特定のターゲット フィールドを特定したので、それらを対応する宛先 UDM フィールドとマッチングできます。未加工ログソース フィールドと宛先 UDM フィールドの間に明確なマッピングを確立します。データは、標準データ型または繰り返しフィールドをサポートする任意の UDM フィールドにマッピングできます。

適切な UDM フィールドを選択する

プロセスを簡素化するために、以下のリソースを参照してください。

UDM の主なコンセプトを理解する

既存のパーサーで使用されているデータ マッピングを理解する

デフォルト(またはカスタム)パーサーで使用される既存のデータ マッピング(未加工ログのソース フィールドと宛先 UDM フィールドの間)を理解することをおすすめします。

既存のデフォルト(またはカスタム)パーサーで使用される未加工ログのソース フィールドと宛先 UDM フィールド間のデータ マッピングを表示するには:

  1. ナビゲーション バーで、[SIEM の設定] > [パーサー] を選択します。
  2. [パーサー] テーブルで、拡張するログタイプを検索します。
  3. その行に移動し、 メニュー > [表示] をクリックします。

    [パーサー コード] タブに、既存のデフォルト(またはカスタム)パーサーで使用される未加工ログのソース フィールドと宛先の UDM フィールド間のデータ マッピングが表示されます。

UDM Lookup ツールを使用する

UDM Lookup ツールは、未加工ログソース フィールドにマッチする UDM フィールドを特定するのに利用します。

Google SecOps には、宛先 UDM フィールドをすばやく見つけることができる UDM Lookup ツールが用意されています。UDM Lookup ツールにアクセスするには、[調査] > [SIEM 検索] に移動します。

UDM Lookup ツールの使用方法については、次のトピックをご覧ください。

UDM Lookup ツールの例

たとえば、未加工ログに「packets」という名前のソース フィールドがある場合は、UDM Lookup ツールを使用して、名前に「packets」を含む宛先 UDM フィールドの候補を探します。

  1. [調査] > [SIEM 検索] に移動します。

  2. [SIEM 検索] ページの [UDM フィールドを値でルックアップ] フィールドに「packets」と入力し、[UDM Lookup] をクリックします。

    [UDM Lookup] ダイアログが開きます。検索ツールは、フィールド名またはフィールド値で UDM フィールドをマッチングします。

    • フィールド名によるルックアップ - 入力したテキスト文字列と、そのテキストを含むフィールド名をマッチングします。
    • フィールド値によるルックアップ - 入力した値と、保存されているログデータ内でその値を持つフィールドをマッチングします。
  3. [UDM Lookup] ダイアログで [UDM フィールド] を選択します。

    検索機能により、UDM フィールド名に「packets」というテキストを含む UDM フィールドの候補リストが表示されます。

  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 オブジェクトを使用して、データをカスタム Key-Value ペアとして格納します。これにより、マッチする UDM フィールドがなくても、貴重な情報を UDM レコードに格納できます。

パーサー拡張機能定義のアプローチを選択する

パーサー拡張機能定義のアプローチを選択する前に、次のセクションの作業を完了しておく必要があります。

次のステップは、[パーサー拡張機能] ページを開き、パーサー拡張機能の定義に使用する拡張アプローチを選択することです。

[パーサー拡張機能] ページを開く

[パーサー拡張機能] ページで、新しいパーサー拡張機能を定義できます。

[パーサー拡張機能] ページは、次に示すように設定メニューから、未加工ログ検索から、または以前の未加工ログ検索から開くことができます。

設定メニューから開く

設定メニューから [パーサー拡張機能] ページを開くには:

  1. ナビゲーション バーで、[SIEM の設定] > [パーサー] を選択します。

    [Parsers] テーブルには、ログタイプ別のデフォルト パーサーのリストが表示されます。

  2. 拡張するログタイプを見つけて、 メニュー > [拡張機能を作成] をクリックします。

    [パーサー拡張機能] ページが開きます。

未加工ログ検索から [パーサー拡張機能] ページを開くには:

  1. [調査] > [SIEM 検索] に移動します。
  2. 検索フィールドで、検索引数に接頭辞 raw = を追加し、検索キーワードを引用符で囲みます。例: raw = "example.com"
  3. [検索を実行] をクリックします。結果は [未加工ログ] パネルに表示されます。
  4. [Raw Logs] パネルでログ(行)をクリックします。[イベントビュー] パネルが表示されます。
  5. [イベントビュー] パネルの [未加工ログ] タブをクリックします。未加工ログが表示されます。
  6. [パーサーを管理] > [拡張機能を作成] > [次へ] をクリックします。

    [パーサー拡張機能] ページが開きます。

以前の 未加工ログ検索から [パーサー拡張機能] ページを開くには:

  1. 以前の未加工ログ検索を使用して、解析されるレコードに類似するレコードを検索します。
  2. [イベント] > [タイムライン] パネルでイベントを選択します。
  3. [イベントデータ] パネルを開きます。
  4. [パーサーを管理] > [拡張機能を作成] > [次へ] をクリックします。

    [パーサー拡張機能] ページが開きます。

[パーサー拡張機能] ページ

このページには、[未加工ログ] パネルと [拡張機能の定義] パネルが表示されます。

  • [未加工ログ] パネル:

    選択したログタイプの未加工ログデータのサンプルが表示されます。このページを [未加工ログ検索] から開いた場合、サンプルデータは実行した検索の結果です。[表示方法] メニュー(RAW、JSON、CSV、XML など)と [テキストを折り返す] チェックボックスを使用して、サンプルをフォーマットできます。

    1. 表示された未加工ログデータのサンプルが、パーサー拡張機能で処理される予定のログを代表していることを確認します。

    2. [UDM 出力をプレビュー] をクリックして、未加工のログデータのサンプルの UDM 出力を表示します。

  • [拡張機能の定義] パネル:

    ここでは、データ フィールドをマッピングするノーコード)またはコード スニペットを記述するの 2 つのマッピング指示アプローチのいずれかを使用して、パーサー拡張機能を定義できます。両方のアプローチを同じパーサー拡張機能で使用することはできません。

    選択したアプローチに応じて、受信する未加工ログから抽出して対応する UDM フィールドにマッピングするソースログデータ フィールドを指定するか、これらのタスクなどを実行するコード スニペットを作成します。

拡張アプローチを選択する

[パーサー拡張機能] ページの [拡張機能の定義] パネルの [拡張方法] フィールドで、パーサー拡張機能を作成するための次のアプローチのいずれかを選択します。

  • データ フィールドをマッピングするノーコード)アプローチ:

    このアプローチでは、未加工ログ内のフィールドを指定して宛先 UDM フィールドにマッピングできます。

    このアプローチは、次の未加工ログ形式で機能します。

    • ネイティブ JSON、ネイティブ XML、CSV のいずれか。
    • syslog ヘッダーとネイティブ JSON、ネイティブ XML、CSV のいずれか。 未加工ログのデータフィールド タイプ マッピング指示は、JSONXMLCSVSYSLOG + JSONSYSLOG + XMLSYSLOG + CSV の形式で作成できます。

    次のステップのノーコード(マップデータ フィールド)指示を作成するをご覧ください。

  • コード スニペットを記述するアプローチ:

    このアプローチでは、Logstash に似た構文を使用して、未加工ログから値を抽出して変換して UDM レコード内の UDM フィールドに割り当てるための指示を指定できます。

    • コード スニペットは、デフォルト(またはカスタム)パーサーと同じ構文とセクションを使用します。詳細については、パーサー構文をご覧ください。

    • このアプローチは、そのログタイプに対してサポートされているデータ形式すべてで機能します。

    次のステップのコード スニペット指示を作成するをご覧ください。

ノーコード(データ フィールドのマッピング)指示を作成する

ノーコード アプローチ(データフィールドをマッピングする方法とも呼ばれます)では、未加工ログフィールドのパスを指定して対応する宛先 UDM フィールドにマッピングできます。

ノーコード アプローチを使用してパーサー拡張機能を作成する前に、次のセクションの作業を完了しておく必要があります。

パーサー拡張機能を定義するための次のステップは次のとおりです。

  1. 繰り返しフィールド セレクタを設定する
  2. 各フィールドのデータ マッピング指示を定義する
  3. パーサー拡張機能を提出してアクティブにする

繰り返しフィールド セレクタを設定する

[拡張機能の定義] パネルの [繰り返しフィールド] フィールドで、パーサー拡張機能による繰り返しフィールド(値の配列をサポートするフィールド、例: principal.ip)への値の保存方法を設定します。

  • 値の追加: 新しく抽出された値は、UDM 配列フィールドに保存されている既存の値のセットに追加されます。
  • 値を置き換える: 新しく抽出された値は、以前にデフォルト パーサーによって保存された UDM 配列フィールドの既存の値のセットを置き換えます

[繰り返しフィールド] セレクタの設定は、繰り返しフィールドではないフィールドには影響しません。

詳細については、繰り返しフィールド セレクタの詳細をご覧ください。

フィールドごとにデータ マッピング指示を定義する

未加工ログから抽出するフィールドごとにデータ マッピング指示を定義します。この指示では、未加工ログ内の元フィールドのパスを指定して宛先 UDM フィールドにマッピングする必要があります。

  1. [未加工ログ] パネルに表示される未加工ログのサンプルに Syslog ヘッダーが含まれている場合は、[Syslog] フィールドと [ターゲット] フィールドが表示されます。(一部のログ形式には Syslog ヘッダーが含まれていません。ネイティブ JSON、ネイティブ XML、CSV など)。

    Google SecOps は、ログの構造化された部分を抽出するために、Syslog ヘッダーを前処理するために [Syslog] フィールドと [ターゲット] フィールドを必要とします。

    1. 次のフィールドを定義します。

      • Syslog: Syslog ヘッダーを前処理して未加工ログの構造化された部分から分離する、ユーザー定義のパターン。

        Grok と正規表現を使用して、Syslog ヘッダーと未加工ログ メッセージを特定する抽出パターンを指定します。詳細については、Syslog エクストラクタのフィールドを定義するをご覧ください。

      • ターゲット: ログの構造化された部分を保存する Syslog フィールド内の変数名。

        ログの構造化された部分を保存する変数名を抽出パターン内で指定します。

      以下は、Syslog フィールドと Target フィールドの抽出パターンと変数名の例です。

      Syslog エクストラクタ フィールド

    2. [Syslog] フィールドと [ターゲット] フィールドに値を入力したら、[検証] ボタンをクリックします。

      検証プロセスが構文と解析の両方のエラーの有無をチェックし、次のいずれかを返します。

      • 成功: データ マッピングのフィールドが表示されます。パーサー拡張機能の残りの部分を定義します。
      • 失敗: エラー メッセージが表示されます。続行するにはエラー状態を修正してください。
  2. 必要に応じて、前提条件の指示を定義します。

    前提条件の指示では、未加工ログの一部を指定します。パーサー拡張機能は、静的な値を未加工ログのフィールドとマッチングすることでこれを処理します。受信した未加工ログが前提条件の基準を満たしている場合、パーサー拡張機能はマッピングの指示を適用します。値がマッチしない場合、パーサー拡張機能はマッピングの指示を適用しません。

    次のフィールドに値を入力します。

    • 前提条件フィールド: 比較する値が格納されている未加工ログ内のフィールド識別子。ログデータ形式が JSON または XML の場合はフィールドへのフルパスを入力し、データ形式が CSV の場合は列位置を入力します。
    • 前提条件演算子: EQUALS または NOT EQUALS を選択します。
    • 前提条件の値: 未加工ログの 前提条件フィールドと比較される静的な値。

    前提条件指示の別の例については、ノーコード - 前提条件値を持つフィールドを抽出するをご覧ください。

  3. 未加工ログのデータ フィールドを宛先 UDM フィールドにマッピングします。

    • 元データ フィールド: ログデータ形式が JSON(例: jsonPayload.connection.dest_ip)または XML(例: /Event/Reason-Code)の場合はフィールドへのフルパスを入力し、データ形式が CSV の場合は列位置を入力します(注: インデックス位置は 1 から始まります)。

    • 宛先フィールド: 値が保存される UDM フィールドの完全修飾名を入力します(例: udm.metadata.collected_timestamp.seconds)。

  4. フィールドをさらに追加するには、[追加] をクリックし、次のフィールドのマッピング指示の詳細をすべて入力します。

フィールドのマッピングの別の例については、ノーコード - フィールドを抽出するをご覧ください。

パーサー拡張機能を提出してアクティブにする

未加工ログから抽出するすべてのフィールドのデータ マッピング指示を定義したら、パーサー拡張機能を提出してアクティブにします。

[送信] をクリックして、マッピング指示を保存して検証します。

Google SecOps がマッピング指示を検証します。

  • 検証プロセスが成功すると、状態は [ライブ] に変化し、マッピング指示は受信ログデータの処理を開始します。
  • 検証プロセスが失敗すると、状態は [失敗] に変わり、エラーが [未加工のログ] フィールドに表示されます。

    検証エラーの例を次に示します。

      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: パーサー拡張機能の検証は不合格でした。

繰り返しフィールド セレクタの詳細

一部の UDM フィールド(principal.ip フィールドなど)には、値の配列が保存されます。[繰り返しフィールド] セレクタを使用すると、パーサー拡張機能によって新しく抽出されたデータを繰り返しフィールドに保存する方法を制御できます。

  • 値の追加:

    パーサー拡張機能は、新しく抽出された値を UDM フィールド内の既存の値の配列に追加します。

  • 値を置き換える:

    パーサー拡張機能は、UDM フィールド内の既存の値の配列を新しく抽出された値で置き換えます。

パーサー拡張機能は、繰り返しフィールドが階層の最下位レベルにある場合にのみ、データをその繰り返しフィールドにマッピングできます。次に例を示します。

  • udm.principal.ip への値のマッピングはサポートされています。繰り返される ip フィールドは階層の最下位レベルにあり、principal繰り返しフィールドではないためです。
  • udm.intermediary.hostname への値のマッピングはサポートされていません。intermediary繰り返しフィールドであり、階層の最下位レベルにあるものではないためです。

次の表に、[繰り返しフィールド] セレクタ構成が生成後の UDM レコードに与える影響の例を示します。

繰り返しフィールドの選択 サンプルログ パーサー拡張機能の構成 生成された結果
追加した値 {"protoPayload":{"@type":"type.AuditLog","authenticationInfo":{"principalEmail":"admin@cmmar.co"},"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":"admin@cmmar.co"},"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":"admin@cmmar.co"},"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"}}}

Syslog エクストラクタ フィールドの詳細

Syslog エクストラクタ フィールドを使用すると、Syslog ヘッダーを構造化ログから分離できます。これを行うには Grok、正規表現を定義し、さらに出力を保存するための正規表現パターン内の名前付きトークンを定義します。

Syslog エクストラクタ フィールドを定義する

[Syslog] フィールドと [ターゲット] フィールドの値は連携しており、これでパーサー拡張機能によって Syslog ヘッダーを未加工ログの構造化された部分から分離する方法を定義します。Syslog フィールドでは、Grok と正規表現構文の組み合わせを使用して式を定義します。この式には、未加工ログの構造化された部分を特定する変数名が含まれます。[ターゲット] フィールドで、その変数名を指定します。

次の例は、これらのフィールドがどのように連携するかを示しています。

これは未加工ログの例です。

<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] フィールドで使用します: %{TIMESTAMP_ISO8601} %{WORD} %{WORD} ([- ]+)?%{GREEDYDATA:msg}

  • 式の次の部分は、Syslog ヘッダーを識別します: %{TIMESTAMP\_ISO8601} %{WORD} %{WORD} ([- ]+)?
  • 式のこの部分は、未加工ログの JSON セグメントをキャプチャします: %{GREEDYDATA:msg}

この例には、変数名 msg が含まれています。変数名を選択してください。パーサー拡張機能は、未加工ログの JSON セグメントを抽出し、変数 msg に割り当てます。

[ターゲット] フィールドに、変数名 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] フィールドと [ターゲット] フィールドを示しています。

Syslog エクストラクタ フィールド

次の表に、サンプルログ、Syslog 抽出パターン、ターゲット変数名、結果の例をさらに示します。

未加工ログの例 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 の必須フィールドを確認するには、次のリソースを使用します。

  • Google SecOps のドキュメント: UDM 使用ガイド - 各イベントタイプの必須 UDM フィールドとオプション UDM フィールド

  • サードパーティの非公式リソース: UDM イベントの検証

    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. 1 つ以上の値を UDM フィールドに割り当てます。
  • セクション 4. UDM イベント フィールドを @output キーにバインドします。

コード スニペット アプローチを使用してパーサー拡張機能を作成するには、次の操作を行います。

  1. [パーサー拡張機能] ページの [CBN スニペット] パネルで、コード スニペットを入力してパーサー拡張機能を作成します。
  2. [検証] をクリックして、マッピング指示を検証します。

コード スニペットの指示の例

次の例はコード スニペットを示しています。

これは未加工ログの例です。

  {
      "insertId": "00000000",
      "jsonPayload": {
          ...section omitted for brevity...
          "packets_sent": "4",
          ...section omitted for brevity...
      },
      "timestamp": "2022-05-03T01:45:00.150614953Z"
  }

次の例に示すコード スニペットは、jsonPayload.packets_sent の値を network.sent_bytes UDM フィールドにマッピングするものです。

mutate {
 replace => {
    "jsonPayload.packets_sent" => ""
 }
}
filter {
    # 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"
                }
            }
            # Section 3. assign the value to a UDM field
            mutate {
                copy => {
                    "udm.network.sent_bytes" => "jsonPayload.packets_sent"
                }
                on_error => "_exception"
            }
            if ![_exception] {
                # Section 4. Bind the UDM fields to the @output key
                mutate {
                    merge => {
                        "@output" => "event"
                    }
                }
            }
        }
    }
}

コード スニペット指示を提出する

  1. [Submit] をクリックして、マッピング指示を保存します。

  2. Google SecOps がマッピング指示を検証します。

    • 検証プロセスが成功すると、状態は [ライブ] に変化し、マッピング指示は受信ログデータの処理を開始します。
    • 検証プロセスが失敗すると、状態は [失敗] に変わり、エラーが [未加工のログ] フィールドに表示されます。

既存のパーサー拡張機能を管理する

既存のパーサー拡張機能の表示、編集、削除、アクセス制御を行うことができます。

既存のパーサー拡張機能を表示する

  1. ナビゲーション バーで、[SIEM の設定] > [パーサー] を選択します。
  2. [Parsers] リストで、表示するパーサー(ログタイプ)を見つけます。パーサー拡張機能を持つパーサーは、名前の横に EXTENSION というテキストが付いています。
  3. その行に移動し、 [メニュー] > [拡張機能を表示] をクリックします。

    [カスタム / 事前構築済みパーサーの表示] > [拡張機能] タブにパーサー拡張機能の詳細が表示されます。要約パネルには、デフォルトで LIVE パーサー拡張機能が表示されます。

パーサー拡張機能を編集する

  1. 既存のパーサー拡張機能を表示するで説明されているように、[カスタム/事前構築済みパーサーの表示] > [拡張機能] タブを開きます。

  2. [拡張機能を編集] ボタンをクリックします。

    [パーサー拡張機能] ページが表示されます。

  3. パーサー拡張機能を編集します。

    • 編集をキャンセルして変更を破棄するには、[下書きを破棄] をクリックします。

    • パーサー拡張機能を削除するには、[Delete Failed Extension] をクリックします。

    • パーサー拡張機能の編集が完了したら、[送信] をクリックします。

      検証プロセスが実行され、新しい構成が検証されます。

パーサー拡張機能を削除する

  1. 既存のパーサー拡張機能を表示するで説明されているように、[カスタム/事前構築済みパーサーの表示] > [拡張機能] タブを開きます。

  2. [拡張機能を削除] ボタンをクリックします。

パーサー拡張機能へのアクセスを制御する

デフォルトでは、管理者ロールを持つユーザーはパーサー拡張機能にアクセスできます。誰がパーサー拡張機能を表示および管理できるかを制御できます。ユーザーとグループの管理、またはロールの割り当ての詳細については、ロールベース アクセス制御をご覧ください。

Google SecOps の新しいロールの要約を次の表に示します。

機能 アクション 説明
パーサー 削除 パーサー拡張機能を削除します。
パーサー 編集 パーサー拡張機能を作成して編集します。
パーサー 表示 パーサー拡張機能を表示します。

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。