SPL から YARA-L 2.0 への移行

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

このガイドは、Splunk Search Processing Language(SPL)に精通しているユーザーを対象としています。このドキュメントでは、Google Security Operations 内で検索、ダッシュボード、検出ルールを構築するためのコア言語である YARA-L 2.0 について簡単に説明します。

YARA-L 2.0 の構造を理解する

YARA-L 2.0 は、Google SecOps 全体で使用される統合クエリ言語です。強力な脅威検索、リアルタイム ダッシュボードの構築、取り込まれたすべてのエンタープライズ ログデータに対する高忠実度の検出ルールの作成に使用されます。

この言語は Google SecOps Detection Engine と組み合わせて動作し、大量のデータ全体で脅威などのイベントを検索できます。

SPL と YARA-L の基本的な構造の違い

SPL はパイプ(|)文字で連結された一連のコマンドを使用しますが、YARA-L はセクション ベースです。eventsoutcomecondition などの個別のセクションを使用してクエリを定義し、検索、検出、可視化するパターンを記述します。

次の表は、SPL と YARA-L の基本構造を比較したものです。

ファンクション SPL(手続き型) YARA-L(宣言型)
基本コンセプト コマンドのパイプラインを使用して、データ ストリームを段階的に変換します。 条件と変換のマルチパート構造をセキュリティ データと運用データのストリームに適用して分析し、脅威を特定して貴重な分析情報を抽出します。
データフロー 手続き型。1 つのコマンドの結果が、次のコマンドの入力としてパイプされます。 大規模なパターンを最適に処理して関連付けるための宣言型構造。効率性を考慮する必要がなくなる。
イベント相関 jointransactionstats などの明示的なコマンドに依存します。 複数のイベントを定義し、クエリのロジック内の共通フィールドに基づいてイベントを関連付けることで、組み込みの相関関係を作成できます。
時間ウィンドウ処理 静的な検索ウィンドウ(last 60m など)として処理されます。新しい検索はそれぞれ新しいリクエストです。 クエリ内で定義された連続的なスライディング ウィンドウとして処理されます(例: over 5m)。
構文 コマンド駆動型(index=web など)。 簡潔で論理的な(例: metadata.event_type= "USER_LOGIN")。

クエリの具体的な構造

YARA-L では、クエリに特定の構造が適用されます。これは、SPL の順次パイプ処理コマンドとは異なります。SPL はコマンドをチェーンして結果を構築しますが、YARA-L はクエリのさまざまな側面を個別のセクションで定義します。

コマンド 操作 必須 | 省略可
meta 作成者、説明、重大度など、ルールの説明的なメタデータを設定します。 ルールでのみ必須です。
events イベントを定義してフィルタします。 必須(クエリのコアロジック)。
match イベントでグループ化し、時間枠(by 5m など)を指定できます。 省略可。マルチイベント相関クエリでのみ必須です。
outcome 主な指標を計算して分析情報を取得します。 省略可。
condition クエリ変数の条件を評価して、結果が適用されるかどうかを判断します(例: #event >5)。 ルールでのみ必須です。検索とダッシュボードでは省略可能です。
dedup キー変数(target.user.useridtarget.ip>principal.hostname など)に基づいてイベントをグループ化し、重複するイベントを削除します。 省略可。
order 特定のフィールド(asc など)で定義された収集イベントの結果を並べ替えます。 省略可。
limit クエリから返されるイベントの最大数を制限します。 省略可。

SPL と YARA-L の一般的なコマンド

YARA-L のセクション構造では、SP にある同じ共通コマンドを使用できます。このセクションでは、類似点と相違点について説明します。

SPL search コマンド = YARA-L events セクション

SPL の search コマンドは、YARA-L の events セクションに相当します。events セクションでは、イベントと、その初期フィルタリング方法を定義します。他のセクション(matchoutcome など)は省略可能ですが、events セクションはすべてのルールに不可欠です。

次に例を示します。

metadata.event_type = "USER_LOGIN"

または

principal.hostname != "" AND metadata.event_type = "NETWORK_CONNECTION"

ルール(および高度なクエリ)の events セクションでは、イベント変数を使用してロジックを簡素化します。

イベント変数は、特定の条件に一致する特定のイベントまたはイベントのグループを表すフィルタの論理グループとして機能します。

たとえば、$e などのイベント変数を定義するには、クエリの events セクションで、関連するすべてのイベントとフィルタの接頭辞として使用します。この変数をクエリの他のセクション(matchoutcome など)で使用して、特定のイベント グループとそのデータ フィールドを参照できます。

イベント変数の最も一般的な用途は、検出ルール内です。次の例は、ルールでイベント変数($e)を使用してイベントをグループ化し、1 日以内にユーザーがログインに失敗した回数を調べる方法を示しています。ルールは、定義されたしきい値を超えるとトリガーされます。

ルール例では、各イベントはイベント変数($e)で定義されています。$e 変数は metadata.id でも参照され、ルール メタデータを定義されたイベントにリンクします。

rule DailyFailedLoginAttempts {
 meta:
   author = "Alex"
   description = "Detects a high number of failed login attempts for a single user within a day."

events:
   // Alias for each event
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $e.principal.user.userid != ""
   $userid = $e.principal.user.userid

match:
   // Group events by principal.user.userid within a 24-hour window
   $userid over 1d

outcome:
   // Count the number of unique event IDs for each user per day
   $daily_failed_login_count = count($e.metadata.id)

condition:
   // Trigger a detection if the daily failed login count exceeds a threshold
   // You should adjust this threshold based on your environment's baseline.
   #e > 0
}

ルールがトリガーされることを確認するには、グループ化されたイベントの数をチェックする必要があります。condition セクションで、イベント変数を使用して最小数を指定できます。たとえば、条件(#e > 0)は、条件に一致するイベントが少なくとも 1 つ存在することを確認します。

SPL eval コマンド = YARA-L outcome セクション

eval コマンドは、検索結果のフィールド値を操作および定義するために使用される基本的な SPL 関数です。

  • 目的: 新しいフィールド値を計算して定義します。
  • 機能: 数式、文字列式、ブール式を評価します。
  • 結果: 評価の結果、新しいフィールドが作成されるか、既存のフィールドの値が上書きされます。
  • 連結: 複数の式をカンマ(| eval A=1, B=A+1 など)で連結できます。
  • 順次処理: チェーン内の式は順次処理されるため、後の計算で、前の式で作成または変更されたフィールドを参照して構築できます。

次の表(およびその後の表)の例で、このコマンド構造について説明します。

ファンクション 説明 YARA-L の例
ブール演算子 eventscondition で使用されます。条件セクションで or を使用するをご覧ください。

metadata.log_type != "" or
metadata.event_type = "NETWORK_DNS"
      
計算フィールド outcome セクションで使用されます。

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = cast.as_int(network.sent_bytes)
  
動的フィールド名の作成 outcome セクションで使用されます。 SPL と YARA-L を比較するの例をご覧ください。

例: 計算結果を含む新しいフィールドを作成する

YARA-L を使用して、各イベントに新しいフィールド bytes を作成します。送信された bytes フィールドの値と受信された bytes フィールドの値を足して、バイト数を計算します。

 metadata.event_type = "SCAN_NETWORK"
 principal.hostname != ""
 $host = principal.hostname

match:
   $host

outcome:
   $bytes = cast.as_int(sum(network.sent_bytes))

例: 2 つのフィールドの値を連結する

ピリオド(.)文字を使用して、first_name フィールドの値と last_name フィールドの値を連結します。引用符("")を使用して、2 つのフィールドの間にスペース文字を挿入します。連結すると、実際の値に関係なく、値は文字列として読み取られます。

SPL では、クエリは次のようになります。

| eval full_name = first_name+" "+last_name

YARA-L では、検索クエリは次のようになります。

principal.user.first_name = $first_name
principal.user.last_name = $last_name

outcome:
  $full_name = strings.concat(principal.user.first_name = $first_name
  principal.user.last_name = $last_name

outcome:
   $full_name = strings.concat($first_name, " ", $last_name))

ログイン失敗のクエリの例を使用して、次の例では、10 分以内(10m)に 5 回以上ログインに失敗したユーザーを検索します(イベント変数とプレースホルダ変数の両方を使用)。

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

match:
  $userid by 10m

outcome:
   $login_count= count(metadata.id)

condition:
   $login_count > 5

SPL where コマンド = YARA-L condition セクション

SPL の where コマンドは、YARA-L の eventsoutcomecondition セクションの組み合わせに相当します。events セクションを使用して、イベントを宣言し、それらの特定の属性(priniciapal.hostname = "xyz" など)を指定できます。イベントを宣言したら、ブール演算子、比較演算子、集計関数結果(outcome セクションから)を使用して、クエリが結果を返すためにイベントが満たす必要があるパラメータを定義できます。

次の例は、集計されたカウントにしきい値条件を設定する方法を示しています。このクエリは、ユーザー ID ごとにログイン失敗イベントの合計数をカウントするように構成されています。また、condition セクションを使用して、ログイン失敗が 5 回以上記録されたユーザーの結果のみを出力します。

metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"

match:
  target.user.userid

outcome:
  // metadata.id counts all unique events associated with failed logins.
  $count = count(metadata.id)
  //metadata.id counts all unique events associated with blocked logins.

condition:
  $count > 5

SPL dedup コマンド = YARA-L dedup セクション

SPL dedup コマンドは、YARA-L の dedup セクションと同じです。dedup セクションを使用して、events セクションのイベントで指定された重複する結果を重複除去します。

次に例を示します。

principal.hostname = "foo"

dedup:
   target.ip

SPL stats コマンド = YARA-L match セクションまたは outcome セクション(または両方)

SPL では、通常、集計は stats ファミリーのコマンドによって処理されます。このコマンドでは、集計タイプ(countdistinct countmaxmin など)と "group by" フィールドを指定します。

YARA-L では、match セクションと outcome セクションが連携してこの機能を提供します。

  • 集計ロジック: match セクションでは、考慮するイベントのグループ(match: $grouping_field by time)を定義して集計を作成します。outcome セクションでは、そのグループに対して計算する特定の集計関数(count()min()max() など)を定義します。

  • 時間ウィンドウ処理: match セクションでは、イベントをグループ化する時間ウィンドウを指定できます。over キーワード(ルールの場合)または by(検索とダッシュボードの場合)を使用します(例: match: $userid by 1h)。この機能は、"timechart""streamstats""eventstats" などの SPL に似ています。詳細については、時間枠をご覧ください。

例: プリンシパル ホスト名とターゲット IP でグループ化されたバイト数の合計を計算する

次の例では、match セクションを使用して、1 日の期間にわたってプリンシパル ホスト名と宛先 IP アドレスに基づいて集計グループを定義します。送信されたバイト数の合計は、outcome セクション内で計算されます。

metadata.event_type = "NETWORK_CONNECTION"
network.sent_bytes > 0
principal.hostname != ""
target.ip != ""

// Define placeholder variables for grouping
$principal_hostname = principal.hostname
$target_ip = target.ip

// Group events by principal hostname, target IP, and day
match:
  $principal_hostname, $target_ip by day

// Calculate the sum of sent bytes for each group
outcome:
  $daily_bytes_sent = sum(network.sent_bytes)

SPL を YARA-L にマッピングする

SPL はパイプ処理されたコマンドを介してデータをステップごとに処理しますが、YARA-L は宣言型のセクションベースの構造を使用してパターンとアクションを定義します。アプローチにはこのような根本的な違いがありますが、YARA-L の表現力により、基本的なフィルタリングから複雑な集計や相関関係まで、SPL で慣れている多くのタスクを実行できます。

このセクションでは、一般的な SPL の機能を YARA-L フレームワーク内の同等の機能にマッピングすることで、違いを説明します。

SPL と YARA-L を比較する

次の表は、一般的な SPL 言語の関数とコンセプトと、YARA-L 2.0 の同等の関数、または YARA-L クエリ構造内でコンセプトがどのように処理されるかを比較したものです。

SPL コマンドまたはコンセプト 目的 YARA-L の同等の制約 説明と YARA-L マッピング YARA-L の実装例
search 初期データのフィルタリング events セクション イベント フィールドと条件を定義します。検索やダッシュボードに events: 接頭辞は必要ありません。をご覧ください。

events:
  metadata.event_type = "USER_LOGIN"
  security_result.action = "FAIL"

        
where 結果のフィルタリング events セクションと condition セクション 多くの場合、集計された結果にブール論理を適用します。をご覧ください。

events:
  metadata.event_type = "USER_LOGIN"
  security_result.action = "FAIL"

outcome:
  $failed_count = count(metadata.id)

condition:
  $failed_count > 5
        
eval 既存のフィールド、集計、データルックアップから新しい値を計算します。 outcome 部または events SPL eval の例をご覧ください。

metadata.event_type = "USER_LOGIN"

outcome:
  $login_count = count(metadata.id)
        
stats 集計(countsum、avg) match または outcome match のフィールドでグループ化します。outcome で集計を計算します。集計と統計クエリSPL stats コマンドの例をご覧ください。

metadata.event_type = "USER_LOGIN"

outcome:
  $login_count = count(metadata.id)
        
dedup 1 つ以上のフィールドに基づいて重複するイベントを削除します dedup セクション 重複除去するフィールドを指定します。

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

dedup:
  $user
        
table テーブル列の出力を定義する select または unselect ダッシュボードで使用されます。検索で outcome 変数を表示します。

metadata.event_type = "USER_LOGIN"

select:
  principal.hostname
        
sort 結果を昇順または降順で表示する order セクション 次の表のセルに例を示します。
metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""

outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = uint64(network.sent_bytes)

order:
  $bytes desc
limit 返される結果の数を制限します limit セクション 次のセルの例をご覧ください。

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""

outcome:
  $id = metadata.id
  $host = principal.hostname
  $bytes = cast.as_int(network.sent_bytes)

order:
  $bytes desc

limit:
  3
  
複数値関数 mv* 関数(mvexpandmvfilter)で処理 組み込みサポート YARA-L は、イベント セクションの配列を自動的にネスト解除します。必要に応じて、outcome
配列関数を使用できます。
複数値関数の例をご覧ください。
時間ウィンドウ処理 earliest=-5m, latest=now match セクション、overby 継続的検出の場合は、match: $field over 5m or by 5m を使用します。検索 UI のダッシュボードの場合は、match: $field by 5m を使用します。 時間枠の例をご覧ください。

集計クエリと統計クエリ

YARA-L では、通常、集計関数と統計関数は outcome セクションに配置され、集計は match セクションで行われます。

stats コマンドは、YARA-L クエリ内でデータ集計を実装するための主なメカニズムです。生イベントデータを要約されたセキュリティ指標に変換します。eval コマンドは フィールド レベルの行ごとの変換SELECT 式と同様)を処理しますが、statsセットレベルの集計(SQL の GROUP BY と同様)を実行します。

次の表に、コア構文と使用方法を示します。この表は、統計情報を効果的に使用して、データパターンと統計的な外れ値に基づいて高度なセキュリティ ロジックを実装する方法を示しています。

SPL 関数 説明 YARA-L の同等の制約 YARA-L の実装例
count イベントの数をカウントします。 count()

metadata.event_type= "USER_LOGIN"
security_result.action= "FAIL"

outcome:
  $event_count = count(metadata.id)

condition:
  $event_count > 2
  
dc (count_distinct) フィールドの一意の値の数をカウントします。 count_distinct()

metadata.event_type = "USER_LOGIN"

outcome:
  $unique_users=count_distinct(principal.user.userid)
  
sum フィールドの値の合計を計算します。
sum()

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host

outcome:
  $bytes = sum(network.sent_bytes)
  
avg フィールドの平均値を計算します。
avg()

$host = principal.hostname

match:
  $host by day

outcome:
  $avg_bytes_sent = avg(network.sent_bytes)
  
min/max フィールドの最小値または最大値を検索します。 min() または max()

metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host

outcome:
  $bytes = max(network.sent_bytes)- min(network.sent_bytes)
  
median() 中央値を求めます。 window.median

target.file.mime_type = "PDF"

outcome:
  $median_file_size = window.median(target.file.size, false)
  
first() and last() 検索結果のイベントの順序に基づいて値を返します。 window.first/window.last

metadata.event_type = "NETWORK_CONNECTION"
principal.ip != ""

match:
  principal.ip

outcome:
  $event_count = count(metadata.id)
  $first_seen = window.first(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  $last_seen = window.last(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  
STDDEV() データセットのばらつきを測定する標準偏差を計算します。 window.stddv

principal.hostname= $host

match:
  $host over 5m

outcome:
  $stddev = window.stddev(network.sent_bytes)

詳細については、追加機能をご覧ください。

たとえば、多段階クエリでは、階層化された集計で複数のログイン失敗を追跡できます。詳細については、マルチステージ集計の例YARA-L でマルチステージ クエリを作成するをご覧ください。

マルチステージ集計(時間単位から週単位の平均)

このマルチステージの例では、最初にデータを集計して、ホストごとに 1 時間あたりに転送されたバイト数を調べます。次に、この集計を使用して、過去 7 日間の時間帯ごとのバケットの全体的な平均を計算します。

stage bytes_per_host {
metadata.event_type = "SCAN_NETWORK"
principal.hostname != ""
$host = principal.hostname

match:
  $host by hour

outcome:
  $bytes = cast.as_int(sum(network.sent_bytes))
}

$host = $bytes_per_host.host

match:
  $host

outcome:
  $hour_buckets = array_distinct(timestamp.get_timestamp($bytes_per_host.window_start))
  $num_hour_buckets = count_distinct($bytes_per_host.window_start)
  $avg_hourly_bytes = avg($bytes_per_host.bytes)

複数値関数(配列の読み取り)

YARA-L の構文は、フィールドに複数の値があることを理解するように構築されています。events セクションに複数値フィールドを含むイベントを含むクエリを記述すると、言語は配列内のすべての値を自動的にチェックします。配列をフィルタリングするために特別な関数を使用する必要はありません。一致させる条件を指定するだけです。たとえば、ログイベントの principal.ip フィールドに次の内容が含まれている場合、YARA-L エンジンは principal.ip 配列内のすべての値を自動的にチェックします。値のいずれかが "10.1.1.5" の場合、条件が満たされます。

["10.1.1.5", "10.2.2.6", "10.3.3.7"]

次の表は、ログデータ内の複数値フィールドの管理方法に関する YARA-L と SPL の比較を示しています。IP アドレスの配列やユーザー グループのリストなどの複数値フィールドは、構造化ログの一般的な機能です。

SPL 関数 目的 YARA-L の同等の制約 YARA-L の実装例
mvfilter() 複数値フィールドをフィルタして、一致する値のみを保持します。 YARA-L クエリの events セクションで使用する場合は、一致させるフィールドを一覧表示します。YARA-L は、groups 配列内の値が「`admin`」と一致するかどうかを自動的にチェックします。

principal.user.group_identifiers = "admin"
        
mvcount() 複数値フィールドの値の数をカウントします。 outcome クエリ セクションのフィールドに適用される count()。値を最初にネスト解除する必要はありません。 IT スタッフ グループに属するユーザーの数をカウントするの例をご覧ください。
mvexpand 複数値フィールドの値ごとに新しいイベントを作成します。 複数値フィールドをネイティブかつ暗黙的に処理します。ネスト解除は自動的に行われます。 IT スタッフ グループに属するユーザーの数をカウントするの例をご覧ください。
mvjoin データ形式設定のために、複数値フィールドのすべての値を 1 つの文字列に結合します。 値は結果に配列として自動的に保存されます。YARA-L の出力は構造化されており、フラットな文字列ではありません。配列の操作がさらに必要な場合は、フィールドが配列として表示されます。詳細については、配列関数をご覧ください。

例: admin ログインの数をカウントする

次の例では、条件 $metadata.event_type = "USER_LOGIN" は event_type が "USER_LOGIN" のイベントをフィルタリングします。

events:
 metadata.event_type = "USER_LOGIN" // Changed to a more appropriate event type for login
 principal.user.group_identifiers = "admin"

outcome:
 // This counts each unique event ID where the principal user is in the `"admin"` group.
 $admin_login_count = count(metadata.id)

$principal.user.group_identifiers= "admin" フィールドは繰り返しフィールド(配列)です。

  • 暗黙的なネスト解除: YARA-L は、クエリ評価時にこのフィールドを内部的に自動的にネスト解除します。
  • 条件チェック: $principal.user.group_identifiers 配列内のいずれかの値が "admin" と等しい場合、イベントは条件を満たします。
  • 明示的なコマンドは不要: SPL とは異なり、mvexpand などの特定のネスト解除コマンドは必要ありません。

集計への影響(outcome)セクションは、暗黙的なネスト解除が outcome セクション(outcome: $admin_login_count = count(metadata.id)) など)で重要であることを意味します。次の影響にご注意ください。

  • 繰り返しフィールドに複数の一致する値を含む単一の UDM イベントは、クエリ評価のために複数の内部を生成できます。
  • events セクションでは、$principal.user.group_identifiers の一致する値に基づいてイベントがすでに効果的にネスト解除されているため、count(metadata.id) 集計では、これらのネスト解除されたインスタンスがそれぞれカウントされます。

例: IT スタッフ グループに属するユーザーの数をカウントする

SPL:

index=<your_index_name> user_id="jsmith" 
| where match(memberOf, "Domain Admins|IT Staff|HR") 
| mvexpand memberOf 
| stats count by memberOf 
| mvexpand actions 
| table memberOf, count, actions

YARA-L(検索):

 principal.user.userid = "jsmith"
 additional.fields["memberOf"] = $group
   $group = /Domain Admins|IT Staff|HR/ nocase
 
 match:
   $group by 1h
 
 outcome:
   $group_count = count_distinct(metadata.id)
   $memberOf = array_distinct($group)
   $risk_score = max(50)

例: 特定のファイル ハッシュが存在する場合にアラートを生成するルールを作成する

SPL:

| eval file_hashes="hash12345,hash67890,hashABCDE" 
| makemv delim="," file_hashes 
| mvexpand file_hashes 
| search file_hashes="hash67890" 
| table _time, file_hashes

YARA-L(ルール):

    rule specific_file_hash_detected {
    
    meta:
      rule_name = "Specific File Hash Detected"
      description = "Detects events where a specific file hash is present."
      severity = "Medium"
    
    events:
      $e.target.file.sha256 == "hash67890"
    
    outcome:
      $time = array_distinct($e.metadata.event_timestamp)
      $file_hashes = array_distinct($e.target.file.sha256)
    
    condition:
      $e
    }

時間ウィンドウ処理

YARA-L では、時間ウィンドウ処理は、特定のローリング期間にわたってイベントを関連付ける方法です。ルールで使用すると、このウィンドウは受信データとともに継続的に移動し、時間の経過とともに展開されるパターンの継続的なリアルタイム検出を提供します。

このプロセスは自動検出の設計における重要な要素であり、YARA-L を使用するメリットの 1 つです。時間枠を指定すると、検出とダッシュボードはリアルタイム データで継続的に動作します。

機能 SPL YARA-L
最終目標 静的検索、アドホック分析 継続的な検出、自動相関
主な機能 earliest, latest, span, transaction overby
5 分間の例 earliest=-5m(静的検索)
または
transaction maxspan=5m
match:
[event] over 5m(ルールでの継続的検出)
または
[event] by 5m(検索とダッシュボード)

このセクションの例では、YARA-L のタンブリング時間枠by を使用)とスライド時間枠over を使用)の違いを示します。

タンブリング ウィンドウ(by <time_unit>

  • コンセプト: YARA-L 検索で使用されます。タンブリング ウィンドウは、固定された重なり合わない固定サイズの時間間隔を作成します。システムは、タイムスタンプに基づいて各イベントを 1 つの特定の時間バケットに割り当てることで、各イベントを処理します。これらの固定間隔は絶対値であり、日、時間、分などの標準的な時間マーカーに厳密に沿っています。

  • 使用状況: Google SecOps の検索クエリとダッシュボードで、データを個別の時間セグメントに集計するために一般的に使用されます。

例: ユーザーごとの 1 日あたりのログイン成功回数

この検索クエリは、各カレンダー日のユニーク ユーザーごとにログイン成功イベントをグループ化します。次の例は、YARA-L 検索タンブリング ウィンドウ(by day)を示しています。

events:
  //Filter for successful login events
  metadata.event_type = "USER_LOGIN"
  principal.user.userid != ""

match:
  //Group by each unique user ID, aggregated over a calendar day.
  principal.user.userid by day

outcome:
  //Count how many successful logins occurred for this user on this specific day.
  $daily_success_count = count(metadata.id)
  
  //Get the timestamp of the FIRST event within this daily group.
  $first_event_time = window.first(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))
  
  //Get the timestamp of the LAST event within this daily group.
  $last_event_time = window.last(metadata.event_timestamp.seconds, timestamp.get_timestamp(metadata.event_timestamp.seconds))

仕組み: ユーザー jdoeNov 17 で 10 回、Nov 18 で 15 回ログインに成功した場合、このクエリは jdoe に対して 2 つの別々の行を生成します。1 つは 1 日ごとに、それぞれのカウントが示されます。Nov 17 バケットには、2025-11-17 00:00:00 to 23:59:59 UTC のイベントが含まれます。

スライディング タイム ウィンドウ(over <duration>

  • コンセプト: YARA-L ルールで使用されるスライディング ウィンドウは、指定された期間の移動する時間枠であり、重複する可能性があります。これらは、互いに近い場所で発生したイベントを関連付ける場合に最適です。

  • 使用方法: 主に YARA-L ルールで使用され、継続的な期間内のイベントのパターンやシーケンスを検出します。

例: 5 分以内に複数のログイン失敗を検出する

この YARA-L ルールの例では、単一のユーザーがローリング 5-minute 期間内に 5 failed logins 回を超える試行を行った場合に検出を生成します。

rule TooManyFailedLogins_SlidingWindow {
 meta:
   author = "Alex"
   description = "Detects when a user has more than 5 failed logins within a 5-minute sliding window."
   severity = "Medium"

events:
   // Define an event variable $e for failed login attempts
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $e.principal.user.userid != ""
   $userid = $e.principal.user.userid

match:
   // Group events by userid over a continuous 5-minute sliding window.
   // Any events for the same $userid within 5 minutes of each other are grouped.
   $userid over 5m

outcome:
   // Count the number of failed login events within each 5-minute window for the grouped userid.
   $failed_count = count($e.metadata.id)

condition:
   // Trigger a detection if the count of failed logins in ANY 5-minute window is greater than 5.
   #e > 5
}

仕組み: システムはログインの失敗を継続的にモニタリングします。任意の時点で、各ユーザーの過去 5 分間のイベントが考慮されます。たとえば、10:02:3010:07:30 の間にユーザー jdoe が 6 回ログインに失敗すると、検出がトリガーされます。このウィンドウは常に前方にスライドするため、カレンダーの境界に関係なく、リアルタイムのパターン検出が行われます。

次のステップ

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