Coletar registros do Elastic Defend

Compatível com:

Este documento explica como ingerir registros do Elastic Defend no Google Security Operations usando o Google Cloud Storage V2 com uma função do Cloud Run.

O Elastic Defend é uma solução de detecção e resposta de endpoints (EDR) no Elastic Security que oferece recursos de prevenção, detecção e resposta com visibilidade detalhada nos sistemas operacionais Windows, macOS e Linux. Ele monitora a execução de processos, a atividade de arquivos, as conexões de rede, as modificações de registro e os carregamentos de biblioteca para detectar e prevenir ameaças no nível do endpoint. Os dados são armazenados no Elasticsearch e podem ser recuperados usando a API Elasticsearch Search.

Antes de começar

Verifique se você tem os pré-requisitos a seguir:

  • Uma instância do Google SecOps
  • Um projeto do Google Cloud com as seguintes APIs ativadas:
    • Cloud Storage
    • Cloud Run Functions
    • Cloud Scheduler
    • Pub/Sub
    • IAM
  • Acesso a um cluster do Elasticsearch com o Elastic Defend implantado
  • Permissões para criar chaves de API no Elasticsearch (privilégio de cluster manage_security, manage_api_key ou manage_own_api_key)
  • Conectividade de rede das funções do Cloud Run com o cluster do Elasticsearch

Criar um bucket do Google Cloud Storage.

  1. Acesse o Console do Google Cloud.
  2. Selecione seu projeto ou crie um novo.
  3. No menu de navegação, acesse Cloud Storage > Buckets.
  4. Clique em Criar bucket.
  5. Informe os seguintes detalhes de configuração:

    Configuração Valor
    Nomeie seu bucket Insira um nome exclusivo globalmente, por exemplo, elastic-defend-logs.
    Tipo de local Escolha com base nas suas necessidades (região, birregional, multirregional)
    Local Selecione o local (por exemplo, us-central1).
    Classe de armazenamento Padrão (recomendado para registros acessados com frequência)
    Controle de acesso Uniforme (recomendado)
    Ferramentas de proteção Opcional: ativar o controle de versões de objetos ou a política de retenção
  6. Clique em Criar.

Coletar credenciais do Elastic Defend

Para permitir que a função do Cloud Run recupere eventos do Elastic Defend, crie uma chave de API com permissões de leitura nos fluxos de dados logs-endpoint.

Criar chave de API usando o Kibana

  1. Faça login no Kibana.
  2. No menu de navegação ou no campo de pesquisa global, acesse Gerenciamento de pilha > Chaves de API.
  3. Clique em Criar chave de API.
  4. No campo Nome, use Google SecOps Cloud Storage Integration.
  5. No campo Validade, defina uma data de validade, se quiser. Por padrão, as chaves de API não expiram.
  6. Clique em Controlar privilégios de segurança.
  7. Na seção Índices, clique em Adicionar privilégio de índice.
  8. Configure o privilégio de índice:
    • Índices: insira logs-endpoint.*.
    • Privilégios: selecione leitura.
  9. Deixe a seção Privilégios do cluster vazia. Nenhum privilégio é necessário.
  10. Clique em Criar chave de API.

Registrar credenciais de API

Depois de criar a chave de API, uma caixa de diálogo vai mostrar suas credenciais:

  • Codificada: a chave de API codificada em base64 (por exemplo, VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==)

    Você também precisa registrar o URL do endpoint do Elasticsearch:

  • Para o Elastic Cloud: o endpoint é exibido no Console do Cloud na seção Elasticsearch da sua implantação (por exemplo, https://my-deployment.es.us-central1.gcp.cloud.es.io:443).

  • Para o Elasticsearch autogerenciado: use o nome do host ou o endereço IP do cluster do Elasticsearch com a porta (por exemplo, https://elasticsearch.example.com:9200).

Criar uma chave de API usando as ferramentas de desenvolvimento (método alternativo)

Como alternativa, crie uma chave de API usando as ferramentas de desenvolvimento do Kibana:

  1. Faça login no Kibana.
  2. Acesse Gerenciamento > Ferramentas para desenvolvedores.
  3. No console, execute o seguinte comando:

    POST /_security/api_key
    {
      "name": "Google SecOps Cloud Storage Integration",
      "role_descriptors": {
        "chronicle_reader": {
          "indices": [
            {
              "names": ["logs-endpoint.*"],
              "privileges": ["read"]
            }
          ]
        }
      },
      "metadata": {
        "application": "google-chronicle-gcs",
        "environment": "production"
      }
    }
    
  4. A resposta contém as credenciais da chave de API:

    {
      "id": "VuaCfGcBCdbkQm-e5aOx",
      "name": "Google SecOps Cloud Storage Integration",
      "api_key": "ui2lp2axTNmsyakw9tvNnw",
      "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw=="
    }
    
  5. Copie e salve o valor encoded. Essa é a chave de API codificada em base64 que você vai usar para autenticação.

Criar conta de serviço

Crie uma conta de serviço dedicada para a função do Cloud Run.

  1. No console do Google Cloud, acesse IAM e administrador > Contas de serviço.
  2. Clique em Criar conta de serviço.
  3. Informe os seguintes detalhes de configuração:
    • Nome da conta de serviço: insira elastic-defend-collector
    • Descrição da conta de serviço: insira Service account for Elastic Defend log collection to GCS
  4. Clique em Criar e continuar.
  5. Na seção Conceder acesso a essa conta de serviço ao projeto, adicione os seguintes papéis:
    1. Clique em Selecionar um papel e escolha Administrador de objetos do Storage (roles/storage.objectAdmin).
    2. Clique em Adicionar outro papel e selecione Invocador do Cloud Run (roles/run.invoker).
  6. Clique em Continuar.
  7. Clique em Concluído.

Criar tópico Pub/Sub

Crie um tópico do Pub/Sub para acionar a função do Cloud Run no Cloud Scheduler.

  1. No console do Google Cloud, acesse Pub/Sub > Tópicos.
  2. Clique em Criar tópico.
  3. Informe os seguintes detalhes de configuração:
    • ID do tópico: insira elastic-defend-trigger
    • Adicionar uma assinatura padrão: deixe marcada
  4. Clique em Criar.

Criar função do Cloud Run

Crie uma função do Cloud Run que recupere eventos do Elasticsearch e os grave no GCS.

Criar a função

  1. No console do Google Cloud, acesse Funções do Cloud Run.
  2. Clique em Criar função.
  3. Informe os seguintes detalhes de configuração:

    Configuração Valor
    Ambiente 2ª geração
    Nome da função elastic-defend-to-gcs
    Região Selecione a mesma região do seu bucket do GCS.
    Tipo de gatilho Cloud Pub/Sub
    Tópico do Cloud Pub/Sub Selecionar elastic-defend-trigger
    Memória alocada 512 MiB (aumente para grandes volumes de dados)
    Tempo limite 540 segundos
    Conta de serviço do ambiente de execução Selecionar elastic-defend-collector
  4. Clique em Próxima.

Adicionar variáveis de ambiente

  • Adicione as seguintes variáveis de ambiente na seção Configurações de ambiente de execução, build, conexões e segurança:

    Variável Valor
    GCS_BUCKET Nome do bucket do GCS (por exemplo, elastic-defend-logs)
    GCS_PREFIX Prefixo para arquivos de registro (por exemplo, elastic-defend)
    STATE_KEY Nome do arquivo de estado (por exemplo, state.json)
    ES_HOST URL do Elasticsearch (por exemplo, https://my-deployment.es.us-central1.gcp.cloud.es.io:443)
    ES_API_KEY Chave de API codificada da etapa de criação de credenciais
    MAX_RECORDS Número máximo de registros por execução (por exemplo, 100000)
    PAGE_SIZE Número de registros por solicitação de pesquisa (por exemplo, 1000)
    LOOKBACK_HOURS Horas para analisar na primeira execução (por exemplo, 24)

Adicionar o código da função

  1. Selecione Python 3.11 como o Ambiente de execução.
  2. Defina o Ponto de entrada como main.
  3. Na seção Código-fonte, selecione Editor in-line.
  4. Substitua o conteúdo de main.py pelo seguinte código:

    import os
    import json
    import datetime
    import base64
    import requests
    from google.cloud import storage
    
    GCS_BUCKET = os.environ["GCS_BUCKET"]
    GCS_PREFIX = os.environ.get("GCS_PREFIX", "elastic-defend")
    STATE_KEY = os.environ.get("STATE_KEY", "state.json")
    ES_HOST = os.environ["ES_HOST"]
    ES_API_KEY = os.environ["ES_API_KEY"]
    MAX_RECORDS = int(os.environ.get("MAX_RECORDS", "100000"))
    PAGE_SIZE = int(os.environ.get("PAGE_SIZE", "1000"))
    LOOKBACK_HOURS = int(os.environ.get("LOOKBACK_HOURS", "24"))
    
    INDEX_PATTERN = "logs-endpoint.*"
    SEARCH_PATH = f"/{INDEX_PATTERN}/_search"
    
    def _gcs_client():
        return storage.Client()
    
    def _load_state(bucket):
        blob = bucket.blob(f"{GCS_PREFIX}/{STATE_KEY}")
        if blob.exists():
            return json.loads(blob.download_as_text())
        return {}
    
    def _save_state(bucket, state):
        blob = bucket.blob(f"{GCS_PREFIX}/{STATE_KEY}")
        blob.upload_from_string(
            json.dumps(state),
            content_type="application/json",
        )
    
    def _build_query(gte_ts, sort_after=None):
        body = {
            "size": PAGE_SIZE,
            "query": {
                "range": {
                    "@timestamp": {
                        "gte": gte_ts,
                        "format": "strict_date_optional_time",
                    }
                }
            },
            "sort": [
                {"@timestamp": {"order": "asc"}},
                {"_shard_doc": "asc"},
            ],
        }
        if sort_after:
            body["search_after"] = sort_after
        return body
    
    def _search(session, body):
        url = f"{ES_HOST.rstrip('/')}{SEARCH_PATH}"
        resp = session.post(
            url,
            json=body,
            headers={
                "Authorization": f"ApiKey {ES_API_KEY}",
                "Content-Type": "application/json",
            },
            timeout=120,
        )
        resp.raise_for_status()
        return resp.json()
    
    def _write_ndjson(bucket, records, ts_label):
        if not records:
            return
        now = datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")
        blob_name = f"{GCS_PREFIX}/{ts_label}/{now}.ndjson"
        blob = bucket.blob(blob_name)
        ndjson = "\n".join(json.dumps(r, separators=(",", ":")) for r in records)
        blob.upload_from_string(ndjson, content_type="application/x-ndjson")
        print(f"Wrote {len(records)} records to gs://{GCS_BUCKET}/{blob_name}")
    
    def main(event, context):
        """Cloud Run function entry point triggered by Pub/Sub."""
        client = _gcs_client()
        bucket = client.bucket(GCS_BUCKET)
    
        state = _load_state(bucket)
        sort_after = state.get("sort_after")
    
        if state.get("last_timestamp"):
            gte_ts = state["last_timestamp"]
        else:
            gte_ts = (
                datetime.datetime.utcnow()
                - datetime.timedelta(hours=LOOKBACK_HOURS)
            ).strftime("%Y-%m-%dT%H:%M:%S.%fZ")
    
        session = requests.Session()
        total = 0
        batch = []
        last_ts = gte_ts
        ts_label = datetime.datetime.utcnow().strftime("%Y/%m/%d/%H")
    
        while total < MAX_RECORDS:
            body = _build_query(gte_ts, sort_after)
            result = _search(session, body)
            hits = result.get("hits", {}).get("hits", [])
    
            if not hits:
                break
    
            for hit in hits:
                doc = hit.get("_source", {})
                doc["_id"] = hit.get("_id")
                doc["_index"] = hit.get("_index")
                batch.append(doc)
    
                hit_ts = doc.get("@timestamp", last_ts)
                if hit_ts > last_ts:
                    last_ts = hit_ts
    
            sort_after = hits[-1].get("sort")
            total += len(hits)
    
            if len(batch) >= PAGE_SIZE:
                _write_ndjson(bucket, batch, ts_label)
                batch = []
    
            if len(hits) < PAGE_SIZE:
                break
    
        if batch:
            _write_ndjson(bucket, batch, ts_label)
    
        new_state = {
            "last_timestamp": last_ts,
            "sort_after": sort_after,
        }
        _save_state(bucket, new_state)
        print(f"Done. Fetched {total} records. State: {json.dumps(new_state)}")
        return f"OK: {total} records"
    
  5. Substitua os conteúdos de requirements.txt pelo seguinte:

    functions-framework==3.*
    google-cloud-storage==2.*
    requests==2.*
    
  6. Clique em Implantar.

  7. Aguarde a conclusão da implantação.

Criar o job do Cloud Scheduler

Crie um job do Cloud Scheduler para acionar a função do Cloud Run em uma programação regular.

  1. No console do Google Cloud, acesse o Cloud Scheduler.
  2. Clique em Criar job.
  3. Informe os seguintes detalhes de configuração:

    Configuração Valor
    Nome elastic-defend-scheduler
    Região Selecione a mesma região da sua função do Cloud Run.
    Frequência */5 * * * * (a cada 5 minutos)
    Fuso horário Selecione seu fuso horário (por exemplo, UTC).
  4. Clique em Continuar.

  5. Na seção Configurar a execução:

    • Tipo de destino: selecione Pub/Sub.
    • Tópico do Cloud Pub/Sub: selecione elastic-defend-trigger
    • Corpo da mensagem: insira {"run": true}.
  6. Clique em Criar.

Recuperar a conta de serviço do Google SecOps e configurar o feed

O Google SecOps usa uma conta de serviço exclusiva para ler dados do seu bucket do GCS. Você precisa conceder a essa conta de serviço acesso ao seu bucket.

Receber o e-mail da conta de serviço

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, Elastic Defend Events).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione Elastic Defend como o Tipo de registro.
  7. Clique em Receber conta de serviço. Um e-mail exclusivo da conta de serviço será exibido, por exemplo:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Copie esse endereço de e-mail para usar na próxima etapa.

Configurar o feed

  1. Clique em Próxima.
  2. Especifique valores para os seguintes parâmetros de entrada:

    • URL do bucket de armazenamento: insira o URI do bucket do GCS com o caminho do prefixo:

      gs://elastic-defend-logs/elastic-defend/
      

      Substitua elastic-defend-logs pelo nome do bucket do GCS.

    • Opção de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência:

      • Nunca: nunca exclui arquivos após as transferências (recomendado para testes).
      • Excluir arquivos transferidos: exclui os arquivos após a transferência bem-sucedida.
      • Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência bem-sucedida.

    • Idade máxima do arquivo: inclui arquivos modificados nos últimos dias. O padrão é 180 dias.

    • Namespace do recurso: o namespace do recurso

    • Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed

  3. Clique em Próxima.

  4. Revise a nova configuração do feed na tela Finalizar e clique em Enviar.

Conceder permissões do IAM à conta de serviço do Google SecOps

A conta de serviço do Google SecOps precisa do papel de Leitor de objetos do Storage no seu bucket do GCS.

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket (por exemplo, elastic-defend-logs).
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. Informe os seguintes detalhes de configuração:
    • Adicionar participantes: cole o e-mail da conta de serviço do Google SecOps.
    • Atribuir papéis: selecione Leitor de objetos do Storage.
  6. Clique em Salvar.

Tabela de mapeamento do UDM

Campo de registro Mapeamento do UDM Lógica
_source.agent.id, _source.agent.type, _source.agent.version, _source.host.architecture, _source.event.agent_id_status, _source.event.id, _source.user.id, _source.group.id, _source.data_stream.type, _source.agent.build.original additional.fields Mesclado com objetos de rótulo que contêm valores dos campos listados.
_source.process.Ext.session_info.logon_type extensions.auth.auth_details Valor copiado diretamente
_source.host.os.full hardware.cpu_platform Valor copiado diretamente
_source.host.id hardware.serial_number Valor copiado diretamente
_source.rule.description metadata.description Valor copiado diretamente
_source.@timestamp metadata.event_timestamp Convertido usando o filtro de data com os formatos ISO8601, aaaa-MM-ddTHH:mm:ss.SSSSSSSSSZ, aaaa-MM-ddTHH:mm:ss.SSSSSSZ, aaaa-MM-ddTHH:mm:ss.SSSZ e aaaa-MM-ddTHH:mm:ssZ
metadata.event_type Definido com base nas condições index, event.action e has*
metadata.log_type Definido como "ELASTIC_DEFEND"
metadata.product_event_type Definido como "Eventos de arquivo" se _index ~ events.file; "Eventos de biblioteca" se events.library; "Eventos de rede" se events.network; "Eventos de processo" se events.process; "Eventos de registro" se events.registry; "Eventos de segurança" se events.security; "Eventos de API" se events.api; "Alertas" se .alert
_id metadata.product_log_id Valor de _id se não estiver em ["", " ", "null", "N/A"]
_source.ecs.version metadata.product_version Valor copiado diretamente
_source.network.type network.application_protocol_version Valor copiado diretamente
_source.network.transport network.ip_protocol Definido como "TCP" se corresponder a (?i)tcp; "UDP" se (?i)udp; "ICMP" se (?i)icmp; caso contrário, "UNKNOWN_IP_PROTOCOL"
_source.destination.as.organization.name network.organization_name Valor copiado diretamente
_source.Endpoint.policy.applied.artifacts.global.identifiers observer.file.names Mesclado de _source.Endpoint.policy.applied.artifacts.global.identifiers
_source.Endpoint.policy.applied.artifacts.global.version, _source.Endpoint.policy.applied.artifacts.global.snapshot observer.resource.attribute.labels Mesclado com objetos de rótulo que contêm valores dos campos listados.
_source.Endpoint.policy.applied.artifacts.user.version observer.user.attribute.labels Mesclado com o objeto de rótulo que contém o valor de _source.Endpoint.policy.applied.artifacts.user.version
_source.host.os.full principal.asset.hardware.cpu_platform Valor copiado diretamente
_source.host.id principal.asset.hardware.serial_number Valor copiado diretamente
_source.host.name principal.asset.hostname Valor copiado diretamente
_source.host.ip principal.asset.ip Unido de _source.host.ip
_source.host.os.type principal.asset.platform_software.platform Definido como "WINDOWS" se corresponder a (?i)windows; "LINUX" se (?i)linux; "MAC" se (?i)mac; "IOS" se (?i)ios; caso contrário, "UNKNOWN_PLATFORM"
_source.host.os.kernel principal.asset.platform_software.platform_patch_level Valor copiado diretamente
_source.event.created principal.domain.creation_time Convertido usando o filtro de data com os formatos ISO8601, aaaa-MM-ddTHH:mm:ss.SSSSSSSSSZ, aaaa-MM-ddTHH:mm:ss.SSSSSSZ, aaaa-MM-ddTHH:mm:ss.SSSZ e aaaa-MM-ddTHH:mm:ssZ
_source.user.domain principal.domain.name Valor copiado diretamente
_source.process.thread.capabilities.effective principal.file.capabilities_tags Mesclado de _source.process.thread.capabilities.effective
_source.process.executable principal.file.full_path Valor copiado diretamente
_source.process.hash.md5 principal.file.md5 Valor copiado diretamente
_source.file.name principal.file.names Mesclado de _source.file.name
_source.process.hash.sha1 principal.file.sha1 Valor copiado diretamente
_source.process.hash.sha256 principal.file.sha256 Valor copiado diretamente
_source.host.hostname principal.hostname Valor copiado diretamente
_source.host.ip principal.ip Unido de _source.host.ip
_source.host.mac principal.mac Unido de _source.host.mac depois de substituir - por :
_source.host.os.Ext.variant principal.platform_version Valor copiado diretamente
_source.source.port principal.port Convertido para string e depois para número inteiro
_source.process.command_line, _source.process.name principal.process.command_line Valor de _source.process.command_line se não estiver vazio. Caso contrário, de _source.process.name.
_source.process.thread.capabilities.permitted principal.process.file.capabilities_tags Mesclado de _source.process.thread.capabilities.permitted
_source.process.executable principal.process.file.full_path Valor copiado diretamente
_source.process.hash.md5 principal.process.file.md5 Valor copiado diretamente
_source.process.hash.sha1 principal.process.file.sha1 Valor copiado diretamente
_source.process.hash.sha256 principal.process.file.sha256 Valor copiado diretamente
_source.process.parent.executable principal.process.parent_process.file.full_path Valor copiado diretamente
_source.process.pid principal.process.pid Convertido para string e copiado
_source.process.Ext.api.name principal.resource.attribute.labels Mesclado com o objeto de rótulo que contém o valor de _source.process.Ext.api.name
_source.event.code principal.resource.product_object_id Valor copiado diretamente
_source.group.name principal.user.group_identifiers Mesclado de _source.group.name
_source.user.name principal.user.userid Valor copiado diretamente
_source.user.id principal.user.windows_sid Valor de _source.user.id se corresponder à regex ^S-\\d-(\\\\d+-){1,14}\\\\d+$
_source.file.Ext.malware_signature.primary.signature.hash.sha256 security_result.about.file.sha256 Valor copiado diretamente
_source.event.outcome security_result.action Valor de _source.event.outcome, em maiúsculas, definido como ALLOW se estiver em [SUCCESS, ALLOW], BLOCK se estiver em [FAILURE, DENY, SKIPPED, RATE_LIMIT], UNKNOWN_ACTION se UNKNOWN
_source.event.action security_result.action_details Valor copiado diretamente
_source.destination.geo.region_iso_code security_result.associations Mesclado com o objeto que contém o nome de _source.destination.geo.region_iso_code
_source.kibana.alert.rule.parameters.threat.tactic.id, _source.kibana.alert.rule.parameters.threat.tactic.name security_result.attack_details.tactics Mesclado com o objeto que contém ID e nome dos campos listados.
_source.kibana.alert.rule.parameters.threat.technique.id, _source.kibana.alert.rule.parameters.threat.technique.name, _source.kibana.alert.rule.parameters.threat.technique.subtechnique.id, _source.kibana.alert.rule.parameters.threat.technique.subtechnique.name security_result.attack_details.techniques Mesclado com objetos que contêm id, name, subtechnique_id, subtechnique_name dos campos listados
_source.event.category security_result.category_details Mesclado de _source.event.category
_source.kibana.alert.rule.description security_result.description Valor copiado diretamente
_source.event.kind, _source.file.Ext.malware_signature.all_names, _source.file.Ext.malware_signature.identifier, _source.event.risk_score, _source.threat.tactic.reference, _source.threat.technique.reference, _source.threat.technique.subtechnique.reference security_result.detection_fields Mesclado com objetos de rótulo que contêm valores dos campos listados.
_source.rule.id, _source.kibana.alert.rule.rule_id security_result.rule_id Valor de _source.rule.id se não estiver vazio. Caso contrário, de _source.kibana.alert.rule.rule_id.
_source.rule.name, _source.kibana.alert.rule.name security_result.rule_name Valor de _source.rule.name se não estiver vazio. Caso contrário, de _source.kibana.alert.rule.name
_source.rule.ruleset security_result.rule_set Valor copiado diretamente
security_result.severity Definido como "LOW"; se _index corresponder a .alert, definido como "HIGH"; se _source.kibana.alert.rule.parameters.severity corresponder a (?i)LOW, definido como "LOW"
_source.message security_result.summary Valor copiado diretamente
_source.file.Ext.malware_signature.primary.signature.id security_result.threat_id Valor copiado diretamente
_source.file.Ext.malware_signature.primary.signature.name security_result.threat_name Valor copiado diretamente
_source.source.address, _source.source.ip src.asset.ip Unido de _source.source.address e _source.source.ip
_source.source.address, _source.source.ip src.ip Unido de _source.source.address e _source.source.ip
_source.host.name target.asset.hostname Valor copiado diretamente
_source.destination.address, _source.destination.ip target.asset.ip Unido de _source.destination.address e _source.destination.ip
_source.file.path, _source.dll.path, _source.process.executable, _source.Target.process.executable target.file.full_path Valor de _source.file.path se events.file, _source.dll.path se events.library, _source.process.executable se events.process ou events.api, _source.Target.process.executable se events.api
_source.dll.hash.md5, _source.process.hash.md5 target.file.md5 Valor de _source.dll.hash.md5 se events.library, _source.process.hash.md5 se .alert
_source.dll.name, _source.process.name target.file.names Mesclado de _source.dll.name se events.library, _source.process.name se .alert
_source.dll.hash.sha1, _source.process.hash.sha1 target.file.sha1 Valor de _source.dll.hash.sha1 se events.library, _source.process.hash.sha1 se .alert
_source.dll.hash.sha256, _source.process.hash.sha256 target.file.sha256 Valor de _source.dll.hash.sha256 se events.library, _source.process.hash.sha256 se .alert
_source.host.name target.hostname Valor copiado diretamente
_source.destination.address, _source.destination.ip target.ip Unido de _source.destination.address e _source.destination.ip
_source.destination.geo.city_name target.location.city Valor copiado diretamente
_source.destination.geo.country_name target.location.country_or_region Valor copiado diretamente
_source.destination.geo.continent_name target.location.name Valor copiado diretamente
_source.destination.geo.location.lat target.location.region_coordinates.latitude Convertido para string e depois para ponto flutuante
_source.destination.geo.location.lon target.location.region_coordinates.longitude Convertido para string e depois para ponto flutuante
_source.destination.geo.region_name target.location.state Valor copiado diretamente
_source.data_stream.namespace target.namespace Valor copiado diretamente
_source.destination.port target.port Convertido para string e depois para número inteiro
_source.process.command_line target.process.command_line Valor copiado diretamente
_source.process.executable target.process.file.full_path Valor copiado diretamente
_source.process.hash.md5 target.process.file.md5 Valor copiado diretamente
_source.process.hash.sha1 target.process.file.sha1 Valor copiado diretamente
_source.process.hash.sha256 target.process.file.sha256 Valor copiado diretamente
_source.process.name target.process.file.names Mesclado de _source.process.name
_source.registry.key target.registry.registry_key Valor copiado diretamente
_source.registry.path target.registry.registry_value_data Valor copiado diretamente
_source.registry.value target.registry.registry_value_name Valor copiado diretamente
_source.data_stream.dataset target.resource.name Valor copiado diretamente
_source.process.entity_id target.user.userid Valor copiado diretamente
metadata.product_name Definido como "Elastic Defend"
metadata.vendor_name Definido como "Elástico"

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