YARA-L 2.0 を使用した UDM 検索の統計情報と集計
このページでは、UDM イベントに対して統計クエリを実行し、結果をグループ化して YARA-L 2.0 を使用して分析する方法について説明します。
概要
環境内で生成された大量の UDM イベントを処理する場合は、UDM 検索データの傾向を把握することが重要です。統計関数と集計関数を使用して、UDM ログから実用的な分析情報を取得できます。UDM 検索は、YARA-L 2.0 のすべての集計関数をサポートしています。
統計クエリは、次のユースケースで使用できます。
重要な指標をトラッキングする: UDM イベントの分布と頻度、および関連するアセット(既知の悪意のある IP アドレスと通信しているホストなど)を測定できます。
異常な動作を検出する: 異常なネットワーク トラフィック量や、通常とは異なる時間帯の予期しないログイン アクティビティなど、セキュリティ インシデントを示す可能性のある異常なパターンやアクティビティの急増を検出できます。
時間の経過に伴う傾向を分析する: セキュリティ対策の変化を特定して、コントロールの影響を評価したり、改善が必要な領域を見つけたりできます。たとえば、時間の経過に伴う脆弱性の数の変化を追跡できます。
検索の YARA-L 2.0 クエリ構造
UDM 検索クエリの結果をグループ化して並べ替えるには、Detection Engine ルールの YARA-L 構造に似た構文を使用します。詳細については、YARA-L 2.0 言語の構文をご覧ください。
クエリの構造は次のとおりです。
フィルタリング ステートメント: フィルタリング ステートメントには、イベントをフィルタする条件を指定します。
Match(省略可): match セクションでは、グループ条件として使用するフィールドを指定します。詳細については、マッチ セクションの構文をご覧ください。
結果: 結果セクションには、クエリの出力が表示されます。詳細については、結果セクションの構文をご覧ください。
順序: 順序セクションでは、返されるクエリ結果の順序を指定します。順序(
asc
またはdesc
)が指定されていない場合、デフォルトはasc
です。上限(省略可): 上限セクションでは、クエリが返す行の最大数を指定します。
順序と制限の使用例を次に示します。
metadata.log_type = "OKTA"
match:
principal.ip
Outcome:
$user_count_by_ip = count(principal.user.userid)
order:
$user_count_by_ip desc
limit:
20
集約
UDM 検索では、次の集計関数を使用できます。
sum
sum(numericExpression)
説明
sum
関数は、数値列内の値の合計を返します。計算中は NULL
値は無視されます。多くの場合、match
とともに使用され、データ内のさまざまなグループ内の合計を計算します。
パラメータのデータ型
NUMBER
戻り値の型
NUMBER
コードサンプル
例
target.ip
が空でないすべてのイベントを検索します。principal.ip
に一致するすべてのイベントについて、network.sent_bytes
の合計を sent_bytes
という変数に格納します。
target.ip != ""
match:
principal.ip
outcome:
$sent_bytes = sum(network.sent_bytes)
分
min(numericExpression)
説明
min
関数は、数値列内の値の最小値を返します。多くの場合、match
とともに使用され、データ内の各グループの最小値を取得します。
パラメータのデータ型
NUMBER
戻り値の型
NUMBER
コードサンプル
例
target.ip
が空でないすべてのイベントを検索します。principal.ip
に一致するすべてのイベントについて、metadata.event_timestamp.seconds
の最小値を min_seconds
という変数に格納します。
target.ip != ""
match:
principal.ip
outcome:
$min_seconds = min(metadata.event_timestamp.seconds)
最大
max(numericExpression)
説明
max
関数は、数値列内の値の最大値を返します。多くの場合、match
とともに使用され、データ内の各グループ内の最大値を取得します。
パラメータのデータ型
NUMBER
戻り値の型
NUMBER
コードサンプル
例
target.ip
が空でないすべてのイベントを検索します。principal.ip
に一致するすべてのイベントについて、metadata.event_timestamp.seconds
の最大値を max_seconds
という変数に格納します。
target.ip != ""
match:
principal.ip
outcome:
$max_seconds = max(metadata.event_timestamp.seconds)
avg
avg(numericExpression)
説明
avg
関数は、数値列内の値の平均を返します。計算中は NULL
値は無視されます。通常、match
とともに使用して、データ内の特定のグループ内の平均を計算します。
パラメータのデータ型
NUMBER
戻り値の型
NUMBER
コードサンプル
例
target.ip
が空でないすべてのイベントを検索します。principal.ip
に一致するすべてのイベントについて、metadata.event_timestamp.seconds
の平均を avg_seconds
という変数に格納します。
target.ip != ""
match:
principal.ip
outcome:
$avg_seconds = avg(metadata.event_timestamp.seconds)
count
count(expression)
説明
count
関数は、グループ内の行数を返します。多くの場合、match
とともに使用され、データ内の特定のグループのカウントを取得します。
パラメータのデータ型
STRING
戻り値の型
NUMBER
コードサンプル
例
時間の経過に伴うユーザーの正常なログイン数のカウントを返します。
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count(metadata.id)
count_distinct
count_distinct(expression)
説明
count_distinct
関数は、グループ内で異なる値を持つ行の数を返します。多くの場合、match
とともに使用して、データ内の特定のグループのカウントを取得します。
パラメータのデータ型
STRING
戻り値の型
NUMBER
コードサンプル
例
時間の経過に伴う、ユーザーの個別のログイン成功数を返します。
metadata.event_type = "USER_LOGIN"
$security_result = security_result.action
$security_result = "ALLOW"
$date = timestamp.get_date(metadata.event_timestamp.seconds, "America/Los_Angeles")
match:
$security_result, $date
outcome:
$event_count = count_distinct(metadata.id)
配列
array(expression)
説明
array
関数は、すべての値をリスト形式で返します。リストは最大 25 個のランダムな要素に切り詰められます。
パラメータのデータ型
STRING
戻り値の型
LIST
コードサンプル
例
イベントタイプを含む配列を返します。
$event_type = metadata.event_type
outcome:
$event_type_array = array($event_type)
array_distinct
array_distinct(expression)
説明
array_distinct
関数は、一意の値をすべてリスト形式で返します。リストは最大 25 個のランダムな要素に切り詰められます。一意のリストを得るための重複除去は、切り捨て前に適用されます。
パラメータのデータ型
STRING
戻り値の型
LIST
コードサンプル
例
異なるイベントタイプを含む配列を返します。
$event_type = metadata.event_type
outcome:
$event_type_array = array_distinct($event_type)
stddev
stddev(numericExpression)
説明
stddev
関数は、すべての可能な値の標準偏差を返します。
パラメータのデータ型
NUMBER
戻り値の型
NUMBER
コードサンプル
例
target.ip
が空でないすべてのイベントを検索します。principal.ip
に一致するすべてのイベントについて、metadata.event_timestamp.seconds
の標準偏差を stddev_seconds
という変数に格納します。
target.ip != ""
match:
principal.ip
outcome:
$stddev_seconds = stddev(metadata.event_timestamp.seconds)
検索での YARA-L 2.0 の使用と UDM での使用の違い
ウィンドウ内のイベントを検索できる
over
キーワードは、検索では使用できません。UDM 検索クエリの構造には、
condition
セクションとoption
セクションが含まれていません。
時間粒度でグループ化する
SQL でグループ化できる列と同様に、match
セクション内のすべてのイベント フィールドとプレースホルダを指定された時間の粒度でグループ化できます。
構文は次のとおりです。
match:
... [BY|OVER EVERY] [FIRST] [TIME_GRANULARITY]
時間の粒度でグループ化するには、by
キーワードまたは over
every
キーワードを使用します。使用できる時間の粒度は次のとおりです。
MINUTE
またはm
HOUR
またはh
DAY
またはd
WEEK
またはw
MONTH
またはmo
by
キーワードと over every
キーワードは機能的に同等です。どちらか一方を使用できます。
例
IP アドレスとホスト名を 1 時間単位でグループ化します。
$hostname = principal.hostname
match:
$hostname, target.ip by hour
すべてのイベントのカウントをホスト名とイベントが発生した日でグループ化します。
$hostname = target.hostname
match:
$hostname over every day
outcome:
$events_count = count($hostname)
エンティティ コンテキストなどの一部のデータソースは、期間(<start_time>
、<end_time>
)にわたって有効であり、単一のタイムスタンプは使用しません。
first
キーワードはオプションのキーワードで、期間全体で有効なデータソースを、単一のタイムスタンプでのみ有効なデータソースとして扱います。つまり、期間にわたって有効なデータソースの場合、キーワード first
は期間の開始時間(<start_time>
)のみを考慮し、期間の終了時間は無視します。
たとえば、時間範囲が(1m, 5m
)で、時間の粒度が 1 分のエンティティについて考えてみましょう。結果がホスト(h1, h2
)でグループ化されているとします。残りの期間は無視されるため、返される列は(h1, 1m
)と(h2,
1m
)になります。
first
キーワードは by
と over every
の両方に追加できます。どちらの場合も動作は同じです。by first
の使用は over every first
と同等です。
次の例は、期間にわたって有効なエンティティ コンテキスト データソースで by
演算子を使用するクエリの例です。このクエリでは、first
キーワードが省略されているため、期間全体が考慮されます。
graph.entity.hostname != ""
match:
graph.entity.ip by hour
outcome:
$min_seconds = min(graph.metadata.event_metadata.event_timestamp.seconds)
検索のビジュアリゼーション
このセクションでは、Google SecOps 統合データモデル(UDM)検索内のデータ可視化機能の概要について説明します。この機能を使用すると、セキュリティ オペレーション センター(SOC)のアナリストは、検索結果から可視化を作成し、ダッシュボードに保存することで、脅威を効率的に検出して調査し、対応できます。
ビジュアリゼーションを作成してプレビュー ダッシュボードに保存する
可視化を [プレビュー ダッシュボード] に保存する手順は次のとおりです。
match
セクションとoutcome
セクションを含む YARA-L クエリを作成します。期間を選択し、[検索を実行] をクリックしてクエリを実行します。クエリの結果は、[統計情報] タブと [可視化] タブの 2 つのタブに表示されます。
[可視化] タブで、[グラフの種類] リストからグラフの種類を選択します。
選択したグラフの種類で、[データ設定] の設定を変更してグラフをカスタマイズします。
[ダッシュボードに追加] 画面で、グラフの名前、グラフの説明、グラフの期間を追加します。
適切なオプションを選択して、グラフを既存のダッシュボードまたは新しいダッシュボードに追加します。
[ダッシュボードに追加] をクリックして、グラフをダッシュボードに追加します。