検索で結合を使用する
結合は、複数のソースのデータを関連付けて、調査のコンテキストをより多く提供するのに役立ちます。関連するイベント、エンティティ、その他のデータをリンクすることで、複雑な攻撃シナリオを調査できます。
このドキュメントでは、Google Security Operations で結合オペレーションを使用する方法について説明します。また、サポートされている結合タイプ、ユースケース、ベスト プラクティスについても説明します。
結合を作成する
統計情報に基づく結合のみがサポートされています。これらは、最大 48 時間の相関時間枠でクエリのマッチ セクションで定義する必要があります。結合を作成するには、フィールドを直接接続する($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)イベントを接続します。次のクエリ例では、USER_LOGIN
イベントを別のイベントにリンクして、共通の IP アドレスに基づいてユーザーが操作したホスト名(altostrat
)を検索します。
$e1.principal.ip = $ip
$e1.metadata.event_type = "USER_LOGIN"
$e2.target.ip = $ip
$e2.principal.hostname = "altostrat"
match:
$ip over 5m
Event-ECG join
Event-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
Datatable-event join
データテーブル イベント結合は、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 != null
metadata.event_type = "NETWORK_CONNECTION"
(このイベントタイプが環境内で非常に一般的な場合)
一般的なフィルタとより具体的なフィルタを組み合わせて、クエリで処理する必要があるイベントの総数を減らすことをおすすめします。target.ip != null
などの広範なフィルタは、クエリのパフォーマンスを向上させるために、より具体的なフィルタと組み合わせて使用する必要があります。次に例を示します。
$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 のベスト プラクティスをご覧ください。
制限事項
結合を使用する場合は、次の制限事項が適用されます。
クエリごとに最大 2 つの UDM イベントを使用できます。
クエリごとに使用できる心電図イベントは 1 つまでです。
1 つのクエリで使用できるデータテーブルは最大 2 つです。
1 つのクエリでデータテーブル、UDM、ECG のイベントを結合することはできません。
クエリの最大期間は 90 日です。
最大
match
時間枠は 48 時間です。結合は、ユーザー インターフェースと
EventService.UDMSearch
API ではサポートされていますが、SearchService.UDMSearch
API ではサポートされていません。
一般的なユースケース
このセクションでは、結合の一般的な使用方法について説明します。
認証情報の盗難と使用を検出する
目標: ユーザーが正常にログインした後、重要なシステムファイルをすぐに削除したインスタンスを見つけます。これは、アカウントの乗っ取りや悪意のある内部関係者の活動を示している可能性があります。
結合タイプ: イベント-イベント結合
説明: このクエリは、単独では疑わしくないが、同時に発生すると非常に疑わしくなる 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)と結合することで、そのイベントの重要度を高めています。具体的には、エンティティ グラフで「Critical Database Server」というラベルが付けられたアセットから発生した 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)を積極的に検索します。
結合タイプ: Datatable-Event join
説明: 脅威インテリジェンス チームは、悪意のあるドメインを一覧表示する ThreatActor_Domains
というデータテーブルを維持しています。このクエリは、すべてのリアルタイム NETWORK_DNS_QUERY
イベントをこのデータテーブルと結合します。ネットワーク内のホストが脅威インテリジェンス リストのドメインを解決しようとしたインスタンスがすぐに表示されます。
クエリの例:
// Datatable: Get the list of malicious domains
$domain = $ip = %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 のプロフェッショナルから回答を得ることができます。