YARA-L 2.0 を使用した UDM 検索の統計情報と集計

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

このページでは、UDM イベントに対して統計クエリを実行し、結果をグループ化して YARA-L 2.0 を使用して分析する方法について説明します。

概要

環境内で生成された大量の UDM イベントを処理する場合は、UDM 検索データの傾向を把握することが重要です。統計関数と集計関数を使用して、UDM ログから実用的な分析情報を取得できます。UDM 検索は、YARA-L 2.0 のすべての集計関数をサポートしています。

統計クエリは、次のユースケースで使用できます。

  • 重要な指標をトラッキングする: UDM イベントの分布と頻度、および関連するアセット(既知の悪意のある IP アドレスと通信しているホストなど)を測定できます。

  • 異常な動作を検出する: 異常なネットワーク トラフィック量や、通常とは異なる時間帯の予期しないログイン アクティビティなど、セキュリティ インシデントを示す可能性のある異常なパターンやアクティビティの急増を検出できます。

  • 時間の経過に伴う傾向を分析する: セキュリティ対策の変化を特定して、コントロールの影響を評価したり、改善が必要な領域を見つけたりできます。たとえば、時間の経過に伴う脆弱性の数の変化を追跡できます。

UDM 検索クエリの結果をグループ化して並べ替えるには、Detection Engine ルールの YARA-L 構造に似た構文を使用します。詳細については、YARA-L 2.0 言語の構文をご覧ください。

クエリの構造は次のとおりです。

  1. フィルタリング ステートメント: フィルタリング ステートメントには、イベントをフィルタする条件を指定します。

  2. Match(省略可): match セクションでは、グループ条件として使用するフィールドを指定します。詳細については、マッチ セクションの構文をご覧ください。

  3. 結果: 結果セクションには、クエリの出力が表示されます。詳細については、結果セクションの構文をご覧ください。

  4. 順序: 順序セクションでは、返されるクエリ結果の順序を指定します。順序(asc または desc)が指定されていない場合、デフォルトは asc です。

  5. 上限(省略可): 上限セクションでは、クエリが返す行の最大数を指定します。

順序と制限の使用例を次に示します。

metadata.log_type = "OKTA"

match:
    principal.ip
Outcome:
    $user_count_by_ip = count(principal.user.userid)

order:
 $user_count_by_ip desc

limit:
    20

集約

UDM 検索では、次の集計関数を使用できます。

sum

sum(numericExpression)

説明

sum 関数は、数値列内の値の合計を返します。計算中は NULL 値は無視されます。多くの場合、match とともに使用され、データ内のさまざまなグループ内の合計を計算します。

パラメータのデータ型

NUMBER

戻り値の型

NUMBER

コードサンプル

target.ip が空でないすべてのイベントを検索します。principal.ip に一致するすべてのイベントについて、network.sent_bytes の合計を sent_bytes という変数に格納します。

  target.ip != ""
  match:
    principal.ip
  outcome:
    $sent_bytes = sum(network.sent_bytes)

min(numericExpression)

説明

min 関数は、数値列内の値の最小値を返します。多くの場合、match とともに使用され、データ内の各グループの最小値を取得します。

パラメータのデータ型

NUMBER

戻り値の型

NUMBER

コードサンプル

target.ip が空でないすべてのイベントを検索します。principal.ip に一致するすべてのイベントについて、metadata.event_timestamp.seconds の最小値を min_seconds という変数に格納します。

  target.ip != ""
  match:
    principal.ip
  outcome:
    $min_seconds = min(metadata.event_timestamp.seconds)

最大

max(numericExpression)

説明

max 関数は、数値列内の値の最大値を返します。多くの場合、match とともに使用され、データ内の各グループ内の最大値を取得します。

パラメータのデータ型

NUMBER

戻り値の型

NUMBER

コードサンプル

target.ip が空でないすべてのイベントを検索します。principal.ip に一致するすべてのイベントについて、metadata.event_timestamp.seconds の最大値を max_seconds という変数に格納します。

  target.ip != ""
  match:
    principal.ip
  outcome:
    $max_seconds = max(metadata.event_timestamp.seconds)

avg

avg(numericExpression)

説明

avg 関数は、数値列内の値の平均を返します。計算中は NULL 値は無視されます。通常、match とともに使用して、データ内の特定のグループ内の平均を計算します。

パラメータのデータ型

NUMBER

戻り値の型

NUMBER

コードサンプル

target.ip が空でないすべてのイベントを検索します。principal.ip に一致するすべてのイベントについて、metadata.event_timestamp.seconds の平均を avg_seconds という変数に格納します。

  target.ip != ""
  match:
    principal.ip
  outcome:
    $avg_seconds = avg(metadata.event_timestamp.seconds)

count

count(expression)

説明

count 関数は、グループ内の行数を返します。多くの場合、match とともに使用され、データ内の特定のグループのカウントを取得します。

パラメータのデータ型

STRING

戻り値の型

NUMBER

コードサンプル

時間の経過に伴うユーザーの正常なログイン数のカウントを返します。

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count(metadata.id)

count_distinct

count_distinct(expression)

説明

count_distinct 関数は、グループ内で異なる値を持つ行の数を返します。多くの場合、match とともに使用して、データ内の特定のグループのカウントを取得します。

パラメータのデータ型

STRING

戻り値の型

NUMBER

コードサンプル

時間の経過に伴う、ユーザーの個別のログイン成功数を返します。

  metadata.event_type = "USER_LOGIN"
  $security_result = security_result.action
  $security_result = "ALLOW"
  $date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
  match:
      $security_result, $date
  outcome:
      $event_count = count_distinct(metadata.id)

配列

array(expression)

説明

array 関数は、すべての値をリスト形式で返します。リストは最大 25 個のランダムな要素に切り詰められます。

パラメータのデータ型

STRING

戻り値の型

LIST

コードサンプル

イベントタイプを含む配列を返します。

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array($event_type)

array_distinct

array_distinct(expression)

説明

array_distinct 関数は、一意の値をすべてリスト形式で返します。リストは最大 25 個のランダムな要素に切り詰められます。一意のリストを得るための重複除去は、切り捨て前に適用されます。

パラメータのデータ型

STRING

戻り値の型

LIST

コードサンプル

異なるイベントタイプを含む配列を返します。

  $event_type = metadata.event_type
  outcome:
    $event_type_array = array_distinct($event_type)

stddev

stddev(numericExpression)

説明

stddev 関数は、すべての可能な値の標準偏差を返します。

パラメータのデータ型

NUMBER

戻り値の型

NUMBER

コードサンプル

target.ip が空でないすべてのイベントを検索します。principal.ip に一致するすべてのイベントについて、metadata.event_timestamp.seconds の標準偏差を stddev_seconds という変数に格納します。

  target.ip != ""
  match:
    principal.ip
  outcome:
    $stddev_seconds = stddev(metadata.event_timestamp.seconds)

検索での YARA-L 2.0 の使用と UDM での使用の違い

  • ウィンドウ内のイベントを検索できる over キーワードは、検索では使用できません。

  • UDM 検索クエリの構造には、condition セクションと option セクションが含まれていません。

時間粒度でグループ化する

SQL でグループ化できる列と同様に、match セクション内のすべてのイベント フィールドとプレースホルダを指定された時間の粒度でグループ化できます。

構文は次のとおりです。

match:
  ... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]

時間の粒度でグループ化するには、by キーワードまたは over every キーワードを使用します。使用できる時間の粒度は次のとおりです。

  • MINUTE または m
  • HOUR または h
  • DAY または d
  • WEEK または w
  • MONTH または mo

by キーワードと over every キーワードは機能的に同等です。どちらか一方を使用できます。

IP アドレスとホスト名を 1 時間単位でグループ化します。

$hostname = principal.hostname
match:
  $hostname, target.ip by hour

すべてのイベントのカウントをホスト名とイベントが発生した日でグループ化します。

$hostname = target.hostname
match:
  $hostname over every day
outcome:
  $events_count = count($hostname)

エンティティ コンテキストなどの一部のデータソースは、期間(<start_time><end_time>)にわたって有効であり、単一のタイムスタンプは使用しません。

first キーワードはオプションのキーワードで、期間全体で有効なデータソースを、単一のタイムスタンプでのみ有効なデータソースとして扱います。つまり、期間にわたって有効なデータソースの場合、キーワード first は期間の開始時間(<start_time>)のみを考慮し、期間の終了時間は無視します。

たとえば、時間範囲が(1m, 5m)で、時間の粒度が 1 分のエンティティについて考えてみましょう。結果がホスト(h1, h2)でグループ化されているとします。残りの期間は無視されるため、返される列は(h1, 1m)と(h2, 1m)になります。

first キーワードは byover every の両方に追加できます。どちらの場合も動作は同じです。by first の使用は over every first と同等です。

次の例は、期間にわたって有効なエンティティ コンテキスト データソースで by 演算子を使用するクエリの例です。このクエリでは、first キーワードが省略されているため、期間全体が考慮されます。

graph.entity.hostname != ""
match:
  graph.entity.ip by hour
outcome:
  $min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)

検索のビジュアリゼーション

このセクションでは、Google SecOps 統合データモデル(UDM)検索内のデータ可視化機能の概要について説明します。この機能を使用すると、セキュリティ オペレーション センター(SOC)のアナリストは、検索結果から可視化を作成し、ダッシュボードに保存することで、脅威を効率的に検出して調査し、対応できます。

ビジュアリゼーションを作成してプレビュー ダッシュボードに保存する

可視化を [プレビュー ダッシュボード] に保存する手順は次のとおりです。

  1. match セクションと outcome セクションを含む YARA-L クエリを作成します。

  2. 期間を選択し、[検索を実行] をクリックしてクエリを実行します。クエリの結果は、[統計情報] タブと [可視化] タブの 2 つのタブに表示されます。

  3. [可視化] タブで、[グラフの種類] リストからグラフの種類を選択します。

  4. 選択したグラフの種類で、[データ設定] の設定を変更してグラフをカスタマイズします。

  5. [ダッシュボードに追加] 画面で、グラフの名前、グラフの説明、グラフの期間を追加します。

  6. 適切なオプションを選択して、グラフを既存のダッシュボードまたは新しいダッシュボードに追加します。

  7. [ダッシュボードに追加] をクリックして、グラフをダッシュボードに追加します。