Reglas de detección compuestas
La detección compuesta en Google SecOps implica conectar varias reglas de YARA-L. En este documento, se explica cómo compilar una regla compuesta. Para obtener más información, consulta Descripción general de las detecciones compuestas.
Comprende la estructura de la regla
Las reglas de detección compuestas siempre son reglas de varios eventos y siguen la misma estructura y sintaxis que una regla de un solo evento.
Una regla compuesta tiene los siguientes componentes esenciales:
Sección
events: Define tus entradas, es decir, las detecciones o los eventos específicos que analiza la regla.Sección
match: Especifica cómo se deben conectar las entradas durante un período definido.Sección
condition: Contiene la lógica final que determina si los eventos unidos cumplen con los criterios para activar una alerta.
Define las entradas en la sección events
El primer paso para crear una regla de detección compuesta es definir las entradas de la regla en la sección events. Las entradas para las reglas compuestas provienen de colecciones, que almacenan las detecciones generadas por otras búsquedas.
Google SecOps proporciona los siguientes dos métodos para acceder a los datos de las colecciones.
Cómo hacer referencia al contenido de detección con variables o metaetiquetas
Para acceder a los datos de una detección sin hacer referencia a los eventos originales del UDM, puedes usar variables outcome, variables match o etiquetas meta. Recomendamos este enfoque porque proporciona mayor flexibilidad y mejor compatibilidad en diferentes tipos de reglas.
Por ejemplo, varias reglas pueden almacenar una cadena (como una URL, un nombre de archivo o una clave de registro) en una variable outcome común si buscas esa cadena en diferentes contextos. Para acceder a esta cadena desde una regla compuesta, comienza con detection y busca la información pertinente con elementos del recurso Collection.
Ejemplo: Supongamos que una regla de detección produce la siguiente información:
Variable de resultado:
dest_domain = "cymbal.com"Campo de UDM:
target.hostname = "cymbal.com"
En la regla compuesta, puedes acceder a estos datos con las siguientes rutas:
detection.detection.outcomes["dest_domain"]para acceder a la variable de resultadodest_domaindetection.collection_elements.references.event.target.hostnamepara acceder al campotarget.hostnamede UDMdetection.time_window.start_time.secondspara acceder a la marca de tiempo de inicio de la detección
La API de Collection y la API de SecurityResult proporcionan acceso a lo siguiente:
- Valores de metadatos y resultados de detección (
detection.detection) - Eventos de UDM subyacentes de las reglas a las que se hace referencia (
collection_elements)
Contenido de detección de referencias con ID o nombre de regla
Puedes hacer referencia a una regla por su nombre o ID. Recomendamos este enfoque cuando tu lógica de detección depende de reglas específicas y deseas reducir los datos analizados solo a los resultados de esas reglas. Hacer referencia a reglas pertinentes por nombre o ID mejora el rendimiento y evita los tiempos de espera, ya que reduce los datos analizados. Por ejemplo, puedes consultar directamente campos como target.url o principal.ip a partir de una detección anterior conocida.
Haz referencia a una regla por su ID (recomendado): Usa el campo
detection.detection.rule_idpara hacer referencia a una regla por su ID. Puedes encontrar el ID de la regla en la URL de la regla en Google SecOps. Las reglas generadas por el usuario tienen IDs en el formatoru_UUID, mientras que las detecciones seleccionadas tienen IDs en el formatour_UUID. Por ejemplo:detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"Haz referencia a una regla por su nombre: Usa el campo
detection.detection.rule_namepara hacer referencia a una regla por su nombre. Puedes especificar el nombre exacto de la regla o usar una expresión regular para que coincida. Por ejemplo:detection.detection.rule_name = "My Rule Name"detection.detection.rule_name = "/PartOfName/"
Unir entradas en la sección match
Para conectar detecciones, eventos o entidades relacionados en una regla compuesta, define la sección match con las variables definidas en la sección events. Estas variables pueden incluir etiquetas de reglas, variables de resultado, variables de coincidencia, campos de detección o elementos de recopilación.
Para obtener información sobre la sintaxis, consulta Sintaxis de la sección de coincidencia.
Define la sección condition
Define la sección condition para evaluar los resultados de la sección match.
Si la condición es true, se genera una alerta. Para obtener información sobre la sintaxis, consulta Sintaxis de la sección Condición.
Aplica técnicas avanzadas a las reglas compuestas
En esta sección, se explica cómo aplicar técnicas avanzadas cuando compilas reglas compuestas.
Cómo combinar eventos y detecciones
Las reglas compuestas pueden combinar varias fuentes de datos, incluidos los eventos del UDM, los datos del gráfico de entidades y los campos de detección. Deben aplicarse las siguientes pautas:
Usa variables distintas por fuente: Asigna variables de evento únicas a cada fuente de datos (por ejemplo,
$epara los eventos y$dpara las detecciones), en la que la fuente de datos incluya eventos, entidades y detecciones.Unir fuentes en función del contexto compartido: Conecta fuentes de datos con valores comunes, como IDs de usuario, direcciones IP o nombres de dominio en las condiciones de tu regla.
Define un período de coincidencia: Siempre incluye una cláusula
matchcon un período que no supere las 48 horas.
Ejemplo: Combinación de eventos y detecciones
rule CheckCuratedDetection_with_EDR_and_EG {
meta:
author = "noone@cymbal.com"
events:
$d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
$d.detection.collection_elements.references.event.network.dns.questions.name = $domain
$d.detection.collection_elements.references.event.principal.asset.hostname = $hostname
$e.metadata.log_type = "LIMACHARLIE_EDR"
$e.metadata.product_event_type = "NETWORK_CONNECTIONS"
$domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
$hostname = re.capture($e.principal.hostname, "([^.]*)")
$prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
$prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
$prevalence.graph.entity.hostname = $domain
$prevalence.graph.entity.domain.prevalence.day_count = 10
$prevalence.graph.entity.domain.prevalence.rolling_max <= 5
$prevalence.graph.entity.domain.prevalence.rolling_max > 0
match:
$hostname over 1h
outcome:
$risk_score = 80
$CL_target = array($domain)
condition:
$e and $d and $prevalence
}
Crea detecciones compuestas secuenciales
Las detecciones compuestas secuenciales identifican patrones de eventos relacionados en los que la secuencia de detecciones es importante, como la detección de un intento de acceso por fuerza bruta, seguido de un acceso exitoso. Estos patrones pueden combinar varias detecciones básicas, eventos sin procesar del UDM o ambos.
Para crear una detección compuesta secuencial, debes aplicar ese orden en tu regla. Para aplicar la secuencia esperada, usa uno de los siguientes métodos:
Ventanas deslizantes: Define la secuencia de detecciones con ventanas deslizantes en tus condiciones
match.Comparaciones de marcas de tiempo: Compara las marcas de tiempo de las detecciones dentro de la lógica de tu regla para verificar que ocurran en el orden seleccionado.
Ejemplo: Detecciones compuestas secuenciales
events:
$d1.detection.detection.rule_name = "fileEvent_rule"
$userid = $d1.detection.detection.outcomes["user"]
$hostname = $d1.detection.detection.outcomes["hostname"]
$d2.detection.detection.rule_name = "processExecution_rule"
$userid = $d2.detection.detection.outcomes["user"]
$hostname = $d2.detection.detection.outcomes["hostname"]
$d3.detection.detection.rule_name = "networkEvent_rule"
$userid = $d3.detection.detection.outcomes["user"]
$hostname = $d3.detection.detection.outcomes["hostname"]
$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds
match:
$userid over 24h after $d1
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.