一致セクションの構文
match セクションには、複数の関連イベントを 1 つの検出に関連付けるために必要なパラメータが用意されています。これは、2 つ以上の異なるイベントをリンクするルールでのみ必要です。これを使用して、次の項目を指定して、この関連付けの条件を定義します。
グループ化フィールド(キー): イベントを論理的にリンクするために、イベント(
eventsセクションで定義)の特定のフィールドで同じ値を共有する必要があります。時間制約: 関連するイベントが単一の完全な一致を構成するために発生する必要がある連続した時間枠。これはルールでのみ必要であり、検索やダッシュボードでは必要ありません。
match セクションを定義する
ルールでは、一致変数は event セクションで定義されたプレースホルダである必要があります。検索とダッシュボードで event フィールドを指定することもできます。
events セクションで定義されたプレースホルダ変数を使用して、イベントが発生する必要がある時間枠を指定します。指定した期間外に発生した一致するイベントは、その特定の検出グループでは無視されます。
over キーワードと構文 <number><m/h/d>(m/h/d は分、時、日)を使用して、時間枠を指定します。最小 1 分、最大 48 時間を指定できます。
このルールの例では、10 分間の時間枠内で発生したログイン失敗を検出します。短期間に複数のログイン失敗を関連付けると、ブルート フォース攻撃や不正アクセス試行が示されることがよくあります。
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
condition:
#e >= 5
}
match セクションでは、10 分間隔で新しい場所からログインに失敗したユーザーを検索します。
match:
$user over 10m
一致セクションのゼロ値
Google SecOps は、match セクションで使用されているすべてのプレースホルダのゼロ値を暗黙的に除外します(文字列の場合は ""、数値の場合は 0、ブール値の場合は false、列挙型の場合は位置 0 の値です)。
例: ゼロ値を除外する
次の例では、ゼロ値を除外するクエリを示します。
rule ZeroValuePlaceholderExample {
meta:
events:
// Because $host is used in the match section, the query behaves
// as if the following predicate was added to the events section:
// $host != ""
$host = $e.principal.hostname
// Because $otherPlaceholder was not used in the match,
// there is no implicit filtering of zero values for $otherPlaceholder.
$otherPlaceholder = $e.principal.ip
match:
$host over 5m
condition:
$e
}ただし、プレースホルダが関数に割り当てられている場合、match セクションで使用されているプレースホルダのゼロ値がクエリによって暗黙的に除外されません。
ゼロ値の暗黙的なフィルタリングを無効にするには、オプション セクションで allow_zero_values オプションを使用します。allow_zero_values オプションはルールでのみ使用できます。
例: ゼロ値を許可する
次の例は、match セクションで使用されるプレースホルダのゼロ値を暗黙的に除外しないクエリを示しています。
rule ZeroValueFunctionPlaceholder {
meta:
events:
// Even though $ph is used in the match section, there is no
// implicit filtering of zero values for $ph, because $ph is assigned to a function.
$ph = re.capture($e.principal.hostname, "some-regex")
match:
$ph over 5m
condition:
$e
}サポートされている時間枠
match セクションのイベント フィールドとプレースホルダは、次のいずれかのサポートされているウィンドウを使用して、指定した時間粒度でグループ化できます。
- ホップ ウィンドウ(重複ウィンドウ)
- タンブリング ウィンドウ(重複しないウィンドウ)
- スライディング ウィンドウ(ピボットによって生成されたウィンドウ)
ホップ ウィンドウ
ホップ ウィンドウは、クエリの条件に一致するイベントを発生順序に関係なく指定された期間内にグループ化するマルチイベント クエリタイプです。デフォルトでは、match セクションを含む YARA-L クエリは、ホップ ウィンドウを使用して複数のイベントを時間経過に沿って関連付けます。クエリの実行の時間範囲は、match セクションで指定された期間を含む、重複するホップ ウィンドウのセットに分割されます。その後、イベントは各ホップ ウィンドウ内で関連付けられます。
たとえば、時間範囲 [1:00, 2:00] に対して実行されるクエリで、30m に match セクションがある場合、次のような重複するホップ ウィンドウのセットが発生する可能性があります。[1:00, 1:30]、[1:03, 1:33]、[1:06, 1:36] などです。これらのウィンドウは、複数のイベントを関連付けるために使用されます。
タンブリング ウィンドウ
タンブリング ウィンドウは、データ ストリームを固定サイズで重複しない連続した時間間隔に分割します。各データイベントは 1 つのウィンドウにのみ割り当てられます。これは、時間間隔が重複する可能性があるスライディング ウィンドウやホップ ウィンドウとは対照的です。
たとえば、30 分のタンブリング ウィンドウでは、1:00:00 ~ 1:29:59 の間に発生したイベントがまとめて処理されます。次に、1 時 30 分 0 秒から 1 時 59 分 59 秒までの次のイベントセットが個別に処理されます。
スライディング ウィンドウ
特定の相対的な順序で発生するイベント(e1 は e2 から 2 分後までに発生するなど)を検索する必要がある場合は、スライディング ウィンドウが非常に効果的です。スライディング ウィンドウは、指定されたピボット イベント変数で時間制約が開始または終了するときに生成されます。これにより、特定のピボット イベント変数に関連するイベント シーケンスとタイミングが動的にトラッキングされます。
次に、各スライディング ウィンドウ内でイベントが相互に関連付けられます。これにより、特定の順序で発生するイベントを検索できます(たとえば、e1 は e2 から 2 分後までに発生します)。イベント e1 がイベント e2 の後のスライディング ウィンドウ期間内に発生した場合、イベント e1 の発生とイベント e2 の発生は相関します。
- スライディング ウィンドウはピボット イベント変数(
pivot-event-var)に基づいています。 beforeキーワードを使用して、ピボット イベントが発生するたびに終了するスライディング ウィンドウを生成します。afterキーワードを使用して、ピボット イベントが発生するたびにスライディング ウィンドウを生成します。
クエリの match セクションで、スライディング ウィンドウを次のように指定します。
<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>
次の例は、有効なスライディング ウィンドウを示しています。
$var1, $var2 over 5m after $e1
$user over 1h before $e2
注:
- その他のスライディング ウィンドウの例。
ホップ ウィンドウの代わりにスライディング ウィンドウを使用すると、パフォーマンスが低下する事例が確認されています。スライディング ウィンドウは、イベントの順序が絶対的に必要な場合や、イベントの不在を検索する場合など、特定のケースでのみ使用することをおすすめします。
スライディング ウィンドウは複数のイベントを検出するように設計されているため、単一イベントのクエリにはスライディング ウィンドウを使用しないことをおすすめします。代わりに、次のいずれかの回避策を使用します。
- クエリを変換して複数のイベント変数を使用し、クエリでイベントの複数の発生が必要な場合は条件セクションを更新します。
- 必要に応じて、スライディング ウィンドウを使用する代わりに、タイムスタンプ フィルタの追加を検討してください。例:
$permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds - スライド ウィンドウを取り外します。
次のステップ
その他の情報
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。