Reglas de detección compuestas

Disponible en:

La detección compuesta en Google SecOps implica conectar varias reglas YARA-L. En este documento se explica cómo crear una regla compuesta. Para obtener más información, consulta la información general sobre las detecciones compuestas.

Conocer la estructura de las reglas

Las reglas de detección compuestas son siempre reglas de varios eventos y siguen la misma estructura y sintaxis que las reglas de un solo evento.

Una regla compuesta tiene los siguientes componentes esenciales:

  • Sección events: define las 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 periodo definido.

  • Sección condition: contiene la lógica final que determina si los eventos unidos cumplen 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 de las reglas compuestas proceden de colecciones, que almacenan las detecciones generadas por otras consultas. Google SecOps ofrece los dos métodos siguientes para acceder a los datos de las colecciones.

Hacer referencia a contenido de detección con variables o metaetiquetas

Para acceder a los datos de una detección sin hacer referencia a los eventos de UDM originales, puede usar variables outcome, variables match o etiquetas meta. Te recomendamos este enfoque porque ofrece una mayor flexibilidad y una mejor compatibilidad entre los distintos 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, empieza por detection y busca la información pertinente con elementos del recurso Collection.

Ejemplo: Supongamos que una regla de detección genera 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 mediante las siguientes rutas:

  • detection.detection.outcomes["dest_domain"] para acceder a la variable de resultado dest_domain.

  • detection.collection_elements.references.event.target.hostname para acceder al campo target.hostname UDM.

  • detection.time_window.start_time.seconds para acceder a la marca de tiempo de inicio de la detección.

La API Collection y la API SecurityResult proporcionan acceso a lo siguiente:

  • Metadatos de detección y valores de resultados (detection.detection)
  • Eventos de UDM subyacentes de reglas referenciadas (collection_elements)

Buscar contenido de detección de referencia por ID o nombre de regla

Puedes hacer referencia a una regla por su nombre o por su ID. Te recomendamos que uses este método cuando tu lógica de detección dependa de reglas específicas y quieras reducir los datos analizados a los resultados de esas reglas. Hacer referencia a reglas relevantes por nombre o ID mejora el rendimiento y evita los tiempos de espera, ya que se reducen los datos analizados. Por ejemplo, puedes consultar directamente campos como target.url o principal.ip a partir de una detección anterior conocida.

  • Hacer referencia a una regla por su ID (opción recomendada): use el campo detection.detection.rule_id para hacer referencia a una regla por su ID. Puede encontrar el ID de regla en la URL de la regla en Google SecOps. Las reglas generadas por los usuarios tienen IDs con el formato ru_UUID, mientras que las detecciones seleccionadas tienen IDs con el formato ur_UUID. Por ejemplo:

    detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"

  • Hacer referencia a una regla por su nombre: usa el campo detection.detection.rule_name para 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 variables definidas en la sección events. Estas variables pueden incluir etiquetas de reglas, variables de resultados, variables de coincidencias, campos de detección o elementos de colección.

Para obtener información sobre la sintaxis, consulta Sintaxis de la sección Match.

Definir 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 "Condition".

Aplicar técnicas avanzadas a reglas compuestas

En esta sección se explica cómo aplicar técnicas avanzadas al crear reglas compuestas.

Combinar eventos y detecciones

Las reglas compuestas pueden combinar varias fuentes de datos, incluidos eventos de UDM, datos de gráficos de entidades y campos de detección. Deben aplicarse las siguientes directrices:

  • Usar variables distintas por fuente: asigna variables de evento únicas a cada fuente de datos (por ejemplo, $e para eventos y $d para detecciones), donde la fuente de datos incluya eventos, entidades y detecciones.

  • Unir fuentes en un contexto compartido: conecte fuentes de datos mediante valores comunes, como IDs de usuario, direcciones IP o nombres de dominio, en las condiciones de su regla.

  • Defina un periodo de coincidencia: incluya siempre una cláusula match con un periodo de no más de 48 horas.

Ejemplo: combinar 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
}

Crear detecciones compuestas secuenciales

Las detecciones compuestas secuenciales identifican patrones de eventos relacionados en los que la secuencia de detecciones es importante, como una detección de intento de inicio de sesión por fuerza bruta, seguida de un inicio de sesión correcto. Estos patrones pueden combinar varias detecciones básicas, eventos UDM sin procesar o ambos.

Para crear una detección compuesta secuencial, debes aplicar ese orden en tu regla. Para aplicar la secuencia esperada, utilice uno de los siguientes métodos:

  • Ventanas deslizantes: define la secuencia de detecciones mediante 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 se producen 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? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.