Datadog のログを収集する
概要
このパーサーは、Datadog ログからフィールドを抽出し、いくつかのミューテーションと Grok マッチングを実行してデータを構造化し、抽出されたフィールドを UDM にマッピングします。Key-Value ペアや JSON オブジェクトなど、message フィールド内のさまざまなログ形式を処理し、特定のフィールドを UDM 準拠のラベルと追加フィールドに変換します。
始める前に
次の前提条件を満たしていることを確認します。
- Google SecOps インスタンス。
- Google Cloud IAM への特権アクセス。
- Cloud Storage への特権アクセス。
- Datadog への
logs_write_archiveユーザー アクセス。
オプション 1: Cloud Storage 構成による Datadog ログの共有
Google Cloud Platform との Datadog のインテグレーションを構成する
- Datadog と Google Cloud Platform の統合を設定します。詳細については、Datadog Google Cloud 統合の設定をご覧ください。
Google Cloud Storage バケットの作成
- Google Cloud コンソールにログインします。
[Cloud Storage バケット] のページに移動します。
[作成] をクリックします。
[バケットの作成] ページでユーザーのバケット情報を入力します。以下のステップでは、操作を完了した後に [続行] をクリックして、次のステップに進みます。
[始める] セクションで、次の操作を行います。
- バケット名の要件を満たす一意の名前を入力します(例: datadog-data)。
階層名前空間を有効にするには、展開矢印をクリックして [Optimize for file oriented and data-intensive workloads] セクションを開き、[このバケットで階層的な名前空間を有効にする] を選択します。
バケットラベルを追加するには、展開矢印をクリックして [ラベル] セクションを開きます。
[ラベルを追加] をクリックし、ラベルのキーと値を指定します。
[データの保存場所の選択] セクションで、次の操作を行います。
- ロケーション タイプを選択してください。
- ロケーション タイプのプルダウン メニューを使用して、バケット内のオブジェクト データが永続的に保存されるロケーションを選択します。
- ロケーション タイプとしてデュアルリージョンを選択した場合は、関連するチェックボックスを使用してターボ レプリケーションを有効にすることもできます。
- クロスバケット レプリケーションを設定するには、[クロスバケット レプリケーションを設定する] セクションを開きます。
[データのストレージ クラスを選択する] セクションで、バケットのデフォルトのストレージ クラスを選択します。あるいは、Autoclass を選択して、バケットデータのストレージ クラスを自動的に管理します。
[オブジェクトへのアクセスを制御する方法を選択する] セクションで、[なし] を選択して公開アクセスの防止を適用し、バケットのオブジェクトの [アクセス制御モデル] を選択します。
[オブジェクト データを保護する方法を選択する] セクションで、次の操作を行います。
- [データ保護] で、バケットに設定するオプションを選択します。
- オブジェクト データの暗号化方法を選択するには、[データ暗号化] というラベルの付いた展開矢印をクリックし、データの暗号化方法を選択します。
[作成] をクリックします。
Google Cloud サービス アカウントを作成する
- [IAM と管理] > [サービス アカウント] に移動します。
- 新しいサービス アカウントを作成します。
- わかりやすい名前を付けます(datadog-user など)。
- 前の手順で作成した Cloud Storage バケットに対する ストレージ オブジェクト管理者のロールをサービス アカウントに付与します。
- サービス アカウントの SSH キーを作成します。
- サービス アカウント用の JSON キーファイルをダウンロードします。このファイルは安全な場所に保管してください。
Cloud Storage にログを送信するように Datadog を構成する
- 特権アカウントを使用して Datadog にログインします。
- [Logs] > [Log Forwarding] に移動します。
- [+ Create New Archive] をクリックします。
- [Google Cloud Storage] を選択します。
- 必要なパラメータを入力し、[Save] をクリックします。
オプション 2: Webhook 構成による Datadog ログの共有
フィードを設定する
フィードを構成する手順は次のとおりです。
- [SIEM Settings] > [Feeds] に移動します。
- [Add New Feed] をクリックします。
- 次のページで [単一のフィードを設定] をクリックします。
- [Feed name] フィールドに、フィードの名前を入力します(例: Datadog Logs)。
- [Source type] として [Webhook] を選択します。
- [ログタイプ] として [Datadog] を選択します。
- [次へ] をクリックします。
- 省略可: 次の入力パラメータの値を指定します。
- Split delimiter: ログ行を区切るために使用される区切り文字(
\nなど)。
- Split delimiter: ログ行を区切るために使用される区切り文字(
- [次へ] をクリックします。
- [Finalize] 画面でフィードの設定を確認し、[Submit] をクリックします。
- [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
- 秘密鍵をコピーして保存します。この秘密鍵を再び表示することはできません。必要に応じて、新しい秘密鍵を再生成できますが、その場合以前の秘密鍵は無効になります。
- [詳細] タブで、[エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。 このエンドポイント URL をクライアント アプリケーション内で指定する必要があります。
- [完了] をクリックします。
Webhook フィード用の API キーを作成する
Google Cloud コンソール > [認証情報] に移動します。
[認証情報を作成] をクリックして [API キー] を選択します。
API キーのアクセスを Chronicle API に制限します。
エンドポイント URL を指定する
- クライアント アプリケーション内で、Webhook フィードで提供される HTTPS エンドポイント URL を指定します。
次の形式でカスタム ヘッダーの一部として API キーと秘密鍵を指定して、認証を有効にします。
X-goog-api-key = API_KEY X-Webhook-Access-Key = SECRET推奨事項: API キーは URL 内で指定するのではなくヘッダーとして指定してください。
Webhook クライアントがカスタム ヘッダーをサポートしていない場合は、次の形式のクエリ パラメータを使用して API キーと秘密鍵を指定できます。
ENDPOINT_URL?key=API_KEY&secret=SECRET以下を置き換えます。
ENDPOINT_URL: フィード エンドポイントの URL。API_KEY: Google SecOps に対する認証に使用する API キー。SECRET: フィードの認証用に生成した秘密鍵。
Webhook にログを送信するように Datadog を構成する
- 特権アカウントを使用して Datadog にログインします。
- [Logs] > [Log Forwarding] に移動します。
- [Custom Destinations] を選択します。
- [+ Create a New Destination] をクリックします。
- 次の入力パラメータの値を指定します。
- 宛先の種類を選択する: [HTTP] を選択します。
- 宛先に名前を付ける: Webhook のわかりやすい名前を指定します(例: Google SecOps Webhook)。
- 宛先を構成する: ENDPOINT_URL の後に API_KEY と SECRET を入力します。
- 認証設定を構成する: 次のような一般的なヘッダーを追加します。これにより、HTTP リクエストが不正な形式にならず、Datadog が Webhook の作成を完了できます。
- ヘッダー名:
Accept - ヘッダー値:
application/json
- ヘッダー名:
- [Save] をクリックします。
参照リンク
サポートされている Datadog のサンプルログ
このログサンプルには、
dataフィールドに JSON 文字列として埋め込まれた未加工のアプリケーション ログデータが含まれています。{ "batch": { "id": "DUMMY_BATCH_ID", "source": { "customer_id": "DUMMY_CUSTOMER_ID", "collector_id": "DUMMY_COLLECTOR_ID" }, "log_type": "DDOG", "entries": { "data": "{\"date\":\"2023-06-20T13:41:42.359Z\",\"service\":\"ftcp-converter\",\"host\":\"DUMMY_HOST-001\",\"attributes\":{\"_trace\":{\"baggage\":{\"device_id\":\"DUMMY-DEVICE-ID\",\"vehicle_id\":\"DUMMY-VEHICLE-ID\",\"_sli_service\":\"ftcp-converter/DUMMY_ENCODED_SLI\"},\"origin\":{\"service\":\"ftcp-converter\",\"operation\":\"ProcessingService.processAndPublish\"},\"id\":\"DUMMY_TRACE_ID\"},\"@timestamp\":\"2023-06-20T13:41:42.359Z\",\"level\":\"WARN\",\"thread_name\":\"Processing-327\",\"level_value\":30000,\"@version\":\"1\",\"logger_name\":\"com.autonomic.ftcp.conversion.FTCPConverter\"},\"_id\":\"DUMMY_EVENT_ID\",\"source\":\"ftcp-converter\",\"message\":\"Timestamp Exception thrown: TOO_FAR_IN_PAST errorMessage: No timestamp available, error status:TOO_FAR_IN_PAST { \\\"context\\\":{\\\"BusArch\\\":\\\"3\\\",\\\"esn\\\":\\\"FP001CE3\\\",\\\"CANDBVersion\\\":\\\"B_v19.04A\\\",\\\"ftcpVersion\\\":\\\"5.0.9\\\",\\\"AlertName\\\":\\\"MotiveModeEndAlert\\\",\\\"ingestMessageId\\\":\\\"DUMMY-INGEST-ID\\\",\\\"vehicleId\\\":\\\"DUMMY-VEHICLE-ID\\\",\\\"redactedVin\\\":\\\"len=17\\\",\\\"deviceId\\\":\\\"DUMMY-DEVICE-ID\\\",\\\"timestamp\\\":null} }\",\"status\":\"warn\",\"tags\":[\"kube_namespace:alfa\",\"pod_label_autonomic.ai/tracing:true\",\"kube_app_name:ftcp-converter\", /* ... other tags ... */, \"docker_image:DUMMY_ECR_HOST/au/ftcp-converter:DUMMY_TAG\",\"aws-instance-type:m5.8xlarge\",\"cluster_name:staging\",\"env:staging\",\"kube_cluster_name:staging\",\"kube_role:node\",\"autonomic_ai_team:telemetry-data\"]}", "collection_time": { "seconds": 1689231423, "nanos": 972102587 } } } }このサンプルでは、API リクエストの詳細と、ネットワークと脅威インテリジェンスのメタデータが含まれています。
[ { "date": "2025-02-13T08:35:41.000Z", "attributes": { "auth_method": "SESSION", "evt": { "actor": { "type": "USER" }, "name": "Request" }, "org": { "uuid": "DUMMY-ORG-UUID" }, "usr": { "id": "dummy.user@example.com", "uuid": "DUMMY-USER-UUID", "email": "dummy.user@example.com" }, "action": "accessed", "http": { "status_code": 202, "url_details": { "path": "/api/ui/frontend_telemetry/metrics", "host": "us1.DUMMY-HOST.dog" }, "method": "POST", "useragent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36" }, "threat_intel": { "indicators_matched": [ "IP" ], "results": [ { "indicator": "0.0.0.0", "additional_data": { "tunnels": [ { "anonymous": true, "type": "VPN" } ], "as": { "number": 16509, "organization": "DUMMY-AS-ORGANIZATION" }, "risks": [ "TUNNEL" ], "infrastructure": "DATACENTER", "organization": "DUMMY-ORG-GMBH", "client": {}, "location": { "country": "DE", "city": "Frankfurt am Main", "state": "Hesse" }, "services": [ "IPSEC" ] }, "source": { "name": "spur", "type": "managed", "url": "https://DUMMY-URL.us" }, "type": "IP", "category": "hosting_proxy", "intention": "suspicious" } ] }, "network": { "client": { "geoip": { "continent": { "code": "EU", "name": "Europe" }, "country": { "name": "Germany", "iso_code": "DE" }, "subdivision": { "name": "Hesse", "iso_code": "DE-HE" }, "as": { "number": "AS16509", "route": "DUMMY_CIDR", "domain": "DUMMY-DOMAIN.com", "name": "DUMMY-AS-NAME, Inc.", "type": "hosting" }, "city": { "name": "Frankfurt am Main" }, "timezone": "Europe/Berlin", "ipAddress": " ", "location": { "latitude": 50.11552, "longitude": 8.68417 } }, "ip": " " } }, "status": "info", "timestamp": "2025-02-13T08:35:41Z", "emitted_source": "edge" }, "_id": "AZT-cxO1AAA63poCZjbsDgAA", "source": "audit", "message": "POST request made to /api/ui/frontend_telemetry/metrics by dummy.user@example.com with response 202", "status": "info", "tags": [ "source:audit" ] } ]このサンプルでは、リソース(ログ転送クエリ)に対するユーザーの変更について詳しく説明します。
{ "date": "2025-08-12T10:33:55.000Z", "attributes": { "evt": { "actor": { "type": "USER" }, "name": "Log Management" }, "metadata": { "dd": { "request_id": "DUMMY-REQUEST-ID" } }, "auth_method": "SESSION", "org": { "name": "DUMMY_ORG_NAME", "uuid": "DUMMY-ORG-UUID" }, "usr": { "created": "2025-05-13T13:33:27Z", "name": "John Doe", "id": "user.name@example.com", "uuid": "DUMMY-USER-UUID", "email": "user.name@example.com" }, "action": "modified", "http": { "status_code": 200, "url_details": { "path": "/api/ui/event-platform/logs/custom-destinations/DUMMY-DESTINATION-ID" }, "method": "PUT", "level": "info", "useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" }, "asset": { "modified_field": "query", "name": "Google Secops Logs", "id": "DUMMY-DESTINATION-ID", "type": "log_forwarding", "prev_value": { "data": { "attributes": { "query": "host:(DUMMY-HOST-PRD-01 OR DUMMY-HOST-PRD-02 OR DUMMY-HOST-PRD-03 OR DUMMY-HOST-STG-01 OR DUMMY-HOST-STG-02 OR DUMMY-HOST-STG-03 OR DUMMY-HOST-EMEA-01 OR DUMMY-HOST-STG-04 OR DUMMY-HOST-PRD-04) status:(notice OR warn OR error)" } } }, "new_value": { "data": { "attributes": { "query": "service:(sqb-connector-services OR nginx-ingress-controller) status:(notice OR warn OR error)" } } } }, "network": { "client": { "geoip": { "continent": { "code": "EU", "name": "Europe" }, "country": { "name": "United Kingdom", "iso_code": "GB" }, "subdivision": { "name": "DUMMY_CITY", "iso_code": "DUMMY_CODE" }, "as": { "number": "AS25180", "route": "DUMMY-CIDR-RANGE", "domain": "DUMMY-DOMAIN.com", "name": "DUMMY-ISP-NAME", "type": "hosting" }, "city": { "name": "London" }, "timezone": "Europe/London", "ipAddress": " ", "location": { "latitude": 51.50853, "longitude": -0.12574 } }, "ip": " " } }, "status": "info", "timestamp": "2025-08-12T10:33:55Z" }, "_id": "AZid2AB0AAAxoDbhbVS-EAAA", "source": "audit", "message": "user.name@example.com successfully changed query from \"host:(DUMMY-HOST-PRD-01 OR DUMMY-HOST-PRD-02 OR DUMMY-HOST-PRD-03 OR DUMMY-HOST-STG-01 OR DUMMY-HOST-STG-02 OR DUMMY-HOST-STG-03 OR DUMMY-HOST-EMEA-01 OR DUMMY-HOST-STG-04 OR DUMMY-HOST-PRD-04) status:(notice OR warn OR error)\" to \"service:(sqb-connector-services OR nginx-ingress-controller) status:(notice OR warn OR error)\" for custom destination \"Google Secops Logs\" (DUMMY-DESTINATION-ID)", "status": "info" }
UDM マッピング テーブル
| ログフィールド | UDM マッピング | 論理 |
|---|---|---|
_id |
read_only_udm.metadata.product_log_id |
_id フィールドから直接マッピングされます。 |
alert |
read_only_udm.security_result.about.resource.attribute.labels |
alert フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
attributes.@timestamp |
read_only_udm.metadata.event_timestamp |
イベントのタイムスタンプは attributes.@timestamp フィールドから抽出され、秒とナノ秒に変換されます。 |
attributes.@version |
read_only_udm.metadata.product_version |
attributes.@version フィールドから直接マッピングされます。 |
attributes.level_value |
read_only_udm.security_result.about.resource.attribute.labels |
attributes.level_value フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
attributes.logger_name |
read_only_udm.principal.application |
attributes.logger_name フィールドから直接マッピングされます。 |
attributes._trace.baggage._sli_service |
read_only_udm.additional.fields |
attributes._trace.baggage._sli_service フィールドから直接マッピングされ、追加フィールドとして追加されます。 |
attributes._trace.baggage.device_id |
read_only_udm.principal.asset.asset_id |
attributes._trace.baggage.device_id フィールドから直接マッピングされ、「Device Id:」という接頭辞が付いています。 |
attributes._trace.origin.operation |
read_only_udm.metadata.product_event_type |
attributes._trace.origin.operation フィールドから直接マッピングされます。 |
caller |
read_only_udm.security_result.about.resource.attribute.labels |
caller フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
component |
read_only_udm.security_result.about.resource.attribute.labels |
component フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
context.AlertName |
read_only_udm.security_result.threat_name |
context.AlertName フィールドから直接マッピングされます。 |
context.BusArch |
read_only_udm.security_result.about.resource.attribute.labels |
context.BusArch フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
context.CANDBVersion |
read_only_udm.security_result.about.resource.attribute.labels |
context.CANDBVersion フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
context.esn |
read_only_udm.security_result.about.resource.attribute.labels |
context.esn フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
context.ftcpVersion |
read_only_udm.security_result.about.resource.attribute.labels |
context.ftcpVersion フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
context.ingestMessageId |
read_only_udm.security_result.about.resource.attribute.labels |
context.ingestMessageId フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
context.redactedVin |
read_only_udm.security_result.about.resource.attribute.labels |
context.redactedVin フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
context.vehicleId |
read_only_udm.security_result.about.resource.attribute.labels |
context.vehicleId フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
date |
read_only_udm.metadata.collected_timestamp |
収集されたタイムスタンプは date フィールド(パーサーで date1 に名前変更)から抽出され、秒とナノ秒に変換されます。 |
host |
read_only_udm.principal.hostname |
host フィールドから直接マッピングされます。 |
message |
read_only_udm.security_result.about.resource.attribute.labels |
message フィールドが解析され、その一部が summary フィールドと json_data フィールドの入力に使用されます。残りの部分は Key-Value ペアとして扱われ、security_result オブジェクト内のラベルとして追加されます。 |
msg |
read_only_udm.security_result.about.resource.attribute.labels |
msg フィールドから抽出され、security_result オブジェクト内のラベルとして追加されます。 |
service |
read_only_udm.metadata.product_name |
service フィールドから直接マッピングされます。 |
status |
read_only_udm.security_result.severity |
重大度は status フィールドに基づいて決定されます。「INFO」、「DEBUG」、「debug」、「info」は「LOW」にマッピングされ、「WARN」は「MEDIUM」にマッピングされます。その他の値は、提供されたコード スニペットでは明示的にマッピングされていません。 |
tags |
read_only_udm.additional.fields |
tags 配列内の各タグは Key-Value ペアに解析され、追加フィールドとして追加されます。 |
| なし | read_only_udm.metadata.event_type |
host フィールドが存在する場合は「STATUS_UPDATE」に設定し、それ以外の場合は「GENERIC_EVENT」に設定します。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。