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 言語の構文をご覧ください。
YARA-L 2.0 のクエリ構造は次のとおりです。
フィルタリング ステートメント: イベントをフィルタする条件を指定します。
Match(省略可): グループ条件として使用するフィールドを定義します。詳細については、マッチ セクションの構文をご覧ください。
結果: クエリの出力を指定します。詳細については、結果セクションの構文をご覧ください。
順序: クエリ結果の順序を
asc
(昇順)またはdesc
(降順)に指定します。順序(asc
またはdesc
)が指定されていない場合、デフォルトはasc
です。Limit(省略可): クエリで返される行の最大数を設定します。
順序と上限の使用例を次に示します。
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 検索では、次の集計関数を使用できます。
配列
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)
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)
最大
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)
分
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)
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)
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
)で、時間の粒度が 1m
のエンティティについて考えてみましょう。結果がホスト(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 クエリを作成します。期間を選択し、[検索を実行] をクリックしてクエリを実行します。[統計] タブと [可視化] タブで結果を確認します。
[可視化] タブで、次の操作を行います。 a. [グラフの種類] リストからグラフの種類を選択します。 b. [データ設定] で設定を調整してグラフをカスタマイズします。
[ダッシュボードに追加] 画面で、次の操作を行います。 a. グラフ名、説明、期間を入力します。 b. グラフを既存のダッシュボードに追加するか、新しいダッシュボードを作成するかを選択します。
[ダッシュボードに追加] をクリックして、グラフをダッシュボードに追加します。
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。