結果セクションの構文

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

YARA-L クエリの outcome セクションでは、検索クエリとダッシュボード クエリの出力、ルールがトリガーされたときの検出に追加のコンテキストと情報を指定する結果変数を定義します。これらの変数は、ダッシュボードに関連データを表示したり、リスクスコアを作成したりするなど、さまざまな目的に使用できます。

成果セクションを定義する

$ 記号の後に変数名を続けて使用して、単一クエリの outcome セクションで結果変数を定義します。結果変数は最大 20 個まで定義できます。変数名自体は任意です。ルールの場合、結果の値は各検出に基づいて計算され、集計されます。

各結果変数には、式を使用して値が割り当てられます。

このルールは、新しい場所からのログイン失敗を検索します。

rule failed_logins
{
  meta:
   author = "Security Team"
   description = "Detects multiple failed user logins within 10-minute windows."
   severity = "HIGH"

  events:
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $user = $e.target.user.userid

  match:
   $user over 10m

  outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

  condition:
   #e >= 5
}

outcome セクションでは、イベント変数とプレースホルダ変数に対して集計を行います。ログイン失敗のカウント、個別の IP のカウント、失敗が発生した時刻を取得します。

outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

特別な $risk_score 結果変数を含めて入力すると、その値(整数または浮動小数点数)が、クエリによって生成されたアラートの [アラートと IoC] ページに表示されます。

クエリの outcome セクションに $risk_score 変数を含めない場合、次のいずれかのデフォルト値が設定されます。

  • アラートを生成するようにクエリが構成されている場合、$risk_score は 40 に設定されます。

  • クエリがアラートを生成するように構成されていない場合、$risk_score は 15 に設定されます。

$risk_score の値は security_result.risk_score UDM フィールドに保存されます。

リスクスコアの結果変数

Google SecOps リスク分析は、検出とアラートを、その検出またはアラートに関連するエンティティに自動的に関連付けます。risk_score 結果変数を使用して、リスクの量を割り当てます。この値が設定されていない場合は、デフォルトの検出値またはアラート値が使用されます。デフォルト値は [設定] で構成できます。

プラットフォーム全体で一貫性を保つため、カスタム検出に risk_score を割り当てる際は、次のスコア範囲を使用することをおすすめします。この調整により、アラートの優先順位付けと対応ワークフローを標準化できます。

重大度 スコアの範囲 説明
アラート - 重大 90 - 100 単一のユーザー アカウントやエンドポイントを超えて影響を及ぼす可能性のある、アクティブな侵害。早急な審査が必要です。 ドメイン コントローラで Mimikatz が実行されました。
アラート - 高 80 - 89 単一のエンドポイントまたはエンティティの侵害が進行中である。すぐに審査を受ける必要があります。 本番環境のサーバーが最近確認された既知の C2 に呼び出しを行っている。
アラート - 中 50 - 79 調査が必要なセキュリティ上の問題の可能性がある。セキュリティ侵害は確認されていませんが、エスカレーションは可能です。 認証情報が漏洩しましたが、不正使用の兆候はありません。
アラートなし - 低 20 ~ 49 他の指標や観測と組み合わせると、より重大なインシデントにつながる可能性のある影響の少ないセキュリティ イベント。通常、レビューは必要ありません。複合ルールを使用して他の検出と組み合わせてアラートを作成できます。 内部ポート スキャン。
アラート以外のモニタリング 1 ~ 19 一般に、脅威の状況認識を構築することを目的とした情報ベースの検出。通常はレビューを必要としません。複合ルールを使用して他の検出と組み合わせてアラートを生成できます。 ログイン イベント。不正使用の兆候はありません。

risk_score は結果変数であるため、ルールでは脅威インテリジェンスやその他の同時条件などの要因に応じてニュアンスを表現できます。

エンティティ リスクスコアを使用して、リスクベースのアラートをほぼリアルタイムで生成できます。詳細については、リスク分析の概要をご覧ください。

結果変数のデータ型

結果変数のデータ型はそれぞれ異なり、計算に使用される式によって決まります。Google SecOps では、次の結果データ型がサポートされています。

  • integer
  • 浮動小数点数
  • 文字列
  • 整数のリスト
  • 浮動小数点数のリスト
  • 文字列のリスト

条件付きロジック

条件付きロジックを使用して、結果の値を計算できます。条件は、次の構文パターンを使用して指定します。

if(BOOL_CLAUSE, THEN_CLAUSE)
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)

条件式は、「BOOL_CLAUSE が true の場合は、THEN_CLAUSE を返し、それ以外の場合は ELSE_CLAUSE を返す」と読むことができます。

BOOL_CLAUSE は、ブール値に評価される必要があります。BOOL_CLAUSE 式は、events セクションの式と同様の形式を取ります。たとえば、次のものが含まれます。

  • 比較演算子を使用した UDM フィールド名:

    if($context.graph.entity.user.title = "Vendor", 100, 0)

  • events セクションで定義されたプレースホルダ変数:

    if($severity = "HIGH", 100, 0)

  • outcome セクションで定義された別の成果変数:

    if($risk_score > 20, "HIGH", "LOW")

  • ブール値を返す関数:

    if(re.regex($e.network.email.from, `.*altostrat.com`), 100, 0)

  • リファレンス リストからの検索:

    if($u.principal.hostname in %my_reference_list_name, 100, 0)

  • 集計の比較:

    if(count($login.metadata.event_timestamp.seconds) > 5, 100, 0)

THEN_CLAUSE と ELSE_CLAUSE は同じデータ型である必要があります。整数、浮動小数点数、文字列がサポートされています。

データ型が整数または浮動小数点数の場合は、ELSE_CLAUSE を省略できます。省略した場合、ELSE_CLAUSE は 0 と評価されます。次に例を示します。

`if($e.field = "a", 5)` is equivalent to `if($e.field = "a", 5, 0)`

データ型が文字列の場合、または THEN_CLAUSE がプレースホルダ変数または結果変数の場合は、ELSE_CLAUSE を指定する必要があります。

算術演算

数学演算を使用して、クエリの outcome セクションと events セクションで整数データ型または浮動小数点数データ型を計算できます。Google Security Operations は、計算の最上位の演算子として、加算、減算、乗算、除算、剰余をサポートしています。

次のスニペットは、outcome セクションの計算の一例です。

outcome:
  $risk_score = max(100 + if($severity = "HIGH", 10, 5) - if($severity = "LOW", 20, 0))

各オペランドと算術式全体が適切に集計されている限り、次のタイプのオペランドで算術演算が可能です(集計を参照)。

  • 数値イベント フィールド
  • events セクションで定義された数値プレースホルダ変数
  • outcome セクションで定義された数値の成果変数
  • 整数または浮動小数点数を返す関数
  • 整数または浮動小数点数を返す集計

浮動小数点数に剰余は使用できません。

結果のプレースホルダ変数

結果変数を計算するときに、クエリのイベント セクションで定義されたプレースホルダ変数を使用できます。この例では、ルールのイベント セクションで $email_sent_bytes が定義されていると仮定します。

例: 一致セクションのない単一イベント

// No match section, so this is a single-event query.

outcome:
  // Use placeholder directly as an outcome value.
  $my_outcome = $email_sent_bytes

  // Use placeholder in a conditional.
  $other_outcome = if($file_size > 1024, "SEVERE", "MODERATE")

condition:
  $e

例: マッチ セクションを含むマルチイベント

match:
  // This is a multi event query with a match section.
  $hostname over 5m

outcome:
  // Use placeholder directly in an aggregation function.
  $max_email_size = max($email_sent_bytes)

  // Use placeholder in a mathematical computation.
  $total_bytes_exfiltrated = sum(
    1024
    + $email_sent_bytes
    + $file_event.principal.file.size
  )

condition:
  $email_event and $file_event

結果割り当て式の結果変数

成果変数は、events セクションで定義されたプレースホルダ変数と同様に、他の成果変数を導出するために使用できます。別の結果変数の割り当てで結果変数を参照するには、$ トークンの後に変数名を指定します。結果変数は、クエリテキストで参照する前に定義する必要があります。割り当て式で使用する場合、結果変数は集計できません(集計を参照)。

次の例では、成果変数 $risk_score は成果変数 $event_count から値を取得します。

例: 別の結果変数から導出された結果変数

match:
  // This is a multi event query with a match section.
  $hostname over 5m

outcome:
  // Aggregates all timestamp on login events in the 5 minute match window.
  $event_count = count($login.metadata.event_timestamp.seconds)

  // $event_count cannot be aggregated again.
  $risk_score = if($event_count > 5, "SEVERE", "MODERATE")

  // This is the equivalent of the 2 outcomes combined.
  $risk_score2 = if(count($login.metadata.event_timestamp.seconds) > 5, "SEVERE", "MODERATE")

condition:
  $e

結果変数は、次の式を除き、結果割り当ての右辺にある任意のタイプの式で使用できます。

  • 集約
  • Arrays.length() 関数の呼び出し
  • any 修飾子または all 修飾子を使用する

集約

繰り返しイベント フィールドは非スカラー値です。つまり、1 つの変数が複数の値を指します。たとえば、イベント フィールド変数 $e.target.ip は繰り返しフィールドであり、IP 値を 0 個、1 個、または複数個持つことができます。これはスカラー以外の値です。一方、イベント フィールド変数 $e.principal.hostname は繰り返しフィールドではなく、値は 1 つ(スカラー値)のみです。

同様に、一致ウィンドウを含むクエリの outcome セクションで使用される繰り返しなしのイベント フィールドと繰り返しありのイベント フィールドは、どちらもスカラー値ではありません。

例: 一致セクションと繰り返し以外のフィールドを含むイベントをグループ化する

次のクエリは、`match` セクションを使用してイベントをグループ化し、`outcome` セクションで繰り返し以外のイベント フィールドを参照します。

rule OutcomeAndMatchWindow{
  ...
  match:
    $userid over 5m
  outcome:
    $hostnames = array($e.principal.hostname)
  ...
}

クエリが実行される 5 分間のウィンドウには、イベントが 1 つも含まれていない場合もあれば、1 つまたは複数のイベントが含まれている場合もあります。結果セクションは、一致ウィンドウ内のすべてのイベントに対して作用します。結果セクション内で参照されるイベント フィールド変数は、一致ウィンドウ内の各イベントのフィールドの 0 個、1 個、または複数の値を指すことができます。たとえば、5 分間の時間枠に 5 つの $e イベントが含まれている場合、結果セクションの $e.principal.hostname は 5 つの異なるホスト名を指します。このクエリの outcome セクションでは、イベント フィールド変数 $e.principal.hostname はスカラー以外の値として扱われます。

結果変数は常に単一のスカラー値を生成する必要があるため、結果の割り当てが依存するスカラー値以外の値はすべて、単一のスカラー値を生成するように集約する必要があります。結果セクションでは、次の値はスカラー値ではないため、集約する必要があります。

  • クエリで match セクションが使用されている場合、イベント フィールド(繰り返しまたは非繰り返し)
  • クエリで match セクションが使用されている場合のイベント プレースホルダ(繰り返しまたは非繰り返し)
  • クエリで match セクションが使用されていない場合の繰り返しイベント フィールド
  • クエリで match セクションが使用されていない場合にイベント プレースホルダが繰り返される

スカラー イベント フィールド、スカラー イベント プレースホルダ、定数は、match セクションを含まないクエリの集約関数でラップできます。ただし、ほとんどの場合、これらの集計ではラップされた値が返されるため、不要です。例外は array() 集約です。これを使用すると、スカラー値を配列に明示的に変換できます。

結果変数は集計のように扱われます。別の結果割り当てで参照する場合は、再集約しないでください。

次の集約関数を使用できます。

集計関数 説明
max() 可能性のあるすべての値の最大値を出力します。整数と浮動小数点数でのみ動作します。
min() 可能性のあるすべての値の最小値を出力します。整数と浮動小数点数でのみ動作します。
sum() 可能性のあるすべての値の和を出力します。整数と浮動小数点数でのみ動作します。
count_distinct() 可能性のあるすべての値を収集し、可能性のある値の一意の値の数を出力します。
count() `count_distinct()` のように動作しますが、可能性のある値の一意でない値の数を返します。
array_distinct() 可能性のあるすべての一意の値を収集し、これらの値のリストを出力します。Distinct 値のリストを 1,000 個のランダムな要素に切り詰めます。重複除去によって一意のリストが取得された後、切り捨てが適用されます。
array() array_distinct() と同様に動作しますが、一意でない値のリストを返します。また、値のリストを 1,000 個のランダムな要素に切り詰めます。

集約関数は、複数のイベントが存在することを指定する condition セクションがルールに含まれている場合に重要です。集約関数は、検出を生成したすべてのイベントに対して動作します。

例: 複数のイベントの条件

複数のイベントの条件の例を次に示します。結果と条件のセクションに次のものが含まれている場合:

outcome:
  $asset_id_count = count($event.principal.asset_id)
  $asset_id_distinct_count = count_distinct($event.principal.asset_id)

  $asset_id_list = array($event.principal.asset_id)
  $asset_id_distinct_list = array_distinct($event.principal.asset_id)

condition:
  #event > 1

`condition` セクションでは、検出ごとに複数の `event` が必要であるため、集約関数は複数のイベントで動作します。次のイベントで 1 つの検出が生成されたとします。

event:
  // UDM event 1
  asset_id="asset-a"

event:
  // UDM event 2
  asset_id="asset-b"

event:
  // UDM event 3
  asset_id="asset-b"

この場合、結果の値は次のようになります。

    $asset_id_count = 3
    $asset_id_distinct_count = 2
    $asset_id_list = `["asset-a", "asset-b", "asset-b"]
    $asset_id_distinct_list = `["asset-a", "asset-b"]

制限事項

  • outcome セクションでは、events セクションまたは outcome セクションでまだ定義されていない新しいプレースホルダ変数を参照することはできません。

  • outcome セクションでは、events セクションで定義されていないイベント変数を使用できません。

  • イベント フィールドが属するイベント変数が events セクションですでに定義されている場合、outcome セクションでは、events セクションで使用されていないイベント フィールドを使用できます。

  • outcome セクションでは、events セクションですでに関連付けられているイベント変数のみを関連付けることができます。相関関係は、異なるイベント変数の 2 つのイベント フィールドが等しい場合に発生します。

outcome セクションの例については、YARA-L 2.0 の概要をご覧ください。

outcome セクションの検出の重複除去の詳細については、コンテキスト アウェア分析の作成をご覧ください。

次のステップ

その他の情報

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