Coletar registros do Datadog
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_archiveacesso 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
- Configure uma integração para o Google Cloud Platform no Datadog. Para mais informações, consulte a configuração da integração do Datadog Google Cloud .
Criar um Google Cloud bucket do Storage
- Faça login no console Google Cloud .
Acesse a página Buckets do Cloud Storage.
Clique em Criar.
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:
Na seção Começar, faça o seguinte:
- Insira um nome exclusivo que atenda aos requisitos de nome de bucket (por exemplo, datadog-data).
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.
Para adicionar um rótulo de bucket, clique na seta de expansão para abrir a seção Rótulos.
Clique em Adicionar rótulo e especifique uma chave e um valor para o rótulo.
Na seção Escolha onde armazenar seus dados, faça o seguinte:
- Selecione um tipo de local.
- 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.
- Para configurar a replicação entre buckets, abra a seção Configurar a replicação entre buckets.
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.
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.
Na seção Escolha como proteger os dados do objeto, faça o seguinte:
- Selecione qualquer uma das opções em Proteção de dados que você quer definir para o bucket.
- 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.
Clique em Criar.
Criar uma conta de serviço do Google Cloud
- Acesse IAM e administrador > Contas de serviço.
- Crie uma nova conta de serviço.
- Dê um nome descritivo a ele (por exemplo, datadog-user).
- Conceda à conta de serviço o papel Administrador de objetos do Storage no bucket do Cloud Storage criado na etapa anterior.
- Crie uma chave SSH para a conta de serviço.
- 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
- Faça login no Datadog usando uma conta privilegiada.
- Acesse Registros > Encaminhamento de registros.
- Clique em + Criar novo arquivo.
- Selecione Google Cloud Storage.
- 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:
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo, Registros do Datadog).
- Selecione Webhook como o Tipo de origem.
- Selecione Datadog como o Tipo de registro.
- Clique em Próxima.
- Opcional: especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão: o delimitador usado para separar linhas de registro, como
\n.
- Delimitador de divisão: o delimitador usado para separar linhas de registro, como
- Clique em Próxima.
- Revise a configuração do feed na tela Finalizar e clique em Enviar.
- Clique em Gerar chave secreta para autenticar o feed.
- 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.
- 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.
- Clique em Concluído.
Criar uma chave de API para o feed de webhook
Acesse console doGoogle Cloud > Credenciais.
Clique em Criar credenciais e, em seguida, selecione Chave de API.
Restrinja o acesso da chave de API à API Chronicle.
Especifique o URL do endpoint
- No aplicativo cliente, especifique o URL do endpoint HTTPS fornecido no feed de webhook.
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 = SECRETRecomendação: especifique a chave de API como um cabeçalho em vez de no URL.
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=SECRETSubstitua:
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
- Faça login no Datadog usando uma conta privilegiada.
- Acesse Registros > Encaminhamento de registros.
- Selecione Destinos personalizados.
- Clique em + Criar um novo destino.
- Especifique valores para os seguintes parâmetros de entrada:
- Escolha um tipo de destino: selecione HTTP.
- Nomeie o destino: dê um nome descritivo ao webhook (por exemplo, Webhook do Google SecOps).
- Configure o destino: insira o ENDPOINT_URL, seguido pela API_KEY e pelo SECRET.
- 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.
- Nome do cabeçalho:
- Clique em Salvar.
Links de referência
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.