Recopila registros de Elastic Defend
En este documento, se explica cómo transferir registros de Elastic Defend a Google Security Operations con Google Cloud Storage V2 y una función de Cloud Run.
Elastic Defend es una solución de detección y respuesta de endpoints (EDR) dentro de Elastic Security que proporciona capacidades de prevención, detección y respuesta con visibilidad profunda en los sistemas operativos Windows, macOS y Linux. Supervisa la ejecución de procesos, la actividad de archivos, las conexiones de red, las modificaciones del registro y las cargas de bibliotecas para detectar y prevenir amenazas a nivel del endpoint. Los datos se almacenan en Elasticsearch y se pueden recuperar con la API de Elasticsearch Search.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
- Una instancia de Google SecOps
- Un proyecto de Google Cloud con las siguientes APIs habilitadas:
- Cloud Storage
- Cloud Run Functions
- Cloud Scheduler
- Pub/Sub
- IAM
- Acceso a un clúster de Elasticsearch con Elastic Defend implementado
- Permisos para crear claves de API en Elasticsearch (privilegio de clúster
manage_security,manage_api_keyomanage_own_api_key) - Conectividad de red desde las funciones de Cloud Run a tu clúster de Elasticsearch
Crear un bucket de Google Cloud Storage
- Ve a la consola de Google Cloud.
- Selecciona tu proyecto o crea uno nuevo.
- En el menú de navegación, ve a Cloud Storage > Buckets.
- Haz clic en Crear bucket.
Proporciona los siguientes detalles de configuración:
Configuración Valor Asigna un nombre a tu bucket Ingresa un nombre global único (por ejemplo, elastic-defend-logs).Tipo de ubicación Elige según tus necesidades (región, birregional, multirregional) Ubicación Selecciona la ubicación (por ejemplo, us-central1).Clase de almacenamiento Estándar (recomendado para los registros a los que se accede con frecuencia) Control de acceso Uniforme (recomendado) Herramientas de protección Opcional: Habilita el control de versiones de objetos o la política de retención Haz clic en Crear.
Recopila credenciales de Elastic Defend
Para permitir que la función de Cloud Run recupere eventos de Elastic Defend, debes crear una clave de API con permisos de lectura en los flujos de datos de logs-endpoint.
Crea una clave de API con Kibana
- Accede a Kibana.
- En el menú de navegación o en el campo de búsqueda global, ve a Administración de pilas > Claves de API.
- Haz clic en Crear clave de API.
- En el campo Nombre, ingresa
Google SecOps Cloud Storage Integration. - En el campo Vencimiento, puedes establecer una fecha de vencimiento de forma opcional. De forma predeterminada, las claves de API no vencen.
- Haz clic en Controlar privilegios de seguridad.
- En la sección Índices, haz clic en Agregar privilegio de índice.
- Configura el privilegio de indexación:
- Índices: Ingresa
logs-endpoint.*. - Privilegios: Selecciona lectura.
- Índices: Ingresa
- Deja vacía la sección Privilegios del clúster (no se requieren privilegios del clúster).
- Haz clic en Crear clave de API.
Registra las credenciales de la API
Después de crear la clave de API, aparecerá un diálogo con tus credenciales:
Encoded: Es la clave de API codificada en base64 (por ejemplo,
VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==).También debes registrar la URL del extremo de Elasticsearch:
Para Elastic Cloud: El extremo se muestra en Cloud Console en la sección Elasticsearch de tu implementación (por ejemplo,
https://my-deployment.es.us-central1.gcp.cloud.es.io:443).Para Elasticsearch autoadministrado: Usa el nombre de host o la dirección IP de tu clúster de Elasticsearch con el puerto (por ejemplo,
https://elasticsearch.example.com:9200).
Crea una clave de API con Herramientas para desarrolladores (método alternativo)
Como alternativa, puedes crear una clave de API con las Herramientas para desarrolladores de Kibana:
- Accede a Kibana.
- Ve a Administración > Herramientas para desarrolladores.
En la consola, ejecuta el siguiente 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" } }La respuesta contiene las credenciales de tu clave de API:
{ "id": "VuaCfGcBCdbkQm-e5aOx", "name": "Google SecOps Cloud Storage Integration", "api_key": "ui2lp2axTNmsyakw9tvNnw", "encoded": "VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==" }Copia y guarda el valor codificado. Esta es la clave de API codificada en Base64 que usarás para la autenticación.
Crear cuenta de servicio
Crea una cuenta de servicio dedicada para la función de Cloud Run.
- En la consola de Google Cloud, ve a IAM y administración > Cuentas de servicio.
- Haz clic en Crear cuenta de servicio.
- Proporciona los siguientes detalles de configuración:
- Nombre de la cuenta de servicio: Ingresa
elastic-defend-collector. - Descripción de la cuenta de servicio: Ingresa
Service account for Elastic Defend log collection to GCS.
- Nombre de la cuenta de servicio: Ingresa
- Haz clic en Crear y continuar.
- En la sección Otorga a esta cuenta de servicio acceso al proyecto, agrega los siguientes roles:
- Haz clic en Seleccionar un rol y selecciona Administrador de objetos de Storage (
roles/storage.objectAdmin). - Haz clic en Agregar otro rol y selecciona Invocador de Cloud Run (
roles/run.invoker).
- Haz clic en Seleccionar un rol y selecciona Administrador de objetos de Storage (
- Haz clic en Continuar.
- Haz clic en Listo.
Crear tema de Pub/Sub
Crea un tema de Pub/Sub para activar la función de Cloud Run desde Cloud Scheduler.
- En la consola de Google Cloud, ve a Pub/Sub > Temas.
- Haz clic en Crear tema.
- Proporciona los siguientes detalles de configuración:
- ID del tema: Ingresa
elastic-defend-trigger. - Agregar una suscripción predeterminada: Déjala marcada
- ID del tema: Ingresa
- Haz clic en Crear.
Crear una función de Cloud Run
Crea una función de Cloud Run que recupere eventos de Elasticsearch y los escriba en GCS.
Crea la función
- En la consola de Google Cloud, ve a Cloud Run functions.
- Haz clic en Crear función.
Proporciona los siguientes detalles de configuración:
Configuración Valor Entorno 2ª gen. Nombre de la función elastic-defend-to-gcsRegión Selecciona la misma región que tu bucket de GCS. Tipo de activador Cloud Pub/Sub Tema de Cloud Pub/Sub Seleccionar elastic-defend-triggerMemoria asignada 512 MiB (aumenta para grandes volúmenes de datos) Tiempo de espera 540 segundos Cuenta de servicio del entorno de ejecución Seleccionar elastic-defend-collectorHaz clic en Siguiente.
Agrega variables del entorno
Agrega las siguientes variables de entorno en la sección Configuración del entorno de ejecución, la compilación, las conexiones y la seguridad:
Variable Valor GCS_BUCKETNombre de tu bucket de GCS (por ejemplo, elastic-defend-logs)GCS_PREFIXPrefijo para los archivos de registro (por ejemplo, elastic-defend)STATE_KEYNombre del archivo de estado (por ejemplo, state.json)ES_HOSTURL de Elasticsearch (por ejemplo, https://my-deployment.es.us-central1.gcp.cloud.es.io:443)ES_API_KEYClave de API codificada del paso de creación de credenciales MAX_RECORDSCantidad máxima de registros por ejecución (por ejemplo, 100000)PAGE_SIZECantidad de registros por solicitud de búsqueda (por ejemplo, 1000)LOOKBACK_HOURSHoras para revisar en la primera ejecución (por ejemplo, 24)
Agrega el código de la función
- Selecciona Python 3.11 como el Entorno de ejecución.
- Establece el Punto de entrada en
main. - En la sección Código fuente, selecciona Editor directo.
Reemplaza el contenido de
main.pycon el siguiente 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"Reemplaza el contenido de
requirements.txtpor lo siguiente:functions-framework==3.* google-cloud-storage==2.* requests==2.*Haz clic en Implementar.
Espera a que se complete la implementación correctamente.
Crea un trabajo de Cloud Scheduler
Crea un trabajo de Cloud Scheduler para activar la función de Cloud Run según un programa regular.
- En la consola de Google Cloud, ve a Cloud Scheduler.
- Haz clic en Crear trabajo.
Proporciona los siguientes detalles de configuración:
Configuración Valor Nombre elastic-defend-schedulerRegión Selecciona la misma región que tu Cloud Run Function Frecuencia */5 * * * *(cada 5 minutos)Zona horaria Selecciona tu zona horaria (por ejemplo, UTC).Haz clic en Continuar.
En la sección Configura la ejecución, haz lo siguiente:
- Tipo de destino: Selecciona Pub/Sub.
- Tema de Cloud Pub/Sub: Selecciona
elastic-defend-trigger. - Cuerpo del mensaje: Ingresa
{"run": true}.
Haz clic en Crear.
Recupera la cuenta de servicio de Google SecOps y configura el feed
Las Operaciones de seguridad de Google usan una cuenta de servicio única para leer datos de tu bucket de GCS. Debes otorgar acceso a tu bucket a esta cuenta de servicio.
Obtén el correo electrónico de la cuenta de servicio
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- Haz clic en Configura un feed único.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
Elastic Defend Events). - Selecciona Google Cloud Storage V2 como el Tipo de fuente.
- Selecciona Elastic Defend como el Tipo de registro.
Haz clic en Obtener cuenta de servicio. Se mostrará un correo electrónico único de la cuenta de servicio, por ejemplo:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopia esta dirección de correo electrónico para usarla en el siguiente paso.
Configura el feed
- Haz clic en Siguiente.
Especifica valores para los siguientes parámetros de entrada:
URL del bucket de almacenamiento: Ingresa el URI del bucket de GCS con la ruta de acceso del prefijo:
gs://elastic-defend-logs/elastic-defend/Reemplaza
elastic-defend-logspor el nombre de tu bucket de GCS.Opción de borrado de la fuente: Selecciona la opción de borrado según tu preferencia:
- Nunca: Nunca borra ningún archivo después de las transferencias (se recomienda para las pruebas).
- Borrar archivos transferidos: Borra los archivos después de la transferencia exitosa.
Borrar los archivos transferidos y los directorios vacíos: Borra los archivos y los directorios vacíos después de la transferencia exitosa.
Antigüedad máxima del archivo: Incluye los archivos modificados en la cantidad de días más reciente (el valor predeterminado es 180 días).
Espacio de nombres del recurso: Es el espacio de nombres del recurso.
Etiquetas de transmisión: Es la etiqueta que se aplicará a los eventos de este feed.
Haz clic en Siguiente.
Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Otorga permisos de IAM a la cuenta de servicio de Google SecOps
La cuenta de servicio de Google SecOps necesita el rol de visualizador de objetos de almacenamiento en tu bucket de GCS.
- Ve a Cloud Storage > Buckets.
- Haz clic en el nombre de tu bucket (por ejemplo,
elastic-defend-logs). - Ve a la pestaña Permisos.
- Haz clic en Otorgar acceso.
- Proporciona los siguientes detalles de configuración:
- Agregar principales: Pega el correo electrónico de la cuenta de servicio de Google SecOps.
- Asignar roles: Selecciona Visualizador de objetos de Storage.
Haz clic en Guardar.
Tabla de asignación de UDM
| Campo de registro | Asignación de 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 | Se combina con objetos de etiqueta que contienen valores de los campos enumerados. |
| _source.process.Ext.session_info.logon_type | extensions.auth.auth_details | Valor copiado directamente |
| _source.host.os.full | hardware.cpu_platform | Valor copiado directamente |
| _source.host.id | hardware.serial_number | Valor copiado directamente |
| _source.rule.description | metadata.description | Valor copiado directamente |
| _source.@timestamp | metadata.event_timestamp | Se convirtió con el filtro de fecha con los formatos ISO8601, aaaa-MM-ddTHH:mm:ss.SSSSSSSSSZ, aaaa-MM-ddTHH:mm:ss.SSSSSSZ, aaaa-MM-ddTHH:mm:ss.SSSZ y aaaa-MM-ddTHH:mm:ssZ. |
| metadata.event_type | Se establece en función de las condiciones index, event.action y has* | |
| metadata.log_type | Se estableció en "ELASTIC_DEFEND". | |
| metadata.product_event_type | Se establece en "File Events" si _index ~ events.file; "Library Events" si events.library; "Network Events" si events.network; "Process Events" si events.process; "Registry Events" si events.registry; "Security Events" si events.security; "API Events" si events.api; "Alerts" si .alert | |
| _id | metadata.product_log_id | Valor de _id si no está en ["", " ", "null", "N/A"] |
| _source.ecs.version | metadata.product_version | Valor copiado directamente |
| _source.network.type | network.application_protocol_version | Valor copiado directamente |
| _source.network.transport | network.ip_protocol | Se establece en "TCP" si coincide con (?i)tcp; "UDP" si coincide con (?i)udp; "ICMP" si coincide con (?i)icmp; de lo contrario, se establece en "UNKNOWN_IP_PROTOCOL". |
| _source.destination.as.organization.name | network.organization_name | Valor copiado directamente |
| _source.Endpoint.policy.applied.artifacts.global.identifiers | observer.file.names | Se combinó 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 | Se combina con objetos de etiqueta que contienen valores de los campos enumerados. |
| _source.Endpoint.policy.applied.artifacts.user.version | observer.user.attribute.labels | Se combinó con el objeto de etiqueta que contiene el valor de _source.Endpoint.policy.applied.artifacts.user.version |
| _source.host.os.full | principal.asset.hardware.cpu_platform | Valor copiado directamente |
| _source.host.id | principal.asset.hardware.serial_number | Valor copiado directamente |
| _source.host.name | principal.asset.hostname | Valor copiado directamente |
| _source.host.ip | principal.asset.ip | Se combinó de _source.host.ip |
| _source.host.os.type | principal.asset.platform_software.platform | Se establece en "WINDOWS" si coincide con (?i)windows; "LINUX" si coincide con (?i)linux; "MAC" si coincide con (?i)mac; "IOS" si coincide con (?i)ios; de lo contrario, se establece en "UNKNOWN_PLATFORM". |
| _source.host.os.kernel | principal.asset.platform_software.platform_patch_level | Valor copiado directamente |
| _source.event.created | principal.domain.creation_time | Se convirtió con el filtro de fecha con los formatos ISO8601, aaaa-MM-ddTHH:mm:ss.SSSSSSSSSZ, aaaa-MM-ddTHH:mm:ss.SSSSSSZ, aaaa-MM-ddTHH:mm:ss.SSSZ y aaaa-MM-ddTHH:mm:ssZ. |
| _source.user.domain | principal.domain.name | Valor copiado directamente |
| _source.process.thread.capabilities.effective | principal.file.capabilities_tags | Se combinó desde _source.process.thread.capabilities.effective |
| _source.process.executable | principal.file.full_path | Valor copiado directamente |
| _source.process.hash.md5 | principal.file.md5 | Valor copiado directamente |
| _source.file.name | principal.file.names | Se combinó desde _source.file.name |
| _source.process.hash.sha1 | principal.file.sha1 | Valor copiado directamente |
| _source.process.hash.sha256 | principal.file.sha256 | Valor copiado directamente |
| _source.host.hostname | principal.hostname | Valor copiado directamente |
| _source.host.ip | principal.ip | Se combinó de _source.host.ip |
| _source.host.mac | principal.mac | Se combinó de _source.host.mac después de reemplazar - por : |
| _source.host.os.Ext.variant | principal.platform_version | Valor copiado directamente |
| _source.source.port | principal.port | Se convierte en una cadena y, luego, en un número entero. |
| _source.process.command_line, _source.process.name | principal.process.command_line | Valor de _source.process.command_line si no está vacío; de lo contrario, de _source.process.name |
| _source.process.thread.capabilities.permitted | principal.process.file.capabilities_tags | Se combinó de _source.process.thread.capabilities.permitted |
| _source.process.executable | principal.process.file.full_path | Valor copiado directamente |
| _source.process.hash.md5 | principal.process.file.md5 | Valor copiado directamente |
| _source.process.hash.sha1 | principal.process.file.sha1 | Valor copiado directamente |
| _source.process.hash.sha256 | principal.process.file.sha256 | Valor copiado directamente |
| _source.process.parent.executable | principal.process.parent_process.file.full_path | Valor copiado directamente |
| _source.process.pid | principal.process.pid | Se convirtió en una cadena y, luego, se copió |
| _source.process.Ext.api.name | principal.resource.attribute.labels | Se fusionó con el objeto de etiqueta que contiene el valor de _source.process.Ext.api.name |
| _source.event.code | principal.resource.product_object_id | Valor copiado directamente |
| _source.group.name | principal.user.group_identifiers | Se combinó desde _source.group.name |
| _source.user.name | principal.user.userid | Valor copiado directamente |
| _source.user.id | principal.user.windows_sid | Valor de _source.user.id si coincide con la regex ^S-\\d-(\\\\d+-){1,14}\\\\d+$ |
| _source.file.Ext.malware_signature.primary.signature.hash.sha256 | security_result.about.file.sha256 | Valor copiado directamente |
| _source.event.outcome | security_result.action | Valor de _source.event.outcome, en mayúsculas, luego se establece en ALLOW si está en [SUCCESS, ALLOW], BLOCK si está en [FAILURE, DENY, SKIPPED, RATE_LIMIT], UNKNOWN_ACTION si es UNKNOWN |
| _source.event.action | security_result.action_details | Valor copiado directamente |
| _source.destination.geo.region_iso_code | security_result.associations | Se combinó con el objeto que contiene el nombre 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 | Se combina con el objeto que contiene el ID y el nombre de los campos enumerados. |
| _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 | Se combinó con objetos que contienen id, name, subtechnique_id y subtechnique_name de los campos enumerados. |
| _source.event.category | security_result.category_details | Se combinó de _source.event.category |
| _source.kibana.alert.rule.description | security_result.description | Valor copiado directamente |
| _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 | Se combina con objetos de etiqueta que contienen valores de los campos enumerados. |
| _source.rule.id, _source.kibana.alert.rule.rule_id | security_result.rule_id | Valor de _source.rule.id si no está vacío; de lo contrario, de _source.kibana.alert.rule.rule_id |
| _source.rule.name, _source.kibana.alert.rule.name | security_result.rule_name | Valor de _source.rule.name si no está vacío; de lo contrario, se toma de _source.kibana.alert.rule.name |
| _source.rule.ruleset | security_result.rule_set | Valor copiado directamente |
| security_result.severity | Se establece en "LOW"; si _index coincide con .alert, se establece en "HIGH"; si _source.kibana.alert.rule.parameters.severity coincide con (?i)LOW, se establece en "LOW". | |
| _source.message | security_result.summary | Valor copiado directamente |
| _source.file.Ext.malware_signature.primary.signature.id | security_result.threat_id | Valor copiado directamente |
| _source.file.Ext.malware_signature.primary.signature.name | security_result.threat_name | Valor copiado directamente |
| _source.source.address, _source.source.ip | src.asset.ip | Se fusionó de _source.source.address y _source.source.ip |
| _source.source.address, _source.source.ip | src.ip | Se fusionó de _source.source.address y _source.source.ip |
| _source.host.name | target.asset.hostname | Valor copiado directamente |
| _source.destination.address, _source.destination.ip | target.asset.ip | Se combinó de _source.destination.address y _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 si es events.file, _source.dll.path si es events.library, _source.process.executable si es events.process o events.api, _source.Target.process.executable si es events.api |
| _source.dll.hash.md5, _source.process.hash.md5 | target.file.md5 | Valor de _source.dll.hash.md5 si es events.library, _source.process.hash.md5 si es .alert |
| _source.dll.name, _source.process.name | target.file.names | Se fusionó de _source.dll.name si es events.library, _source.process.name si es .alert |
| _source.dll.hash.sha1, _source.process.hash.sha1 | target.file.sha1 | Valor de _source.dll.hash.sha1 si es events.library, _source.process.hash.sha1 si es .alert |
| _source.dll.hash.sha256, _source.process.hash.sha256 | target.file.sha256 | Valor de _source.dll.hash.sha256 si es events.library, _source.process.hash.sha256 si es .alert |
| _source.host.name | target.hostname | Valor copiado directamente |
| _source.destination.address, _source.destination.ip | target.ip | Se combinó de _source.destination.address y _source.destination.ip |
| _source.destination.geo.city_name | target.location.city | Valor copiado directamente |
| _source.destination.geo.country_name | target.location.country_or_region | Valor copiado directamente |
| _source.destination.geo.continent_name | target.location.name | Valor copiado directamente |
| _source.destination.geo.location.lat | target.location.region_coordinates.latitude | Se convirtió en una cadena y, luego, en un número de punto flotante. |
| _source.destination.geo.location.lon | target.location.region_coordinates.longitude | Se convirtió en una cadena y, luego, en un número de punto flotante. |
| _source.destination.geo.region_name | target.location.state | Valor copiado directamente |
| _source.data_stream.namespace | target.namespace | Valor copiado directamente |
| _source.destination.port | target.port | Se convierte en una cadena y, luego, en un número entero. |
| _source.process.command_line | target.process.command_line | Valor copiado directamente |
| _source.process.executable | target.process.file.full_path | Valor copiado directamente |
| _source.process.hash.md5 | target.process.file.md5 | Valor copiado directamente |
| _source.process.hash.sha1 | target.process.file.sha1 | Valor copiado directamente |
| _source.process.hash.sha256 | target.process.file.sha256 | Valor copiado directamente |
| _source.process.name | target.process.file.names | Se combinó desde _source.process.name |
| _source.registry.key | target.registry.registry_key | Valor copiado directamente |
| _source.registry.path | target.registry.registry_value_data | Valor copiado directamente |
| _source.registry.value | target.registry.registry_value_name | Valor copiado directamente |
| _source.data_stream.dataset | target.resource.name | Valor copiado directamente |
| _source.process.entity_id | target.user.userid | Valor copiado directamente |
| metadata.product_name | Se estableció en "Elastic Defend" | |
| metadata.vendor_name | Se estableció en "Elástico" |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.