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 はセクションベースです。events、outcome、condition などの個別のセクションを使用してクエリを定義し、検索、検出、可視化するパターンを記述します。
次の表に、SPL と YARA-L の基本構造の比較を示します。
| ファンクション | SPL(手続き型) | YARA-L(宣言型) |
|---|---|---|
| 基本コンセプト | コマンドのパイプラインを使用して、データ ストリームを段階的に変換します。 | 条件と変換のマルチパート構造をセキュリティ データと運用データのストリームに適用して分析し、脅威を特定して貴重な分析情報を抽出します。 |
| データフロー | 手順に関する記事。1 つのコマンドの結果が、次のコマンドの入力としてパイプされます。 | 大規模なパターンを最適に処理して相関付ける宣言型構造。効率性について考える必要がなくなる。 |
| イベント相関 | join、transaction、stats などの明示的なコマンドに依存します。 |
複数のイベントを定義し、クエリのロジック内の共通フィールドに基づいてそれらを関連付けることで、組み込みます。 |
| 時間ウィンドウ処理 | 静的検索ウィンドウ(last
60m など)として処理されます。新しい検索はそれぞれ新しいリクエストです。 |
クエリ内で定義された連続するスライディング ウィンドウ(over 5m など)として処理されます。 |
| 構文 | コマンド駆動型(index=web など)。 |
簡潔で論理的な(例: metadata.event_type=
"USER_LOGIN")。 |
クエリの特定の構造
YARA-L では、クエリに特定の構造が適用されます。これは、SPL の順次パイプ(|)コマンドとは異なります。SPL はコマンドをチェーンして結果を生成しますが、YARA-L はクエリのさまざまな側面を個別のセクションで定義します。
すべての YARA-L クエリまたはルールは、クエリの動作を決定する個別の名前付きセクションに分割されます。この構造により、多段階の分析と関連付けが可能になります。
| コマンド | アクション | 省略可 | 必須 |
|---|---|---|
meta |
ルールに関する説明的なメタデータ(作成者、説明、重要度など)を設定します。 | 検索とダッシュボードでは省略可能です。ルールの場合のみ必須です。 |
events |
イベントを定義してフィルタします。考慮するすべてのデータソース(主に UDM イベント)を宣言し、UDM フィールドを使用してフィルタします。[`events` セクションの構文](/chronicle/docs/yara-l/events-syntax) をご覧ください。 | 検索、ダッシュボード、ルールに必須(クエリのコアロジック)。 |
match |
イベントでグループ化し、サポートされている時間枠(by 5m など)を指定できます。[`match` セクションの構文](https://docs.cloud.google.com/chronicle/docs/yara-l/match-syntax) をご覧ください。 |
集計が行われる統計検索では省略可能です。マルチイベント相関クエリでのみ必須です。ルールには時間指定が必要ですが、検索とダッシュボードでは省略可能です。 |
outcome |
重要な指標を計算し、分析情報を取得します(count()、avg() など)。[`outcome` セクションの構文](/chronicle/docs/yara-l/outcome-syntax) をご覧ください。 |
省略可。 |
condition |
結果を返す(検索の場合)か、アラートをトリガーする(ルールの場合)ために満たす必要のあるロジックを定義します。クエリ変数条件を評価して、結果が適用されるかどうかを判断します(例: event > 5)。[`condition` セクションの構文](/chronicle/docs/yara-l/condition-syntax) をご覧ください。 |
検索とダッシュボードでは省略可能です。ルールの場合のみ必須です。 |
dedup |
重要な変数(target.user.userid、target.ip、principal.hostname など)に基づいてイベントをグループ化し、重複するイベントを削除します。[検索とダッシュボードで重複除去を使用する](/chronicle/docs/investigation/deduplication-yaral)方法の詳細をご覧ください。 |
省略可。ルールでは使用できません。 |
order |
特定のフィールド(asc など)で定義された収集イベントの結果を並べ替えます。 |
省略可(match が使用されている場合にのみ適用されます)。ルールではご利用いただけません。 |
limit |
クエリから返されるイベントの最大数を制限します。 | 省略可(一致が使用されている場合にのみ適用されます)。ルールではご利用いただけません。 |
select |
クエリ結果に含める UDM フィールドのリストを指定します。 | 省略可。ルールではご利用いただけません。 |
unselect |
クエリ結果から除外する UDM フィールドのリストを指定します。 | 省略可。ルールでは使用できません。 |
SPL と YARA-L の一般的なコマンド
YARA-L セクション構造では、SPL にある同じ共通コマンドを使用できます。このセクションでは、類似点と相違点について説明します。
SPL search コマンド = YARA-L events セクション
SPL の search コマンドは、YARA-L の events セクションに相当します。events セクションでは、イベントと、その初期フィルタリング方法を定義します。他のセクション(match や outcome など)は省略可能ですが、events セクションはすべてのルールに不可欠です。
次に例を示します。
metadata.event_type = "USER_LOGIN"
または
principal.hostname != "" AND metadata.event_type = "NETWORK_CONNECTION"
ルール(および高度なクエリ)の events セクションでは、イベント変数を使用してロジックを簡素化します。
イベント変数は、特定の条件に一致する特定のイベントまたはイベントのグループを表すフィルタの論理グループとして機能します。
たとえば、$e などのイベント変数を定義するには、クエリの events セクションで、関連するすべてのイベントとフィルタの接頭辞として使用します。この変数をクエリの他のセクション(match や outcome など)で使用して、特定のイベント グループとそのデータ フィールドを参照できます。
イベント変数の最も一般的な用途は、検出ルール内です。次の例は、ルールでイベント変数($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 の例 |
|---|---|---|
| ブール演算子 | events と condition で使用されます。条件セクションで or を使用するをご覧ください。 |
|
| 計算フィールド | outcome セクションで使用されます。 |
|
| 動的フィールド名の作成 | 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($first_name, " ", $last_name)
ログイン失敗のクエリの例を使用して、次の例では、10 分(10m)以内に 5 回(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 の events、outcome、condition セクションの組み合わせと同等です。events セクションを使用して、イベントを宣言し、それらの特定の属性(principal.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 コマンド ファミリーによって処理されます。このコマンド ファミリーは、集計タイプ(count、distinct count、max、min など)と "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: 接頭辞は必要ありません。例をご覧ください。 |
|
where |
結果のフィルタリング | events セクションと condition セクション |
多くの場合、集計された結果にブール論理を適用します。例をご覧ください。 |
|
eval |
既存のフィールド、集計、データルックアップから新しい値を計算します | outcome または events セクション |
例をご覧ください。 |
|
stats |
集計(count、sum、平均) |
match または outcome |
match のフィールドでグループ化します。outcome で集計を計算します。集計の例と SPL コマンドの例をご覧ください。 |
|
dedup |
1 つ以上のフィールドに基づいて重複するイベントを削除します | dedup セクション |
重複除去するフィールドを指定します。 |
|
table |
テーブル列の出力を定義します。 | select または unselect |
ダッシュボードで使用されます。検索で outcome 変数を表示します。 |
|
sort |
結果を昇順または降順でリスト表示する | order セクション |
隣のセルの例をご覧ください。 |
|
limit |
返される結果の数を制限します | limit セクション |
隣のセルの例をご覧ください。 |
|
| 複数値関数 | mv* 関数(mvexpand、mvfilter)で処理 |
組み込みサポート | YARA-L は、イベント セクションの配列を自動的にネスト解除します。必要に応じて、outcome で 配列関数を使用できます。 |
複数値関数の例をご覧ください。 |
| 時間ウィンドウ処理 | earliest=-5m, latest=now |
match セクション、over、by |
継続的検出には 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() |
|
dc (count_distinct) |
フィールドの一意の値の数をカウントします。 | count_distinct() |
|
sum |
フィールドの値の合計を計算します。 | sum() |
|
avg |
フィールドの平均値を計算します。 | avg() |
|
min/max |
フィールドの最小値または最大値を検索します。 | min() または max() |
|
median() |
中央値を求めます。 | window.median |
|
first() and last() |
検索結果のイベントの順序に基づいて値を返します。 | window.first/window.last |
|
STDDEV() |
データセットの分散を測定する標準偏差を計算します。 | window.stddev |
|
詳細については、追加機能をご覧ください。
たとえば、多段階クエリでは、階層化された集計全体で複数のログイン失敗を追跡できます。詳細については、多段階集計の例と 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"` と一致するかどうかを自動的に確認します。 |
|
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などの特定の unnesting コマンドは必要ありません。
集計(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.seconds)
$file_hashes = array_distinct($e.target.file.sha256)
condition:
$e
}
時間ウィンドウ処理
YARA-L では、時間枠は、特定のローリング期間にわたってイベントを関連付ける方法です。ルールで使用される場合、このウィンドウは受信データとともに継続的に移動し、時間の経過とともに展開されるパターンを継続的にリアルタイムで検出します。
このプロセスは自動検出の設計における重要な要素であり、YARA-L を使用するメリットの 1 つです。時間枠を指定すると、検出とダッシュボードはリアルタイム データで継続的に動作します。
| 機能 | SPL | YARA-L |
|---|---|---|
| 最終目標 | 静的検索、アドホック分析 | 継続的な検出、自動相関 |
| 主な機能 |
earliest, latest, span, transaction
|
over、by |
| 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))
仕組み: ユーザー jdoe が Nov 17 に 10 回、Nov 18 に 15 回ログインに成功した場合、このクエリは jdoe に対して 2 つの行を生成します。1 つは各日の行で、それぞれのカウントが表示されます。Nov 17 バケットには、2025-11-17 00:00:00 to 23:59:59 UTC のイベントが含まれます。
スライディング タイム ウィンドウ(over <duration>)
コンセプト: YARA-L ルールで使用されるスライディング ウィンドウは、指定された期間の移動する時間枠であり、重複する可能性があります。これらは、互いに近接した場所で発生したイベントを関連付ける場合に最適です。
使用方法: 主に YARA-L ルールで使用され、連続した期間内のイベントのパターンまたはシーケンスを検出します。
例: 5 分以内に複数のログイン失敗を検出する
この YARA-L ルールの例では、1 人のユーザーが 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:30 から 10:07:30 の間に、ユーザー jdoe が 6 回ログインに失敗すると、検出がトリガーされます。このウィンドウは常に前方にスライドするため、カレンダーの境界に関係なく、リアルタイムのパターン検出が行われます。
次のステップ
- YARA-L 2.0 の概要で詳細を確認する
- YARA-L 2.0 言語の構文の詳細を確認する
- 検出エンジンのルールの作成について学習する
- Google SecOps 初心者向けブログ
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。