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 のインテグレーションを構成する

Google Cloud Storage バケットの作成

  1. Google Cloud コンソールにログインします。
  2. [Cloud Storage バケット] のページに移動します。

    [バケット] に移動

  3. [作成] をクリックします。

  4. [バケットの作成] ページでユーザーのバケット情報を入力します。以下のステップでは、操作を完了した後に [続行] をクリックして、次のステップに進みます。

    1. [始める] セクションで、次の操作を行います。

      1. バケット名の要件を満たす一意の名前を入力します(例: datadog-data)。
      2. 階層名前空間を有効にするには、展開矢印をクリックして [Optimize for file oriented and data-intensive workloads] セクションを開き、[このバケットで階層的な名前空間を有効にする] を選択します。

      3. バケットラベルを追加するには、展開矢印をクリックして [ラベル] セクションを開きます。

      4. [ラベルを追加] をクリックし、ラベルのキーと値を指定します。

    2. [データの保存場所の選択] セクションで、次の操作を行います。

      1. ロケーション タイプを選択してください。
      2. ロケーション タイプのプルダウン メニューを使用して、バケット内のオブジェクト データが永続的に保存されるロケーションを選択します。
        • ロケーション タイプとしてデュアルリージョンを選択した場合は、関連するチェックボックスを使用してターボ レプリケーションを有効にすることもできます。
      3. クロスバケット レプリケーションを設定するには、[クロスバケット レプリケーションを設定する] セクションを開きます。
    3. [データのストレージ クラスを選択する] セクションで、バケットのデフォルトのストレージ クラスを選択します。あるいは、Autoclass を選択して、バケットデータのストレージ クラスを自動的に管理します。

    4. [オブジェクトへのアクセスを制御する方法を選択する] セクションで、[なし] を選択して公開アクセスの防止を適用し、バケットのオブジェクトの [アクセス制御モデル] を選択します。

    5. [オブジェクト データを保護する方法を選択する] セクションで、次の操作を行います。

      1. [データ保護] で、バケットに設定するオプションを選択します。
      2. オブジェクト データの暗号化方法を選択するには、[データ暗号化] というラベルの付いた展開矢印をクリックし、データの暗号化方法を選択します。
  5. [作成] をクリックします。

Google Cloud サービス アカウントを作成する

  1. [IAM と管理] > [サービス アカウント] に移動します。
  2. 新しいサービス アカウントを作成します。
  3. わかりやすい名前を付けます(datadog-user など)。
  4. 前の手順で作成した Cloud Storage バケットに対する ストレージ オブジェクト管理者のロールをサービス アカウントに付与します。
  5. サービス アカウントの SSH キーを作成します。
  6. サービス アカウント用の JSON キーファイルをダウンロードします。このファイルは安全な場所に保管してください。

Cloud Storage にログを送信するように Datadog を構成する

  1. 特権アカウントを使用して Datadog にログインします。
  2. [Logs] > [Log Forwarding] に移動します。
  3. [+ Create New Archive] をクリックします。
  4. [Google Cloud Storage] を選択します。
  5. 必要なパラメータを入力し、[Save] をクリックします。

オプション 2: Webhook 構成による Datadog ログの共有

フィードを設定する

フィードを構成する手順は次のとおりです。

  1. [SIEM Settings] > [Feeds] に移動します。
  2. [Add New Feed] をクリックします。
  3. 次のページで [単一のフィードを設定] をクリックします。
  4. [Feed name] フィールドに、フィードの名前を入力します(例: Datadog Logs)。
  5. [Source type] として [Webhook] を選択します。
  6. [ログタイプ] として [Datadog] を選択します。
  7. [次へ] をクリックします。
  8. 省略可: 次の入力パラメータの値を指定します。
    • Split delimiter: ログ行を区切るために使用される区切り文字(\n など)。
  9. [次へ] をクリックします。
  10. [Finalize] 画面でフィードの設定を確認し、[Submit] をクリックします。
  11. [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
  12. 秘密鍵をコピーして保存します。この秘密鍵を再び表示することはできません。必要に応じて、新しい秘密鍵を再生成できますが、その場合以前の秘密鍵は無効になります。
  13. [詳細] タブで、[エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。 このエンドポイント URL をクライアント アプリケーション内で指定する必要があります。
  14. [完了] をクリックします。

Webhook フィード用の API キーを作成する

  1. Google Cloud コンソール > [認証情報] に移動します。

    [認証情報] に移動

  2. [認証情報を作成] をクリックして [API キー] を選択します。

  3. API キーのアクセスを Chronicle API に制限します。

エンドポイント URL を指定する

  1. クライアント アプリケーション内で、Webhook フィードで提供される HTTPS エンドポイント URL を指定します。
  2. 次の形式でカスタム ヘッダーの一部として API キーと秘密鍵を指定して、認証を有効にします。

    X-goog-api-key = API_KEY
    X-Webhook-Access-Key = SECRET
    

    推奨事項: API キーは URL 内で指定するのではなくヘッダーとして指定してください。

  3. Webhook クライアントがカスタム ヘッダーをサポートしていない場合は、次の形式のクエリ パラメータを使用して API キーと秘密鍵を指定できます。

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

    以下を置き換えます。

    • ENDPOINT_URL: フィード エンドポイントの URL。
    • API_KEY: Google SecOps に対する認証に使用する API キー。
    • SECRET: フィードの認証用に生成した秘密鍵。

Webhook にログを送信するように Datadog を構成する

  1. 特権アカウントを使用して Datadog にログインします。
  2. [Logs] > [Log Forwarding] に移動します。
  3. [Custom Destinations] を選択します。
  4. [+ Create a New Destination] をクリックします。
  5. 次の入力パラメータの値を指定します。
    1. 宛先の種類を選択する: [HTTP] を選択します。
    2. 宛先に名前を付ける: Webhook のわかりやすい名前を指定します(例: Google SecOps Webhook)。
    3. 宛先を構成する: ENDPOINT_URL の後に API_KEYSECRET を入力します。
    4. 認証設定を構成する: 次のような一般的なヘッダーを追加します。これにより、HTTP リクエストが不正な形式にならず、Datadog が Webhook の作成を完了できます。
      • ヘッダー名: Accept
      • ヘッダー値: application/json
    5. [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 のプロフェッショナルから回答を得ることができます。