Coletar registros do Elastic Defend
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_keyoumanage_own_api_key) - Conectividade de rede das funções do Cloud Run com o cluster do Elasticsearch
Criar um bucket do Google Cloud Storage.
- Acesse o Console do Google Cloud.
- Selecione seu projeto ou crie um novo.
- No menu de navegação, acesse Cloud Storage > Buckets.
- Clique em Criar bucket.
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 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
- Faça login no Kibana.
- No menu de navegação ou no campo de pesquisa global, acesse Gerenciamento de pilha > Chaves de API.
- Clique em Criar chave de API.
- No campo Nome, use
Google SecOps Cloud Storage Integration. - No campo Validade, defina uma data de validade, se quiser. Por padrão, as chaves de API não expiram.
- Clique em Controlar privilégios de segurança.
- Na seção Índices, clique em Adicionar privilégio de índice.
- Configure o privilégio de índice:
- Índices: insira
logs-endpoint.*. - Privilégios: selecione leitura.
- Índices: insira
- Deixe a seção Privilégios do cluster vazia. Nenhum privilégio é necessário.
- 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:
- Faça login no Kibana.
- Acesse Gerenciamento > Ferramentas para desenvolvedores.
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" } }A resposta contém as credenciais da chave de API:
{ "id": "VuaCfGcBCdbkQm-e5aOx", "name": "Google SecOps Cloud Storage Integration", "api_key": "ui2lp2axTNmsyakw9tvNnw", "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==" }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.
- No console do Google Cloud, acesse IAM e administrador > Contas de serviço.
- Clique em Criar conta de serviço.
- 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
- Nome da conta de serviço: insira
- Clique em Criar e continuar.
- Na seção Conceder acesso a essa conta de serviço ao projeto, adicione os seguintes papéis:
- Clique em Selecionar um papel e escolha Administrador de objetos do Storage (
roles/storage.objectAdmin). - Clique em Adicionar outro papel e selecione Invocador do Cloud Run (
roles/run.invoker).
- Clique em Selecionar um papel e escolha Administrador de objetos do Storage (
- Clique em Continuar.
- 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.
- No console do Google Cloud, acesse Pub/Sub > Tópicos.
- Clique em Criar tópico.
- Informe os seguintes detalhes de configuração:
- ID do tópico: insira
elastic-defend-trigger - Adicionar uma assinatura padrão: deixe marcada
- ID do tópico: insira
- 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
- No console do Google Cloud, acesse Funções do Cloud Run.
- Clique em Criar função.
Informe os seguintes detalhes de configuração:
Configuração Valor Ambiente 2ª geração Nome da função elastic-defend-to-gcsRegiã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-triggerMemó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-collectorClique 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_BUCKETNome do bucket do GCS (por exemplo, elastic-defend-logs)GCS_PREFIXPrefixo para arquivos de registro (por exemplo, elastic-defend)STATE_KEYNome do arquivo de estado (por exemplo, state.json)ES_HOSTURL do Elasticsearch (por exemplo, https://my-deployment.es.us-central1.gcp.cloud.es.io:443)ES_API_KEYChave de API codificada da etapa de criação de credenciais MAX_RECORDSNúmero máximo de registros por execução (por exemplo, 100000)PAGE_SIZENúmero de registros por solicitação de pesquisa (por exemplo, 1000)LOOKBACK_HOURSHoras para analisar na primeira execução (por exemplo, 24)
Adicionar o código da função
- Selecione Python 3.11 como o Ambiente de execução.
- Defina o Ponto de entrada como
main. - Na seção Código-fonte, selecione Editor in-line.
Substitua o conteúdo de
main.pypelo 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"Substitua os conteúdos de
requirements.txtpelo seguinte:functions-framework==3.* google-cloud-storage==2.* requests==2.*Clique em Implantar.
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.
- No console do Google Cloud, acesse o Cloud Scheduler.
- Clique em Criar job.
Informe os seguintes detalhes de configuração:
Configuração Valor Nome elastic-defend-schedulerRegiã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).Clique em Continuar.
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}.
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
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Elastic Defend Events). - Selecione Google Cloud Storage V2 como o Tipo de origem.
- Selecione Elastic Defend como o Tipo de registro.
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.comCopie esse endereço de e-mail para usar na próxima etapa.
Configurar o feed
- Clique em Próxima.
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-logspelo 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
Clique em Próxima.
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.
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket (por exemplo,
elastic-defend-logs). - Acesse a guia Permissões.
- Clique em Conceder acesso.
- 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.
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.