拡張ネットワークトラフィックLogsをクエリーする
プレビュー
この機能はプライベート プレビュー段階です。試用については、Databricksの連絡先にお問い合わせください。
この記事では、Serverless コンピュートからの送信ネットワークトラフィックを分析するために、拡張ネットワークトラフィック Logs をクエリーする方法について説明します。ログに記録される内容とテーブルの関連についての概要は、拡張ネットワークトラフィック Logsを参照してください。
要件
- Databricksアカウントで、拡張ネットワークトラフィックログのプライベートプレビューに登録されている必要があります。登録をリクエストするには、Databricksアカウントチームにお問い合わせください。
- アカウントの登録後、アカウント管理者はアカウントコンソールの プレビュー ページからプレビューを有効にする必要があります。アカウントレベルのプレビューを管理するを参照してください。
- システムテーブルをクエリーするためのアクセス権が必要です。システムテーブルリファレンスを参照してください。
拡張ネットワークトラフィックLogsは、どのプラットフォーム層でも利用できます。
許可されたネットワークアクセスイベントをクエリーする
次のクエリーは、宛先と解決されたIPアドレスを含む、過去24時間の許可されたアウトバウンドネットワークアクセスイベントを返します:
SELECT
event_time,
workspace_id,
network_source_type,
destination_type,
destination,
CASE
WHEN destination_type = 'DNS'
THEN dns_event.rdata
WHEN destination_type = 'STORAGE'
THEN storage_event.rdata
END AS resolved_ips
FROM system.access.outbound_network
WHERE event_time >= current_timestamp() - INTERVAL 1 DAY
AND access_type = 'ALLOWED'
ORDER BY event_time DESC;
宛先IP別にトラフィック量をクエリーする
次のクエリーは、過去24時間にプライベートネットワークゲートウェイ経由で送受信された合計バイト数を、ワークスペースと宛先IPアドレス別に返します。送信データ量が最も多い宛先を見つけるために使用します。
SELECT
workspace_id,
destination_ip,
connection_type,
connection_method,
SUM(sent_bytes) AS total_sent_bytes,
SUM(received_bytes) AS total_received_bytes
FROM system.access.outbound_traffic
WHERE period_start_time >= current_timestamp() - INTERVAL 1 DAY
GROUP BY
workspace_id,
destination_ip,
connection_type,
connection_method
ORDER BY total_sent_bytes DESC;
アクセスイベントとフローログを関連付ける
ホスト名とトラフィック量を関連付けるには、アカウント ID、ワークスペース ID、解決された宛先 IP アドレスをキーとして、system.access.outbound_network と system.access.outbound_traffic を結合します。その際、アクセスイベントの event_time がフローログの時間間隔内にあるものを対象とします。テーブル間の関連の詳細については、テーブル間の関連を参照してください。
一致するプライベートネットワークゲートウェイのトラフィックに該当する許可リクエストを検索
次のクエリーは、直近24時間のアウトバウンドネットワークアクセスイベントにhas_matching_png_traffic列を追加します:
WITH params AS (
SELECT
current_timestamp() - INTERVAL 24 HOURS AS start_time,
current_timestamp() AS end_time
),
network_events AS (
SELECT n.*
FROM system.access.outbound_network n
CROSS JOIN params p
WHERE n.event_time >= p.start_time
AND n.event_time < p.end_time
),
allowed_ips AS (
SELECT
n.event_id,
n.account_id,
n.workspace_id,
n.event_time,
resolved_ip
FROM network_events n
LATERAL VIEW EXPLODE(
CASE
WHEN n.destination_type = 'DNS'
THEN n.dns_event.rdata
WHEN n.destination_type = 'STORAGE'
THEN n.storage_event.rdata
WHEN n.destination_type = 'IP'
THEN ARRAY(n.destination)
ELSE ARRAY()
END
) e AS resolved_ip
WHERE n.access_type = 'ALLOWED'
),
png_matches AS (
SELECT DISTINCT
n.account_id,
n.workspace_id,
n.event_id
FROM allowed_ips n
JOIN system.access.outbound_traffic t
ON t.account_id = n.account_id
AND t.workspace_id = n.workspace_id
AND t.destination_ip = n.resolved_ip
AND n.event_time >= t.period_start_time
AND n.event_time < t.period_end_time
AND t.connection_method = 'PRIVATE_NETWORK_GATEWAY'
CROSS JOIN params p
WHERE t.period_end_time > p.start_time
AND t.period_start_time < p.end_time
)
SELECT
n.*,
CASE
WHEN n.access_type <> 'ALLOWED' THEN NULL
ELSE m.event_id IS NOT NULL
END AS has_matching_png_traffic
FROM network_events n
LEFT JOIN png_matches m
ON m.account_id = n.account_id
AND m.workspace_id = n.workspace_id
AND m.event_id = n.event_id;
has_matching_png_traffic列には次の値があります:
Value | 説明 |
|---|---|
| 一致するプライベートネットワークゲートウェイのトラフィックレコードが見つかりました。 |
| 許可されたアクセスイベントに一致するプライベートネットワークゲートウェイのトラフィックレコードがありませんでした。 |
| アクセスイベントは |
値がFALSEであっても、リクエストがパブリック接続またはその他のプライベート接続を使用したとは限りません。ログ記録の制限やイベントのタイミングの違いにより、一致するフローが見つからない場合もあります。2つのホスト名が同じIPアドレスに解決される場合、どちらもTRUEです。
宛先ホスト名別にトラフィック量を推定する
次のクエリーは、過去24時間に各宛先ホスト名に関連付けられたトラフィック量を推定します。アクセスイベントから解決されたIPアドレスをフローログの宛先IPアドレスと照合し、送受信されたバイト数を合計します。
WITH params AS (
SELECT
current_timestamp() - INTERVAL 24 HOURS AS start_time,
current_timestamp() AS end_time
),
allowed_ips AS (
SELECT
n.account_id,
n.workspace_id,
n.destination,
n.event_time,
resolved_ip
FROM system.access.outbound_network n
CROSS JOIN params p
LATERAL VIEW EXPLODE(
CASE
WHEN n.destination_type = 'DNS'
THEN n.dns_event.rdata
WHEN n.destination_type = 'STORAGE'
THEN n.storage_event.rdata
WHEN n.destination_type = 'IP'
THEN ARRAY(n.destination)
ELSE ARRAY()
END
) e AS resolved_ip
WHERE n.access_type = 'ALLOWED'
AND n.event_time >= p.start_time
AND n.event_time < p.end_time
),
matched_flows AS (
SELECT
t.event_id,
t.workspace_id,
t.connection_method,
MAX(t.received_bytes) AS received_bytes,
MAX(t.sent_bytes) AS sent_bytes,
COLLECT_SET(n.destination) AS destinations
FROM allowed_ips n
JOIN system.access.outbound_traffic t
ON t.account_id = n.account_id
AND t.workspace_id = n.workspace_id
AND t.destination_ip = n.resolved_ip
AND n.event_time >= t.period_start_time
AND n.event_time < t.period_end_time
CROSS JOIN params p
WHERE t.period_end_time > p.start_time
AND t.period_start_time < p.end_time
GROUP BY
t.event_id,
t.workspace_id,
t.connection_method
)
SELECT
workspace_id,
destinations,
connection_method,
SUM(received_bytes) AS total_received_bytes,
SUM(sent_bytes) AS total_sent_bytes
FROM matched_flows
GROUP BY
workspace_id,
destinations,
connection_method
ORDER BY total_sent_bytes DESC;
結果には次の列が含まれます:
workspace_id: トラフィックの発生元であるワークスペース。destinations:トラフィックと相関付けられた宛先ホスト名またはストレージロケーション。複数のホスト名が1つの宛先IPアドレスを共有している場合、このリストには複数の項目が表示されます。connection_method:使用される接続方法。値はPRIVATE_NETWORK_GATEWAYです。total_received_bytes: 一致するフローレコード全体でServerlessコンピュートが受信した合計バイト数。total_sent_bytes:一致するフローレコード全体でServerless コンピュートによって送信された合計バイト数。
複数のホスト名が同じIPアドレスに解決される場合にフローを複数回カウントしないよう、クエリーはそれらのホスト名を1つの配列にグループ化し、各フローレコードのバイト数を1回だけカウントします。結果は概算であり、ホスト名が同じIPアドレスを共有する場合、各ホスト名に正確なバイト数を割り当てるものではありません。一致するアクセスイベントのないトラフィックは除外されます。