カスタム DNS ログを収集する
パーサーのバージョン: 1.0
このドキュメントでは、Google Cloud Storage V2 を使用してカスタム DNS ログを Google Security Operations に取り込む方法について説明します。
カスタム DNS は、カスタムまたはサポートされていない DNS 実装からの DNS サーバーログの汎用ログタイプです。ドメイン、レコード タイプ、クライアント情報などの DNS クエリとレスポンスのデータをキャプチャします。これらのログは標準以外の DNS ソースから取得されるため、Google Cloud Storage(GCS)バケットにエクスポートしてから、Google SecOps フィードを構成して取り込む必要があります。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- Cloud Storage API が有効になっている Google Cloud プロジェクト
- GCS バケットを作成および管理する権限
- GCS バケットの IAM ポリシーを管理する権限
- サポートされている形式(JSON を推奨)でログを生成する DNS サーバーまたはサービス
- ログのエクスポートを構成するための DNS サーバーへの管理者権限
Google Cloud Storage バケットを作成する
- Google Cloud コンソールに移動します。
- プロジェクトを選択するか、新しいプロジェクトを作成します。
- ナビゲーション メニューで、[Cloud Storage > バケット] に移動します。
- [バケットを作成] をクリックします。
次の構成情報を提供してください。
設定 値 バケットに名前を付ける グローバルに一意の名前( custom-dns-logsなど)を入力します。ロケーション タイプ ニーズに応じて選択します(リージョン、デュアルリージョン、マルチリージョン)。 ロケーション Google SecOps インスタンスに最も近いロケーションを選択します(例: us-central1)。ストレージ クラス Standard(アクセス頻度の高いログにおすすめ) アクセス制御 均一(推奨) 保護ツール 省略可: オブジェクトのバージョニングまたは保持ポリシーを有効にする [作成] をクリックします。
DNS ログの GCS への自動エクスポートを構成する
DNS ログをエクスポートする方法は、DNS サーバーの実装によって異なります。環境に最適なアプローチを選択します。
オプション 1: Cloud Logging シンク(GCE の DNS サーバーの場合)
DNS サーバーが Google Compute Engine インスタンスで実行され、Cloud Logging にログを記録する場合は、ログシンクを作成して DNS ログを GCS に直接エクスポートします。
- GCP Console で、[ロギング] > [Log Router] に移動します。
- [シンクを作成] をクリックします。
次の構成情報を提供してください。
設定 値 シンク名 custom-dns-to-gcsシンクの宛先 Cloud Storage バケット バケット custom-dns-logs包含フィルタ DNS ログエントリに一致するフィルタ( resource.type="gce_instance" AND logName="projects/YOUR_PROJECT_ID/logs/dns"など)[シンクを作成] をクリックします。
オプション 2: Cloud Build を使用した Cloud Scheduler(オンプレミス DNS サーバーの場合)
Cloud Scheduler によってトリガーされる Cloud Build を使用して、リモート サーバーから DNS ログを収集して GCS に書き込むコンテナ化されたエクスポート ジョブを実行します。
エクスポート ジョブのサービス アカウントを作成します。
- GCP コンソールで、[IAM と管理>サービス アカウント] に移動します。
- [サービス アカウントを作成] をクリックします。
- 次の構成情報を指定します。
- サービス アカウント名: 「
dns-log-export-sa」と入力します。 - サービス アカウントの説明:
Service account for automated DNS log export to GCSと入力します。
- サービス アカウント名: 「
- [作成して続行] をクリックします。
- 次のロールを追加します。
- Storage オブジェクト管理者(GCS にファイルを書き込むため)
- Cloud Build 編集者(Cloud Build ジョブを実行するため)
- [完了] をクリックします。
Cloud Build 構成ファイル(
cloudbuild.yaml)を作成します。steps: - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | # Collect DNS logs from your server # Replace with the actual command for your environment # Example: pull logs via syslog-ng, rsync from remote server, or query DNS log API curl -s -H "Authorization: Bearer $${API_TOKEN}" \ "https://your-dns-server.example.com/api/logs?format=json" \ -o /workspace/dns_logs.json # Upload to GCS gcloud storage cp /workspace/dns_logs.json \ gs://${_BUCKET_NAME}/dns/dns_logs_$(date -u +%Y%m%d_%H%M%S).json substitutions: _BUCKET_NAME: 'custom-dns-logs'ビルドをトリガーする Cloud Scheduler ジョブを作成します。
- GCP Console で、[Cloud Scheduler] に移動します。
- [ジョブを作成] をクリックします。
次の構成情報を提供してください。
設定 値 名前 dns-log-export-hourlyリージョン GCS バケットと同じリージョンを選択する 周波数 0 * * * *(1 時間ごと)タイムゾーン UTC(推奨) ターゲット タイプ HTTP URL https://cloudbuild.googleapis.com/v1/projects/YOUR_PROJECT_ID/buildsHTTP メソッド POST Auth ヘッダー OAuth トークンを追加 サービス アカウント dns-log-export-sa@YOUR_PROJECT_ID.iam.gserviceaccount.com[作成] をクリックします。
オプション 3: Storage Transfer Service(オンプレミス ファイル システムの場合)
DNS ログがローカル ファイル システムに書き込まれる場合は、Storage Transfer Service と転送エージェントを使用して、GCS に移動します。
- GCP Console で、[Storage Transfer Service] に移動します。
- [転送ジョブを作成] をクリックします。
- 転送元として [POSIX ファイル システム] を選択します。
- 手順に沿って、DNS サーバーまたは DNS ログファイルにアクセスできるマシンに Storage Transfer Agent をインストールします。
転送ジョブを構成します。
設定 値 ソース ディレクトリ DNS ログファイル ディレクトリのパス 宛先バケット custom-dns-logs宛先のパス dns/スケジュール 定期的なスケジュールを設定する(1 時間ごとなど) [作成] をクリックします。
Google SecOps サービス アカウントを取得する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Custom DNS Logs)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
- [ログタイプ] として [カスタム DNS] を選択します。
- [サービス アカウントを取得する] をクリックします。
一意のサービス アカウントのメールアドレスが表示されます(例:)。
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comこのメールアドレスをコピーして、次のステップで使用します。
Google SecOps サービス アカウントに IAM 権限を付与する
Google SecOps サービス アカウントには、GCS バケットに対する Storage オブジェクト閲覧者のロールが必要です。
- [Cloud Storage] > [バケット] に移動します。
- バケット名(
custom-dns-logsなど)をクリックします。 - [権限] タブに移動します。
- [アクセス権を付与] をクリックします。
- 次の構成情報を指定します。
- プリンシパルを追加: Google SecOps サービス アカウントのメールアドレス(例:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com)を貼り付けます。 - ロールを割り当てる: [Storage オブジェクト閲覧者] を選択します。
- プリンシパルを追加: Google SecOps サービス アカウントのメールアドレス(例:
[保存] をクリックします。
Google SecOps フィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [Add New Feed] をクリックします。
- [単一フィードを設定] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
Custom DNS Logs)。 - [ソースタイプ] として [Google Cloud Storage V2] を選択します。
- [ログタイプ] として [カスタム DNS] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
ストレージ バケット URI: GCS バケット URI を入力します。
gs://custom-dns-logs/dns/custom-dns-logsは、GCS バケット名に置き換えます。dnsは、構成したプレフィックス パスに置き換えます。
Source deletion option: 必要に応じて削除オプションを選択します。
- なし: 転送後にファイルを削除しません(テストにおすすめ)。
転送されたファイルと空のディレクトリを削除する: 転送が完了した後にファイルと空のディレクトリを削除します。
ファイルの最大経過日数: 過去の日数以内に変更されたファイルを含めます(デフォルトは 180 日)。
アセットの名前空間: アセットの名前空間。
Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
| ログフィールド | UDM マッピング | ロジック |
|---|---|---|
receiveTimestamp |
metadata.event_timestamp |
RFC 3339 として解析済み |
message |
metadata.event_type |
マッピング: "dns_query" → NETWORK_DNS |
jsonPayload.msg |
metadata.product_event_type |
直接マッピングされます。 |
insertId |
metadata.product_log_id |
直接マッピングされます。 |
message |
metadata.product_name |
マッピング: "dns_query" → Custom DNS |
message |
metadata.vendor_name |
マッピング: "dns_query" → CUSTOM |
message |
network.application_protocol |
マッピング: "dns_query" → DNS |
dns_answers |
network.dns.answers |
統合済み |
message |
network.dns.answers |
マッピング: "dns_query" → dns_answers |
dns_question |
network.dns.questions |
統合済み |
message |
network.dns.questions |
マッピング: "dns_query" → dns_question |
dns.response_code |
network.dns.response_code |
名前変更済み/マッピング済み |
message |
principal.hostname |
マッピング: "dns_query" → jsonPayload.dns_query.server |
jsonPayload.dns_query.server |
principal.ip |
統合済み |
message |
principal.ip |
マッピング: "dns_query" → jsonPayload.dns_query.server |
message |
security_result |
マッピング: "dns_query" → security_result |
logName |
security_result.category_details |
統合済み |
message |
security_result.category_details |
マッピング: "dns_query" → logName |
message |
security_result.severity |
マッピング: "dns_query" → INFORMATIONAL、"dns_query" → MEDIUM、"dns_query" → HIGH |
labels.application |
target.application |
直接マッピングされます。 |
message |
target.hostname |
マッピング: "dns_query" → jsonPayload.dns_query.server |
jsonPayload.dns_query.server |
target.ip |
統合済み |
message |
target.ip |
マッピング: "dns_query" → jsonPayload.dns_query.server |
component_label |
target.labels |
統合済み |
instance_group_label |
target.labels |
統合済み |
message |
target.labels |
マッピング: "dns_query" → component_label、"dns_query" → instance_group_label |
labels.region |
target.location.country_or_region |
直接マッピングされます。 |
resource.labels.zone |
target.resource.attribute.cloud.availability_zone |
直接マッピングされます。 |
message |
target.resource.attribute.cloud.environment |
マッピング: "dns_query" → GOOGLE_CLOUD_PLATFORM |
resource.labels.project_id |
target.resource.attribute.cloud.project.id |
直接マッピングされます。 |
message |
target.resource.resource_type |
マッピング: "dns_query" → VIRTUAL_MACHINE |
| なし | metadata.event_type |
定数: NETWORK_DNS |
| なし | metadata.product_name |
定数: Custom DNS |
| なし | metadata.vendor_name |
定数: CUSTOM |
| なし | network.application_protocol |
定数: DNS |
| なし | principal.hostname |
定数: jsonPayload.dns_query.server |
| なし | security_result.severity |
定数: INFORMATIONAL |
| なし | target.hostname |
定数: jsonPayload.dns_query.server |
| なし | target.resource.attribute.cloud.environment |
定数: GOOGLE_CLOUD_PLATFORM |
| なし | target.resource.resource_type |
定数: VIRTUAL_MACHINE |
変更ログ
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。