検索とダッシュボードで結合を適用する
結合は、複数のソースからのデータを関連付けて、調査のコンテキストを強化するのに役立ちます。関連するイベント、エンティティ、その他のデータをリンクすることで、複雑な攻撃シナリオを調査し、傾向を可視化できます。
このドキュメントでは、Google Security Operations の検索とダッシュボードで結合オペレーションを使用する方法について説明します。また、サポートされている結合タイプ、ユースケース、ベスト プラクティスについても説明します。
結合を作成する
統計ベースの結合のみがサポートされています。クエリの match セクションで定義する必要があります。
相関関係の時間枠(一致ウィンドウ)は、検索を使用しているかダッシュボードを使用しているかによって異なります。
- 検索: 最大 48 時間。
- ダッシュボード: 最大 365 日(ほとんどのデータソースの場合)。
結合を作成するには、フィールドを直接接続する(例: $e1.hostname = $e2.hostname)か、プレースホルダ変数を使用します。match セクションで結合を定義する場合は、プレースホルダ変数を使用する必要があります。
次のクエリの例では、等号(=)と共有プレースホルダ変数を使用して 2 つのフィールドを結合します。
例 1:
events: // Assign a value from the first event to the placeholder variable $user $user = $e1.principal.user.userid // The second assignment creates an implicit join, linking $e2 to $e1 // where the user ID is the same. $user = $e2.principal.user.userid match: $user over 1h condition: $e1 and $e2例 2:
$e1.principal.ip = $ip $e1.metadata.event_type = "USER_LOGIN" $e1.principal.hostname = $host $e2.target.ip = $ip $e2.principal.hostname = "altostrat" $e2.target.hostname = $host match: $ip, $host over 5m
サポートされている結合タイプ
このセクションでは、使用できるさまざまなタイプの結合について説明します。このセクションの例では、検索で使用される構文を示します。ダッシュボードでの結合について は、ダッシュボードでの結合をご覧ください。
イベント間結合
イベント間結合は、2 つの異なるユニバーサル データモデル(UDM)イベントを接続します。 次のクエリの例では、共通の IP アドレスに基づいて、
USER_LOGINイベントを別のイベントにリンクして、ユーザーが操作したホスト名(altostrat)を検索します。$e1.principal.ip = $ip $e1.metadata.event_type = "USER_LOGIN" $e2.target.ip = $ip $e2.principal.hostname = "altostrat" match: $ip over 5m
イベントと ECG の結合
イベントと ECG の結合は、UDM イベントをエンティティ コンテキスト グラフ(ECG)のエンティティに接続します。次のクエリの例では、1 時間以内に同じホスト名を共有するエンティティ グラフから
NETWORK_CONNECTIONイベントとASSETを検索します。events: $e1.metadata.event_type = "NETWORK_CONNECTION" $g1.graph.metadata.entity_type = "ASSET" $e1.principal.asset.hostname = $g1.graph.entity.asset.hostname $x = $g1.graph.entity.asset.hostname match: $x over 1h condition: $e1 and $g1
データテーブルとイベントの結合
データテーブルとイベントの結合は、UDM イベントをカスタム データテーブルのエントリに接続します。 これは、既知の悪意のある IP アドレスや脅威アクターなど、ユーザー定義のリストに対してライブ イベントデータをチェックする場合に便利です。次のクエリの例では、
NETWORK_CONNECTIONイベントをデータテーブルに結合して、そのリストの特定の IP アドレスを含む接続を検索します。$ip = %DATATABLE_NAME.COLUMN_NAME $ip = $e1.principal.ip $e1.metadata.event_type = "NETWORK_CONNECTION" match: $ip over 1h
ベスト プラクティス
結合クエリは、多くの結果を組み合わせるため、リソースを大量に消費する可能性があります。広範で一般的なフィルタを使用すると、クエリが失敗する可能性があります。たとえば、次のような場合です。
target.ip != ""metadata.event_type = "NETWORK_CONNECTION"(このイベントタイプが環境で非常に 一般的な場合)
一般的なフィルタをより具体的なフィルタと組み合わせて、クエリで処理する必要があるイベントの総数を減らすことをおすすめします。`
target.ip != ""` などの広範なフィルタは、クエリのパフォーマンスを向上させるために、 より具体的なフィルタと組み合わせる必要があります。次に例を示します。$e1.metadata.log_type = $log $e1.metadata.event_type = "USER_LOGIN" $e1.target.ip != "" $e2.metadata.log_type = $log $e2.principal.ip = "10.0.0.76" $e2.target.hostname != "altostrat" match: $log over 5m
クエリが遅い場合は、クエリの全体的な期間を短縮することもできます(たとえば、30 日から 1 週間に短縮します)。
詳細については、 YARA-L のベスト プラクティスをご覧ください。
ダッシュボードでの結合
ダッシュボードでは、検索よりも幅広いデータソースと長い相関関係ウィンドウがサポートされています。
サポートされるデータソース
ダッシュボードでは、次のソースのデータをそれぞれの YARA-L 接頭辞を使用して結合できます。
| 接頭辞 | データソース |
|---|---|
case |
ケースとアラート |
case_history |
ケースのライフサイクル全体のアクティビティの傾向 |
detection |
ルール検出とアナリスト フィードバックの履歴 |
ingestion |
ログのボリュームと取り込みの健全性指標 |
ioc |
IoC(セキュリティ侵害インジケーター)の一致 |
playbook |
自動対応とハンドブック実行の指標 |
ruleset / rules |
アクティブなルールセットに関するメタデータ |
graph |
エンティティ グラフデータ(ECG) |
events |
UDM イベント |
大文字と小文字の区別
デフォルトで大文字と小文字が区別されない検索とは異なり、ダッシュボードでは大文字と小文字が区別されます 。ダッシュボードで大文字と小文字を区別しない結合または検索を行うには、nocase 修飾子を使用します。
例: ケースと case_history を結合する
一意のケース ID で結合することで、ケースのメタデータとその履歴アクティビティを関連付けることができます。
次の例では、
caseデータソースとcase_historyデータソースを結合して、 優先度の高いケースごとの履歴アクションの合計数をカウントします。// 1. Establish the Join using a shared placeholder variable ($case_id) $h.case_history.case_response_platform_info.case_id = $case_id $c.case.response_platform_info.response_platform_id = $case_id // 2. Apply Filters $c.case.priority = "PRIORITY_HIGH" // 3. Group the correlated data by the Case ID match: $case_id // 4. Calculate the selected metrics to display on the dashboard outcome: $case_name = array_distinct($c.case.display_name) $total_historical_actions = count($h.case_history.case_activity)
高度なユースケース: MTTR の計算
解決までの平均時間(MTTR)やクローズまでの平均時間(MTTC)などの複雑な指標には、複数ステージのクエリを使用できます。これにより、最初のステージで個々のケースの期間を計算し、最終結果ブロックでそれらの期間をグローバルに平均化できます。
次のクエリは、「デフォルト環境」のすべてのケースで、ケースをクローズするまでの平均時間(分)を計算します。
stage stage1 { // 1. Establish the Join $h.case_history.case_response_platform_info.case_id = $case_id $c.case.response_platform_info.response_platform_id = $case_id // 2. Filter by specific environment $c.case.environment = "Default Environment" // 3. Group by Case ID to process per case match: $case_id // 4. Calculate the Time to Close (TTC) for each case individually outcome: $case_close_time = max(if($h.case_history.case_activity = "CLOSE_CASE", $h.case_history.event_time.seconds, 0)) $status = array_distinct($h.case_history.case_activity) // Subtract the very first event time (creation) from the close time $TTC = $case_close_time - min($h.case_history.event_time.seconds) // 5. Filter to ensure the case has a complete lifecycle condition: arrays.contains($status, "CREATE_CASE") and arrays.contains($status, "CLOSE_CASE") } // 6. Global Aggregation: Calculate the Mean (Average) across all processed cases outcome: $case_count = count($stage1.case_id) $MTTC = (math.round(avg($stage1.TTC) / 60))
制限事項
結合を使用する場合は、次の制限事項が適用されます。
検索では、クエリごとに最大 2 つの UDM イベントを使用できます。
検索では、クエリごとに最大 1 つの ECG イベントを使用できます。
クエリごとに最大 2 つのデータテーブルを使用できます。
1 つのクエリでデータテーブル、UDM、ECG イベントを結合することはできません。
クエリの最大期間は 90 日です。
最大
match時間枠は、検索の場合は 48 時間、ダッシュボードの場合は 365 日です。結合は、ユーザー インターフェースと
EventService.UDMSearchAPI でサポートされていますが、SearchService.UDMSearchAPI ではサポートされていません。
一般的なユースケース
このセクションでは、結合の一般的な使用方法について説明します。
認証情報の盗難と使用を検出する
目標: ユーザーが正常にログインし、重要なシステム ファイルをすぐに削除するインスタンスを見つけます。これは、アカウントの乗っ取りや悪意のあるインサイダー アクティビティを示している可能性があります。
結合タイプ: イベント間結合
説明: このクエリは、単独では疑わしくないが、同時に発生すると非常に疑わしくなる 2 つの異なるイベントを接続します。最初に USER_LOGIN イベントを検索し、次に FILE_DELETION イベントを検索します。これらは、共通の user.userid で短い時間枠で結合されます。
クエリの例:
// Event 1: A user successfully logs in $e1.metadata.event_type = "USER_LOGIN" $e1.security_result.action = "ALLOW" $e1.principal.user.userid = $user // Event 2: The same user deletes a critical file $e2.metadata.event_type = "FILE_DELETION" $e2.target.file.full_path = /etc\/passwd|C:\\Windows\\System32\\/ $e2.principal.user.userid = $user match: $user over 10m condition: $e1 and $e2
重要なアセットからの危険な接続を特定する
目標: アセット情報でライブ ネットワークデータを強化し、外部の 普及率の低いドメイン(本番環境データベース サーバーなど)と通信しないサーバーからのアウトバウンド 接続を検索します。
結合タイプ: イベントと ECG の結合
説明: 珍しいドメインへの単一のネットワーク接続は、
優先度が高くない可能性があります。ただし、このクエリでは、エンティティ コンテキスト グラフ(ECG)と結合することで、そのイベントの重要度を高めます。具体的には、エンティティ グラフで「重要なデータベース サーバー」としてラベル付けされたアセットからの NETWORK_CONNECTION イベントを検索します。
クエリの例:
events: $e.metadata.event_type = "NETWORK_CONNECTION" $e.target.domain.prevalence.day_count <= 5 $asset.graph.metadata.entity_type = "ASSET" $asset.graph.entity.asset.labels.value = "Critical Database Server" $e.principal.asset.hostname = $asset.graph.entity.asset.hostname $host = $e.principal.asset.hostname match: $host over 1h condition: $e and $asset
脅威アクターの IOC を探す
目標: 特定の脅威アクターが使用していることがわかっているドメインのリストに対して、すべての ライブ DNS クエリをチェックして、セキュリティ侵害インジケーター(IoC)を積極的に検索します。
結合タイプ: データテーブルとイベントの結合
説明: 脅威インテリジェンス チームは、悪意のあるドメインを一覧表示する
ThreatActor_Domainsというデータテーブルを管理しています。このクエリは、すべてのリアルタイム NETWORK_DNS_QUERY イベントをこのデータテーブルに結合します。ネットワーク内のホストが脅威インテリジェンス リストのドメインを解決しようとするインスタンスがすぐに表示されます。
クエリの例:
// Datatable: Get the list of malicious domains $domain = %DATATABLE_NAME.COLUMN_NAME // Event: A DNS query is made $e.metadata.event_type = "NETWORK_DNS" $e.network.dns.questions.name = $domain match: $domain over 5m condition: $e
さらにサポートが必要な場合コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。