Coletar registros do Datadog

Compatível com:

Visão geral

Esse analisador extrai campos de registros do Datadog, realiza várias mutações e correspondências Grok para estruturar os dados e mapeia os campos extraídos para o UDM. Ele processa diferentes formatos de registro no campo message, incluindo pares de chave-valor e objetos JSON, e converte campos específicos em rótulos compatíveis com UDM e outros campos.

Antes de começar

Verifique se você atende os seguintes pré-requisitos:

  • Instância do Google SecOps.
  • Acesso privilegiado ao Google Cloud IAM.
  • Acesso privilegiado ao Cloud Storage.
  • logs_write_archive acesso do usuário ao Datadog.

Opção 1: compartilhamento de registros do Datadog pela configuração do Cloud Storage

Configurar a integração do Datadog com a plataforma Google Cloud

Criar um Google Cloud bucket do Storage

  1. Faça login no console Google Cloud .
  2. Acesse a página Buckets do Cloud Storage.

    Acessar buckets

  3. Clique em Criar.

  4. Na página Criar um bucket, insira as informações do seu bucket. Após cada uma das etapas a seguir, clique em Continuar para prosseguir para a próxima etapa:

    1. Na seção Começar, faça o seguinte:

      1. Insira um nome exclusivo que atenda aos requisitos de nome de bucket (por exemplo, datadog-data).
      2. Para ativar o namespace hierárquico, clique na seta de expansão para abrir a seção Otimizar para cargas de trabalho orientadas a arquivos e com uso intensivo de dados e selecione Ativar namespace hierárquico neste bucket.

      3. Para adicionar um rótulo de bucket, clique na seta de expansão para abrir a seção Rótulos.

      4. Clique em Adicionar rótulo e especifique uma chave e um valor para o rótulo.

    2. Na seção Escolha onde armazenar seus dados, faça o seguinte:

      1. Selecione um tipo de local.
      2. Use o menu suspenso do tipo de local para selecionar um Local em que os dados de objetos no bucket serão armazenados permanentemente.
        • Se você selecionar o tipo de local birregional, também poderá ativar a replicação turbo usando a caixa de seleção relevante.
      3. Para configurar a replicação entre buckets, abra a seção Configurar a replicação entre buckets.
    3. Na seção Escolha uma classe de armazenamento para seus dados, selecione uma classe de armazenamento padrão para o bucket ou selecione Classe automática para gerenciamento automático da classe de armazenamento dos dados do bucket.

    4. Na seção Escolha como controlar o acesso a objetos, selecione não para aplicar a prevenção de acesso público e escolha um modelo de controle de acesso para os objetos do bucket.

    5. Na seção Escolha como proteger os dados do objeto, faça o seguinte:

      1. Selecione qualquer uma das opções em Proteção de dados que você quer definir para o bucket.
      2. Para escolher como os dados dos objetos serão criptografados, clique na seta de expansão identificada como Criptografia de dados e selecione um Método de criptografia de dados.
  5. Clique em Criar.

Criar uma conta de serviço do Google Cloud

  1. Acesse IAM e administrador > Contas de serviço.
  2. Crie uma nova conta de serviço.
  3. Dê um nome descritivo a ele (por exemplo, datadog-user).
  4. Conceda à conta de serviço o papel Administrador de objetos do Storage no bucket do Cloud Storage criado na etapa anterior.
  5. Crie uma chave SSH para a conta de serviço.
  6. Faça o download de um arquivo de chave JSON para a conta de serviço. Mantenha esse arquivo em segurança.

Configurar o Datadog para enviar registros ao Cloud Storage

  1. Faça login no Datadog usando uma conta privilegiada.
  2. Acesse Registros > Encaminhamento de registros.
  3. Clique em + Criar novo arquivo.
  4. Selecione Google Cloud Storage.
  5. Insira os parâmetros obrigatórios e clique em Salvar.

Opção 2: compartilhamento de registros do Datadog pela configuração de webhook

Configurar feeds

Para configurar um feed, siga estas etapas:

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Na próxima página, clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, Registros do Datadog).
  5. Selecione Webhook como o Tipo de origem.
  6. Selecione Datadog como o Tipo de registro.
  7. Clique em Próxima.
  8. Opcional: especifique valores para os seguintes parâmetros de entrada:
    • Delimitador de divisão: o delimitador usado para separar linhas de registro, como \n.
  9. Clique em Próxima.
  10. Revise a configuração do feed na tela Finalizar e clique em Enviar.
  11. Clique em Gerar chave secreta para autenticar o feed.
  12. Copie e armazene a chave secreta. Não é possível ver essa chave secreta novamente. Se necessário, você pode gerar uma nova chave secreta, mas isso torna a anterior obsoleta.
  13. Na guia Detalhes, copie o URL do endpoint do feed no campo Informações do endpoint. É necessário especificar esse URL de endpoint no aplicativo cliente.
  14. Clique em Concluído.

Criar uma chave de API para o feed de webhook

  1. Acesse console doGoogle Cloud > Credenciais.

    Ir para Credenciais

  2. Clique em Criar credenciais e, em seguida, selecione Chave de API.

  3. Restrinja o acesso da chave de API à API Chronicle.

Especifique o URL do endpoint

  1. No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed de webhook.
  2. Ative a autenticação especificando a chave de API e a chave secreta como parte do cabeçalho personalizado no seguinte formato:

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

    Recomendação: especifique a chave de API como um cabeçalho em vez de no URL.

  3. Se o cliente de webhook não aceitar cabeçalhos personalizados, especifique a chave de API e a chave secreta usando parâmetros de consulta no seguinte formato:

    ENDPOINT_URL?key=API_KEY&secret=SECRET
    

    Substitua:

    • ENDPOINT_URL: o URL do endpoint do feed.
    • API_KEY: a chave de API para autenticar no Google SecOps.
    • SECRET: a chave secreta gerada para autenticar o feed.

Configurar o Datadog para enviar registros ao webhook

  1. Faça login no Datadog usando uma conta privilegiada.
  2. Acesse Registros > Encaminhamento de registros.
  3. Selecione Destinos personalizados.
  4. Clique em + Criar um novo destino.
  5. Especifique valores para os seguintes parâmetros de entrada:
    1. Escolha um tipo de destino: selecione HTTP.
    2. Nomeie o destino: dê um nome descritivo ao webhook (por exemplo, Webhook do Google SecOps).
    3. Configure o destino: insira o ENDPOINT_URL, seguido pela API_KEY e pelo SECRET.
    4. Configure as configurações de autenticação: adicione um cabeçalho geral como o seguinte. Isso não vai deformar a solicitação HTTP e permitirá que o Datadog conclua a criação do webhook.
      • Nome do cabeçalho: Accept.
      • Valor do cabeçalho: application/json.
    5. Clique em Salvar.

Registros de amostra do Datadog compatíveis

  • Esta amostra de registro contém os dados brutos do registro do aplicativo incorporados como uma string JSON no campo data:

    {
    "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
        }
        }
    }
    }
    
  • Este exemplo detalha uma solicitação de API e inclui metadados de rede e de inteligência de ameaças:

    [
    {
        "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"
        ]
    }
    ]
    
  • Este exemplo detalha uma modificação feita por um usuário em um recurso (consulta de encaminhamento de registros):

    {
    "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"
    }
    

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
_id read_only_udm.metadata.product_log_id Mapeado diretamente do campo _id.
alert read_only_udm.security_result.about.resource.attribute.labels Extraído do campo alert e adicionado como um rótulo no objeto security_result.
attributes.@timestamp read_only_udm.metadata.event_timestamp O carimbo de data/hora do evento é extraído do campo attributes.@timestamp e convertido em segundos e nanossegundos.
attributes.@version read_only_udm.metadata.product_version Mapeado diretamente do campo attributes.@version.
attributes.level_value read_only_udm.security_result.about.resource.attribute.labels Extraído do campo attributes.level_value e adicionado como um rótulo no objeto security_result.
attributes.logger_name read_only_udm.principal.application Mapeado diretamente do campo attributes.logger_name.
attributes._trace.baggage._sli_service read_only_udm.additional.fields Mapeado diretamente do campo attributes._trace.baggage._sli_service e adicionado como um campo extra.
attributes._trace.baggage.device_id read_only_udm.principal.asset.asset_id Mapeado diretamente do campo attributes._trace.baggage.device_id, com o prefixo "Device Id:".
attributes._trace.origin.operation read_only_udm.metadata.product_event_type Mapeado diretamente do campo attributes._trace.origin.operation.
caller read_only_udm.security_result.about.resource.attribute.labels Extraído do campo caller e adicionado como um rótulo no objeto security_result.
component read_only_udm.security_result.about.resource.attribute.labels Extraído do campo component e adicionado como um rótulo no objeto security_result.
context.AlertName read_only_udm.security_result.threat_name Mapeado diretamente do campo context.AlertName.
context.BusArch read_only_udm.security_result.about.resource.attribute.labels Extraído do campo context.BusArch e adicionado como um rótulo no objeto security_result.
context.CANDBVersion read_only_udm.security_result.about.resource.attribute.labels Extraído do campo context.CANDBVersion e adicionado como um rótulo no objeto security_result.
context.esn read_only_udm.security_result.about.resource.attribute.labels Extraído do campo context.esn e adicionado como um rótulo no objeto security_result.
context.ftcpVersion read_only_udm.security_result.about.resource.attribute.labels Extraído do campo context.ftcpVersion e adicionado como um rótulo no objeto security_result.
context.ingestMessageId read_only_udm.security_result.about.resource.attribute.labels Extraído do campo context.ingestMessageId e adicionado como um rótulo no objeto security_result.
context.redactedVin read_only_udm.security_result.about.resource.attribute.labels Extraído do campo context.redactedVin e adicionado como um rótulo no objeto security_result.
context.vehicleId read_only_udm.security_result.about.resource.attribute.labels Extraído do campo context.vehicleId e adicionado como um rótulo no objeto security_result.
date read_only_udm.metadata.collected_timestamp O carimbo de data/hora coletado é extraído do campo date (renomeado como date1 no analisador) e convertido em segundos e nanossegundos.
host read_only_udm.principal.hostname Mapeado diretamente do campo host.
message read_only_udm.security_result.about.resource.attribute.labels O campo message é analisado, e partes dele são usadas para preencher os campos summary e json_data. A parte restante é tratada como pares de chave-valor e adicionada como rótulos no objeto security_result.
msg read_only_udm.security_result.about.resource.attribute.labels Extraído do campo msg e adicionado como um rótulo no objeto security_result.
service read_only_udm.metadata.product_name Mapeado diretamente do campo service.
status read_only_udm.security_result.severity A gravidade é determinada com base no campo status. "INFO", "DEBUG", "debug" e "info" são mapeados para "LOW", "WARN" é mapeado para "MEDIUM", e outros valores não são mapeados explicitamente no snippet de código fornecido.
tags read_only_udm.additional.fields Cada tag na matriz tags é analisada em pares de chave-valor e adicionada como campos extras.
N/A read_only_udm.metadata.event_type Definido como "STATUS_UPDATE" se o campo host estiver presente e "GENERIC_EVENT" caso contrário.

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.