events セクションの構文
events セクションは、ルールの meta セクションの直後に配置する必要があります。クエリで調べるイベントと、潜在的な検出に関連すると見なされるためにイベントが備えている必要のある特定の属性を定義します。
events セクションはルールでは必須ですが、検索とダッシュボードでは省略可能です。
events セクションに、次の項目を指定する述語のリストを表示します。
- 変数の宣言
- イベント変数のフィルタ
- イベント変数の結合
[イベントを定義する] セクション
1 つのイベントタイプのみに焦点を当てたルールとクエリには、次のような単一のイベント変数を含めることができます。
events:
$e.metadata.event_type = "USER_LOGIN" // 'e' is the common convention for a single event
2 つ以上の異なるタイプのイベント(ユーザー ログインの後にファイル変更が行われたなど)間の相関関係を必要とするルールとクエリでは、イベントのタイプごとに変数が必要です。
events:
$login.metadata.event_type = "USER_LOGIN" // Event 1: User Login
$file_op.metadata.event_type = "FILE_MODIFICATION" // Event 2: File Modification
イベント変数を宣言したら、そのイベントタイプの特定のフィールドにアクセスするための接頭辞として使用します。たとえば、次の event セクションでは、Okta からのログイン失敗イベントをフィルタリングします。
events:
$e.metadata.vendor_name = "Okta"
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
変数の宣言
変数を宣言する場合は、次の構文を使用します。
<EVENT_FIELD> = <VAR><VAR> = <EVENT_FIELD>
次の例に示すように、どちらも同等です。
$e.source.hostname = $hostname$userid = $e.principal.user.userid
この宣言は、この変数がイベント変数に指定されたフィールドを表すことを示します。イベント フィールドが繰り返しフィールドの場合、match 変数は配列内の任意の値を表すことができます。1 つの一致変数またはプレースホルダ変数に複数のイベント フィールドを割り当てることもできます。これは推移的な結合条件です。
たとえば、次のようになります。
$e1.source.ip = $ip$e2.target.ip = $ip
これは次と同等です。
$e1.source.ip = $ip$e1.source.ip = $e2.target.ip
変数を使用する場合、変数宣言でその変数を宣言する必要があります。変数が宣言なしで使用されていると、コンパイル エラーが発生します。
変数の詳細については、式、演算子、その他の構成要素をご覧ください。
イベント変数のフィルタ
単一のイベント変数に対して作用するブール式は、フィルタと見なされます。
イベント変数の結合
ルールで使用されるすべてのイベント変数は、次のいずれかの方法で他のすべてのイベント変数と結合する必要があります。
2 つの結合されたイベント変数のイベント フィールドを直接比較する(例:
$e1.field = $e2.field)。式に算術演算($\text{+, -, *, /}$ など)を含めることはできません。イベント フィールドのみを含む推移的結合によって間接的に結合する(「推移的結合」の定義については、変数の宣言をご覧ください)。式に四則演算を含めることはできません。
たとえば、ルールで $e1、$e2、$e3 が使用されている場合、次の events セクションは有効です。
events:
$e1.principal.hostname = $e2.src.hostname // $e1 joins with $e2
$e2.principal.ip = $e3.src.ip // $e2 joins with $e3
events:
// $e1 joins with $e2 using function to event comparison
re.capture($e1.src.hostname, ".*") = $e2.target.hostname
events:
// $e1 joins with $e2 using an `or` expression
$e1.principal.hostname = $e2.src.hostname
or $e1.principal.hostname = $e2.target.hostname
or $e1.principal.hostname = $e2.principal.hostname
events:
// all of $e1, $e2 and $e3 are transitively joined using the placeholder variable $ip
$e1.src.ip = $ip
$e2.target.ip = $ip
$e3.about.ip = $ip
events:
// $e1 and $e2 are transitively joined using function to event comparison
re.capture($e2.principal.application, ".*") = $app
$e1.principal.hostname = $app
ただし、次の例は無効な events セクションを示しています。
events:
// Event to arithmetic comparison is an invalid join condition for $e1 and $e2.
$e1.principal.port = $e2.src.port + 1
events:
$e1.src.ip = $ip
$e2.target.ip = $ip
$e3.about.ip = "192.1.2.0" //$e3 is not joined with $e1 or $e2.
events:
$e1.src.port = $port
// Arithmetic to placeholder comparison is an invalid transitive join condition.
$e2.principal.port + 800 = $port
次のステップ
その他の情報
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。