Buscar datos de contexto de entidad

Disponible en:

La función Contexto de entidad en la búsqueda mejora las investigaciones de seguridad y la respuesta a incidentes, ya que permite a los usuarios buscar y ver eventos de contexto relacionados con entidades en su cuenta de Google Security Operations. A diferencia de las búsquedas limitadas al esquema de eventos estándar del modelo de datos unificado (UDM), esta función responde a la necesidad de buscar más allá de los datos de eventos del UDM, incluido el contexto de las entidades del UDM, y proporciona información más detallada sobre los incidentes de seguridad.

Principales ventajas

  • Los analistas de seguridad y los cazadores de amenazas pueden consultar información contextual sobre las entidades.
  • Ayuda a analizar las causas principales, buscar amenazas y realizar análisis forenses.
  • Los usuarios pueden realizar búsquedas estadísticas sobre el contexto de las entidades para comprender los patrones de telemetría y las entidades afectadas mediante el análisis de telemetría.

Puedes usar el contexto de las entidades para obtener información valiosa de tus resultados de búsqueda de las siguientes formas:

  • Buscar usando nombres de campos de entidades de UDM: crea tus consultas de búsqueda usando nombres de campos de entidades de UDM. Por ejemplo, para encontrar todos los eventos de contexto asociados a un nombre de host específico, crea una búsqueda con graph.entity.hostname.
  • Acceder a la pestaña Vista general: la pestaña Vista general ofrece un resumen general de las entidades encontradas en tu búsqueda. Para ello, utiliza la información de la consulta que introduce un usuario. En la página Resumen se muestra información sobre los tipos de entidades, como DOMAIN_NAME, IP_ADDRESS, ASSET, USER, FILE, GROUP y RESOURCE.
  • Usar la pestaña Entidad: en la pestaña Entidad se muestran todos los eventos de contexto de entidad recibidos, incluidos los subcomponentes, como Tendencia a lo largo del tiempo, Filtro de instantánea, Agregaciones y Eventos. Las entidades se clasifican en entidades temporales y entidades atemporales, que se muestran en pestañas independientes.
  • Ver agregados: los agregados se muestran en los campos, de forma similar a la búsqueda de eventos de UDM. Las agregaciones se clasifican en tipos de contexto: contexto de entidad, contexto derivado y contexto global.

Caso práctico: investigar una cuenta de usuario vulnerada

Imagina la siguiente situación: un analista de seguridad necesita investigar una cuenta de usuario que podría estar en peligro (email@empresa.com). Sigue estos pasos para investigar:

  1. Identificar al usuario cuya cuenta se ha visto vulnerada: una alerta indica que se ha identificado la cuenta email@company.com como sospechosa.

  2. Recoger información del contexto de la entidad: obtén datos contextuales sobre el usuario para comprender el alcance y el impacto.

  3. Ejecutar consultas: usa Contexto de entidad en la búsqueda para ejecutar las siguientes consultas:

    • graph.entity.user.email_addresses = "email@company.com" para obtener información sobre el usuario.
    • graph.entity.user.email_addresses = "email@company.com" AND graph.metadata.product_name = "Google Cloud Compute Context" para consultar el nombre del producto y otros metadatos.
  4. Analizar la pestaña Vista general: la pestaña Vista general muestra el resumen de la entidad del usuario, que incluye lo siguiente:

    • Comprueba las marcas de tiempo de First Seen Hour y Last Seen Hour.
  • Revisa los nombres de host, las direcciones IP y las direcciones MAC (si están disponibles).
  • Inspecciona el modelo de hardware, la plataforma del SO y la versión de la plataforma.
  1. Examinar la pestaña Eventos: consulta los eventos asociados a este usuario, incluidos los intentos de inicio de sesión y las anomalías.

  2. Resumen de reseñas: identifica patrones y anomalías en los datos de contexto de las entidades, distribuidos en contexto de la entidad, contexto derivado y contexto global.

Para buscar datos de contexto de entidad, use nombres de campos de entidad de UDM en sus consultas de búsqueda:

  • graph.entity.hostname
  • graph.entity.ip = "8.8.8.8" and graph.metadata.entity_type = "ASSET"

En los resultados de búsqueda se muestra información clave sobre las entidades, como la siguiente:

  • Metadatos de entidad
  • Métricas (First Seen Hour, Last Seen Hour)
  • Relaciones (Entity, Direction, Entity_label, Entity_type, Relationship)
  • En función del tipo de entidad, se incluyen campos específicos, como Principal_ip para los recursos, Mail_id para los usuarios, File_name para los hashes o archivos, y Domain_name y IP_address para los dominios.

Ejemplos de contexto de entidad en la búsqueda

En esta sección se proporcionan ejemplos prácticos para usar la función Contexto de entidad de UDM con el fin de analizar las estadísticas de las entidades.

Para ver los orígenes y tipos de contexto disponibles, ejecuta la siguiente búsqueda de estadísticas de entidades de UDM en la búsqueda de UDM:

graph.metadata.source_type = $sourceType
graph.metadata.entity_type = $entityType
match:
  $sourceType, $entityType
outcome:
  $total = count(graph.metadata.product_entity_id)
order:
  $sourceType, $total desc
limit:
  100

El selector de hora muestra los datos activos del gráfico de entidades, no el momento en el que se ingirieron los datos de contexto.

Como la búsqueda de entidades de UDM usa la interfaz de búsqueda de UDM estándar, puedes usar funciones como el panel Agregaciones (para ver los valores superiores o inferiores), la tabla de resultados y los resultados ampliados de Estadísticas de UDM.

Ejemplo: Ver ENTITY_TYPE distintos

Para ampliar la búsqueda de entidades de UDM, puede incluir la fuente de registro, el espacio de nombres y una matriz de resultados para mostrar los ENTITY_TYPEs distintos observados, como se indica a continuación:

graph.metadata.source_type = "ENTITY_CONTEXT"
$logType = strings.to_upper(graph.metadata.event_metadata.base_labels.log_types)
$namespace = strings.to_upper(graph.metadata.event_metadata.base_labels.namespaces)
match:
  $logType, $namespace
outcome:
  $total = count(graph.metadata.product_entity_id)
  $entityTypes = array_distinct(graph.metadata.entity_type)
order:
  $logType, $total desc
limit:
  100

Ejemplo: Refinar el conjunto de entidades

Puedes acotar un conjunto específico de entidades con la función de pivote de búsqueda de UDM. Esta acotación genera una consulta de YARA-L como la siguiente:

graph.metadata.source_type = "ENTITY_CONTEXT"
$logType = strings.to_upper( graph.metadata.event_metadata.base_labels.log_types )
$namespace = strings.to_upper( graph.metadata.event_metadata.base_labels.namespaces )
AND strings.to_upper( graph.metadata.event_metadata.base_labels.log_types ) = "WINDOWS_AD"
AND strings.to_upper( graph.metadata.event_metadata.base_labels.namespaces ) = "ACME"

Contexto derivado

Google SecOps proporciona los siguientes tipos de contexto derivado:

  • Marcas de tiempo first_seen y last_seen de cada ENTITY_TYPE
  • Prevalence: número de recursos que han accedido a un ENTITY_TYPE determinado.

Marcas de tiempo First Seen Hour y Last Seen Hour

Google SecOps realiza análisis estadísticos de los datos entrantes y enriquece los registros de contexto de las entidades con las marcas de tiempo first_seen y last_seen:

  • El campo first_seen_hour registra la hora en la que se detectó por primera vez una entidad en el entorno del cliente.
  • El campo last_seen_hour registra la hora de la observación más reciente de esa entidad.

Usuarios con una hora de primera visita en los últimos 7 días:

graph.metadata.entity_type = "USER"
graph.entity.user.userid != ""
graph.entity.user.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)

Dominios vistos por primera vez en los últimos 7 días:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return FQDN
graph.entity.domain.name = /^([a-zA-Z0–9]([a-zA-Z0–9-]{0,61}[a-zA-Z0–9])?\.)+[a-zA-Z]{2,}$/
graph.entity.domain.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)

Archivos (hashes) observados en los últimos 7 días:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "FILE"
//graph.entity.file.md5 != ""
//graph.entity.file.sha1 != ""
graph.entity.file.sha256 != ""
graph.entity.file.first_seen_time.hours >= timestamp.current_hours() - (86400 * 7)

ENTITY_TYPE representa un hash FILE, por ejemplo, entity.file.hash. En el objeto hash, el tipo puede ser uno de los siguientes:

  • md5
  • sha1
  • sha256

Para buscar un hash específico, puedes ejecutar una búsqueda de entidades de UDM del tipo de hash en cuestión:

// This will search ENTITY, DERIVED, and GLOBAL Source Types
graph.metadata.entity_type = "FILE"
graph.entity.file.sha256 = "eb5db1feadda5351c3b8fc0770e9f4c173484df5dc4a785bd1bdce7806a9e498"

Direcciones IP

Los ENTITY_TYPES derivados de IP_ADDRESS pueden representar entidades internas o externas.

La siguiente búsqueda de estadísticas de entidades de UDM identifica IP_ADDRESSES observadas recientemente y usa funciones de agregado (en la sección de resultados) para contarlas por bloque CIDR:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "IP_ADDRESS"
//note, for IP addresses the first seen is under artifact, not ip
graph.entity.artifact.first_seen_time.hours >= timestamp.current_hours()-(86400 * 7)
outcome:
  $total = count(graph.metadata.product_entity_id)
  $classA = sum(if(net.ip_in_range_cidr(graph.entity.ip, "10.0.0.0/8"),1,0))
  $classB = sum(if(net.ip_in_range_cidr(graph.entity.ip, "172.16.0.0/12"),1,0))
  $classC = sum(if(net.ip_in_range_cidr(graph.entity.ip, "192.168.0.0/16"),1,0))
  $classD = sum(if(net.ip_in_range_cidr(graph.entity.ip, "224.0.0.0/4"),1,0))
  // we shouldn't see results here…
  $classE = sum(if(net.ip_in_range_cidr(graph.entity.ip, "240.0.0.0/4"),1,0))
  $thisNetwork = sum(if(net.ip_in_range_cidr(graph.entity.ip, "0.0.0.0/8"),1,0))
  $loopback = sum(if(net.ip_in_range_cidr(graph.entity.ip, "127.0.0.0/8"),1,0))
  $linklocal = sum(if(net.ip_in_range_cidr(graph.entity.ip, "169.254.0.0/16"),1,0))
  $benchmark = sum(if(net.ip_in_range_cidr(graph.entity.ip, "198.18.0.0/15"),1,0))
  $cgnat = sum(if(net.ip_in_range_cidr(graph.entity.ip, "10.64.0.0/10"),1,0))

Para investigar más a fondo un intervalo inusual o inesperado, puedes hacer una búsqueda de entidades de UDM:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "IP_ADDRESS"
net.ip_in_range_cidr(graph.entity.ip, "198.18.0.0/15")

Prevalencia

La prevalencia siempre es del tipo DERIVED_CONTEXT.

La siguiente búsqueda de entidades de UDM identifica nombres de dominio que se observan con poca frecuencia. Estos dominios se asocian específicamente con como máximo un recurso distinto al día, durante el periodo de la consulta (day_max = 1), y como máximo un recurso distinto en los 10 días anteriores (rolling_max = 1).

Este patrón es útil para detectar dominios con una interacción limitada en tu entorno:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return specific TLDs where the FQDN is more than X characters
//graph.entity.domain.name = /^.{40,}\.(?:sx|cc|st|ac|lc|wd|vg|tv|cm|gd)$/
graph.entity.domain.prevalence.rolling_max = 1
graph.entity.domain.prevalence.day_max = 1

También puedes convertirla en una búsqueda agregada de estadísticas de entidades de UDM y agregar los resultados:

graph.metadata.source_type = "DERIVED_CONTEXT"
graph.metadata.entity_type = "DOMAIN_NAME"
//optional, filter to only return FQDN
graph.entity.domain.name = /^.{40,}\.(?:sx|cc|st|ac|lc|wd|vg|tv|cm|gd)$/
$domain = graph.entity.domain.name
$length = strings.length(graph.entity.domain.name)
$tld = strings.extract_domain(graph.entity.domain.name)
graph.entity.domain.prevalence.day_max = 1
graph.entity.domain.prevalence.rolling_max = 1
match:
  $domain, $tld, $length
limit:
  10

Búsquedas básicas de campos de entidades de UDM

A continuación, se muestran otros ejemplos de cómo usar la función Contexto de entidad en la búsqueda de Google SecOps, según las fuentes disponibles:

  • graph.entity.hostname
  • graph.entity.ip = "8.8.8.8" and graph.metadata.entity_type = "ASSET"
  • principal.ip
  • principal.hostname="baz"
  • principal.ip="1.2.3.4"
  • network.dns.questions.name="youtube.com"

Crear una tabla dinámica a partir de campos de entidad

Usa los campos de entidad para crear tablas dinámicas y explorar datos relacionados. Estos son algunos ejemplos de campos de la tabla dinámica:

  • network.email.to
  • network.email.cc
  • principal.process.file.fileMetadata.pe.importHash
  • principal.process.file.sha256
  • network.dns.questions.name

Información sobre los campos dinámicos

Las fuentes hacen referencia a campos estructurados dinámicos con prefijos, como additional. Puede buscar estos campos en los eventos de UDM.

Consideraciones sobre el control de acceso

Se impone un límite de 50 eventos en los datos de contexto globales y se eliminan las referencias a los controles de acceso.

Las siguientes fuentes proporcionan asistencia para el contexto global:

  • Navegación segura
  • Relaciones de VirusTotal
  • WHOIS
  • Mayúsculas
  • IOC de Intel de código abierto (OPEN_SOURCE_INTEL_IOC)
  • IoCs de brechas activas de Mandiant (MANDIANT_ACTIVE_BREACH_IOC)
  • IoC de Mandiant Fusion (MANDIANT_FUSION_IOC)

Limitaciones

  • Límites de volumen: 1 millón de resultados acumulados para datos con y sin marca de tiempo.
  • Datos de contexto global: hay un límite de 50 filas para los datos de contexto global sensibles, como UPPERCASE_VT_PROTECTED, MANDIANT_ACTIVE_BREACH_IOC, MANDIANT_FUSION_IOC y VIRUS_TOTAL_CONNECTIONS, que se muestran a los usuarios con el ámbito de acceso a datos global.
  • Coherencia de datos: los datos de Última vez visto pueden tardar hasta 2 horas en reflejarse. Es posible que las entidades relacionadas solo muestren un subconjunto de las entidades que aparecen en un evento.
  • Funciones no admitidas:

    • Búsquedas inversas en campos de entidades, búsquedas de campos agrupados, baja prevalencia y mapa de calor.
    • No se pueden combinar consultas de contexto de entidad y de evento.

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.