Sintaxis de la sección de coincidencias

Disponible en:

La sección match proporciona los parámetros necesarios para correlacionar varios eventos relacionados en una sola detección. Solo es obligatorio en las reglas que vinculan dos o más eventos distintos. Úsala para definir los criterios de esta correlación especificando lo siguiente:

  • Campos de agrupación (claves): los campos específicos de los eventos (definidos en la sección events) que deben compartir el mismo valor para que los eventos se vinculen de forma lógica.

  • Limitación de tiempo: el periodo continuo en el que deben producirse los eventos relacionados para que se considere que se ha completado una coincidencia. Solo es necesario para las reglas y no para las búsquedas ni los paneles de control.

Definir la sección de coincidencias

Las reglas requieren que las variables de coincidencia sean marcadores de posición definidos en la sección event. También puedes especificar campos event en Búsqueda y en los paneles de control.

Utilice las variables de marcador de posición definidas en la sección events para especificar el periodo en el que deben producirse los eventos. Los eventos coincidentes que se produzcan fuera del periodo especificado se ignorarán en ese grupo de detección concreto.

Usa la palabra clave over y la sintaxis <number><m/h/d> (donde m/h/d son minutos, horas y días) para especificar el periodo. Puedes especificar un mínimo de un minuto y un máximo de 48 horas.

Esta regla de ejemplo detecta los inicios de sesión fallidos que se producen en un periodo de 10 minutos. La correlación de varios inicios de sesión fallidos en un breve periodo suele indicar un intento de acceso por fuerza bruta o no autorizado.

rule failed_logins
{
  meta:
   author = "Security Team"
   description = "Detects multiple failed user logins within 10-minute windows."
   severity = "HIGH"

  events:
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $user = $e.target.user.userid

  match:
   $user over 10m

  condition:
    #e >= 5
}

En la sección match se buscan usuarios que no han podido iniciar sesión en una nueva ubicación durante un intervalo de 10 minutos:

match:
   $user over 10m

Valores cero en la sección de coincidencias

Google SecOps filtra implícitamente los valores cero de todos los marcadores de posición que se usan en la sección match ("" para cadenas, 0 para números, false para valores booleanos y el valor de la posición 0 para tipos enumerados).

Ejemplo: filtrar los valores cero

En el siguiente ejemplo se muestran consultas que excluyen los valores cero.

rule ZeroValuePlaceholderExample {
  meta:
  events:
    // Because $host is used in the match section, the query behaves
    // as if the following predicate was added to the events section:
    // $host != ""
    $host = $e.principal.hostname

    // Because $otherPlaceholder was not used in the match,
    // there is no implicit filtering of zero values for $otherPlaceholder.
    $otherPlaceholder = $e.principal.ip

  match:
    $host over 5m

  condition:
    $e
}

Sin embargo, si se asigna un marcador de posición a una función, las consultas no filtran implícitamente los valores cero de los marcadores de posición que se usan en la sección match.

Para inhabilitar el filtrado implícito de los valores cero, puede usar la opción allow_zero_values de la sección de opciones. La opción allow_zero_values solo está disponible en Reglas.

Ejemplo: permitir valores cero

En el siguiente ejemplo se muestran consultas que no filtran implícitamente los valores cero de los marcadores de posición que se usan en la sección match:

rule ZeroValueFunctionPlaceholder {
  meta:
  events:
    // Even though $ph is used in the match section, there is no
    // implicit filtering of zero values for $ph, because $ph is assigned to a function.
    $ph = re.capture($e.principal.hostname, "some-regex")

  match:
    $ph over 5m

  condition:
    $e
}

Periodos admitidos

Puede agrupar los campos de eventos y los marcadores de posición de la sección match por una granularidad temporal específica mediante una de las siguientes ventanas admitidas.

  • Ventanas de salto (ventanas superpuestas)
  • Ventanas de saltos de tamaño constante (ventanas no superpuestas)
  • Ventanas deslizantes (ventanas generadas por pivotes)

Ventanas de salto

Una ventana de salto es un tipo de consulta multievento que agrupa los eventos que coinciden con los criterios de una consulta en un periodo específico, independientemente del orden en el que se produzcan. De forma predeterminada, las consultas de YARA-L con una sección match usan ventanas de salto para correlacionar varios eventos a lo largo del tiempo. El intervalo de tiempo de la ejecución de la consulta se divide en un conjunto de ventanas de salto superpuestas, cada una con la duración especificada en la sección match. A continuación, los eventos se correlacionan en cada ventana de salto.

Por ejemplo, en una consulta que se ejecuta en el intervalo de tiempo [1:00, 2:00], con una sección match de 30m, un posible conjunto de ventanas de salto superpuestas que se podrían generar es [1:00, 1:30], [1:03, 1:33] y [1:06, 1:36]. Estas ventanas se usan para correlacionar varios eventos.

Ventanas de saltos de tamaño constante

Una ventana de tiempo acumulativa segmenta un flujo de datos en intervalos de tiempo continuos, de tamaño fijo y que no se superponen. Cada evento de datos se asigna a una sola ventana. Esto contrasta con una ventana deslizante o de salto, que puede tener intervalos de tiempo superpuestos.

Por ejemplo, con una ventana de 30 minutos, los eventos que se producen entre las 1:00:00 y las 1:29:59 se procesan juntos. A continuación, se procesa por separado el siguiente conjunto de eventos, de 1:30:00 a 1:59:59.

Ventanas correderas

Cuando necesites buscar eventos que se produzcan en un orden relativo específico (por ejemplo, e1 se produce hasta dos minutos después de e2), las ventanas de tiempo móviles son muy eficaces. Las ventanas deslizantes se generan cuando una restricción de tiempo empieza o termina con una variable de evento de referencia especificada. De esta forma, se hace un seguimiento dinámico de la secuencia de eventos y de los tiempos relativos a esa variable de evento de referencia específica.

A continuación, los eventos se correlacionan en cada ventana de tiempo. De esta forma, se pueden buscar eventos que se produzcan en un orden específico (por ejemplo, e1 se produce en un plazo de 2 minutos después de e2). Se correlacionan una instancia del evento e1 y una instancia del evento e2 si el evento e1 se produce en el periodo de la ventana de tiempo después del evento e2.

  • Las ventanas de tiempo se basan en la variable del evento de referencia (pivot-event-var).
  • Usa la palabra clave before para generar ventanas de tiempo que terminen con cada instancia del evento de referencia.
  • Usa la palabra clave after para generar ventanas deslizantes que empiecen con cada instancia del evento de referencia.

Especifica las ventanas de tiempo en la sección match de una consulta de la siguiente manera:

<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>

En los siguientes ejemplos se muestran ventanas deslizantes válidas:

$var1, $var2 over 5m after $e1

$user over 1h before $e2

Notas:

  • Otro ejemplo de ventana de tiempo.
  • Se sabe que el uso de ventanas deslizantes en lugar de ventanas de salto provoca un rendimiento más lento. Te recomendamos que uses ventanas deslizantes solo en casos específicos, como cuando el orden de los eventos sea absolutamente necesario o cuando busques la inexistencia de eventos.

  • Como las ventanas de tiempo continuas están diseñadas para detectar varios eventos, te recomendamos que no las uses en consultas de un solo evento. En su lugar, utilice una de las siguientes soluciones alternativas:

    • Convierte la consulta para que use varias variables de evento y actualiza la sección de condiciones si la consulta requiere más de una ocurrencia del evento.
    • También puedes añadir filtros de marca de tiempo en lugar de usar una ventana de tiempo. Por ejemplo: $permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds
    • Quita la ventana corredera.

Siguientes pasos

Información adicional

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