Recolha registos do Datadog
Vista geral
Este analisador extrai campos dos registos do Datadog, executa várias mutações e correspondência Grok para estruturar os dados e mapeia os campos extraídos para o UDM. Processa diferentes formatos de registo no campo message, incluindo pares de chave-valor e objetos JSON, e converte campos específicos em etiquetas compatíveis com UDM e campos adicionais.
Antes de começar
Certifique-se de que cumpre os seguintes pré-requisitos:
- Instância do Google SecOps.
- Acesso privilegiado ao Google Cloud IAM.
- Acesso privilegiado ao Cloud Storage.
logs_write_archiveacesso de utilizadores ao Datadog.
Opção 1: partilha de registos do Datadog através da configuração do Cloud Storage
Configure a integração do Datadog com a Google Cloud plataforma
- Configure uma integração para a Google Cloud Platform no Datadog. Para mais informações, consulte a configuração da integração do Datadog Google Cloud .
Crie um Google Cloud contentor de armazenamento
- Inicie sessão na Google Cloud consola.
Aceda à página Contentores do Cloud Storage.
Clique em Criar.
Na página Criar um depósito, introduza as informações do depósito. Após cada um dos passos seguintes, clique em Continuar para avançar para o passo seguinte:
Na secção Começar, faça o seguinte:
- Introduza um nome exclusivo que cumpra os requisitos do nome do contentor (por exemplo, datadog-data).
Para ativar o espaço de nomes hierárquico, clique na seta de expansão para expandir a secção Otimizar para cargas de trabalho orientadas para ficheiros e com grande volume de dados e, de seguida, selecione Ativar espaço de nomes hierárquico neste contentor.
Para adicionar uma etiqueta de grupo, clique na seta de expansão para expandir a secção Etiquetas.
Clique em Adicionar etiqueta e especifique uma chave e um valor para a etiqueta.
Na secção Escolha onde quer armazenar os seus dados, faça o seguinte:
- Selecione um Tipo de localização.
- Use o menu pendente do tipo de localização para selecionar uma Localização onde os dados de objetos no seu contentor vão ser armazenados permanentemente.
- Se selecionar o tipo de localização dupla região, também pode optar por ativar a replicação turbo através da caixa de verificação relevante.
- Para configurar a replicação entre contentores, expanda a secção Configurar replicação entre contentores.
Na secção Escolha uma classe de armazenamento para os seus dados, selecione uma classe de armazenamento predefinida para o contentor ou selecione Autoclass para a gestão automática da classe de armazenamento dos dados do contentor.
Na secção Escolha como controlar o acesso a objetos, selecione não para aplicar a prevenção de acesso público e selecione um modelo de controlo de acesso para os objetos do seu contentor.
Na secção Escolha como proteger os dados de objetos, faça o seguinte:
- Selecione qualquer uma das opções em Proteção de dados que quer definir para o seu contentor.
- Para escolher como os dados de objetos vão ser encriptados, clique na seta de expansão com a etiqueta Encriptação de dados e selecione um Método de encriptação de dados.
Clique em Criar.
Crie uma conta de serviço do Google Cloud
- Aceda a IAM e administrador > Contas de serviço.
- Crie uma nova conta de serviço.
- Atribua-lhe um nome descritivo (por exemplo, datadog-user).
- Conceda à conta de serviço a função de administrador de objetos de armazenamento no contentor do Cloud Storage que criou no passo anterior.
- Crie uma chave SSH para a conta de serviço.
- Transfira um ficheiro de chave JSON para a conta de serviço. Mantenha este ficheiro seguro.
Configure o Datadog para enviar registos para o Cloud Storage
- Inicie sessão no Datadog com uma conta privilegiada.
- Aceda a Registos > Encaminhamento de registos.
- Clique em + Criar novo arquivo.
- Selecione Google Cloud Storage.
- Introduza os parâmetros necessários e clique em Guardar.
Opção 2: partilha de registos do Datadog através da configuração do webhook
Configure feeds
Para configurar um feed, siga estes passos:
- Aceda a Definições do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na página seguinte, clique em Configurar um único feed.
- No campo Nome do feed, introduza um nome para o feed (por exemplo, Registos do Datadog).
- Selecione Webhook como o Tipo de origem.
- Selecione Datadog como o Tipo de registo.
- Clicar em Seguinte.
- Opcional: especifique valores para os seguintes parâmetros de entrada:
- Delimitador de divisão: o delimitador usado para separar linhas de registo, como
\n.
- Delimitador de divisão: o delimitador usado para separar linhas de registo, como
- Clicar em Seguinte.
- Reveja a configuração do feed no ecrã Finalizar e, de seguida, clique em Enviar.
- Clique em Gerar chave secreta para gerar uma chave secreta para autenticar este feed.
- Copie e armazene a chave secreta. Não pode ver esta chave secreta novamente. Se necessário, pode regenerar uma nova chave secreta, mas esta ação torna a chave secreta anterior obsoleta.
- No separador Detalhes, copie o URL do ponto final do feed do campo Informações do ponto final. Tem de especificar este URL do ponto final na sua aplicação cliente.
- Clique em Concluído.
Crie uma chave da API para o feed de webhook
Aceda à Google Cloud consola > Credenciais.
Clique em Criar credenciais e, de seguida, selecione Chave de API.
Restrinja o acesso da chave da API à API Chronicle.
Especifique o URL do ponto final
- Na aplicação cliente, especifique o URL do ponto final do HTTPS fornecido no feed do webhook.
Ative a autenticação especificando a chave da 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 da API como um cabeçalho em vez de a especificar no URL.
Se o seu cliente de webhook não suportar cabeçalhos personalizados, pode especificar a chave da API e a chave secreta através de parâmetros de consulta no seguinte formato:
ENDPOINT_URL?key=API_KEY&secret=SECRETSubstitua o seguinte:
ENDPOINT_URL: o URL do ponto final do feed.API_KEY: a chave da API para autenticar no Google SecOps.SECRET: a chave secreta que gerou para autenticar o feed.
Configure o Datadog para enviar registos para o webhook
- Inicie sessão no Datadog com uma conta privilegiada.
- Aceda a Registos > Encaminhamento de registos.
- 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.
- Atribua um nome ao destino: indique um nome descritivo para o webhook (por exemplo, Webhook do Google SecOps).
- Configure o destino: introduza o ENDPOINT_URL, seguido da API_KEY e do SECRET.
- Configure as definições de autenticação: adicione um cabeçalho geral, como o seguinte. Isto não vai deformar o pedido HTTP e permite 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 Guardar.
Links de referência
Registos de exemplo do Datadog suportados
Este exemplo de registo contém os dados de registo da aplicação não processados 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 um pedido de API e inclui metadados de inteligência de rede e 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 de utilizador a um recurso (consulta de encaminhamento de registos):
{ "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 da UDM
| Campo de registo | Mapeamento da UDM | Lógica |
|---|---|---|
_id |
read_only_udm.metadata.product_log_id |
Mapeado diretamente a partir do campo _id. |
alert |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo alert e adicionado como uma etiqueta no objeto security_result. |
attributes.@timestamp |
read_only_udm.metadata.event_timestamp |
A data/hora do evento é extraída do campo attributes.@timestamp e convertida em segundos e nanossegundos. |
attributes.@version |
read_only_udm.metadata.product_version |
Mapeado diretamente a partir 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 uma etiqueta no objeto security_result. |
attributes.logger_name |
read_only_udm.principal.application |
Mapeado diretamente a partir do campo attributes.logger_name. |
attributes._trace.baggage._sli_service |
read_only_udm.additional.fields |
Mapeado diretamente a partir do campo attributes._trace.baggage._sli_service e adicionado como um campo adicional. |
attributes._trace.baggage.device_id |
read_only_udm.principal.asset.asset_id |
Mapeado diretamente a partir do campo attributes._trace.baggage.device_id, com o prefixo "ID do dispositivo:". |
attributes._trace.origin.operation |
read_only_udm.metadata.product_event_type |
Mapeado diretamente a partir do campo attributes._trace.origin.operation. |
caller |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo caller e adicionado como uma etiqueta no objeto security_result. |
component |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo component e adicionado como uma etiqueta no objeto security_result. |
context.AlertName |
read_only_udm.security_result.threat_name |
Mapeado diretamente a partir do campo context.AlertName. |
context.BusArch |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo context.BusArch e adicionado como uma etiqueta no objeto security_result. |
context.CANDBVersion |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo context.CANDBVersion e adicionado como uma etiqueta no objeto security_result. |
context.esn |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo context.esn e adicionado como uma etiqueta no objeto security_result. |
context.ftcpVersion |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo context.ftcpVersion e adicionado como uma etiqueta no objeto security_result. |
context.ingestMessageId |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo context.ingestMessageId e adicionado como uma etiqueta no objeto security_result. |
context.redactedVin |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo context.redactedVin e adicionado como uma etiqueta no objeto security_result. |
context.vehicleId |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo context.vehicleId e adicionado como uma etiqueta no objeto security_result. |
date |
read_only_udm.metadata.collected_timestamp |
A data/hora recolhida é extraída do campo date (com o nome alterado para date1 no analisador) e convertida em segundos e nanossegundos. |
host |
read_only_udm.principal.hostname |
Mapeado diretamente a partir do campo host. |
message |
read_only_udm.security_result.about.resource.attribute.labels |
O campo message é analisado e partes do mesmo são usadas para preencher os campos summary e json_data. A parte restante é tratada como pares de chave-valor e adicionada como etiquetas no objeto security_result. |
msg |
read_only_udm.security_result.about.resource.attribute.labels |
Extraído do campo msg e adicionado como uma etiqueta no objeto security_result. |
service |
read_only_udm.metadata.product_name |
Mapeado diretamente a partir 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 fragmento de código fornecido. |
tags |
read_only_udm.additional.fields |
Cada etiqueta na matriz tags é analisada em pares de chave-valor e adicionada como campos adicionais. |
| 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 da Google SecOps.