Campos repetidos

Disponible en:

En el modelo de datos unificado (UDM), algunos campos se etiquetan como repetidos, lo que indica que son listas de valores u otros tipos de mensajes. En este documento se proporciona información sobre cómo usar expresiones, marcadores de posición, indexación de arrays y mensajes repetidos para campos de metadatos definidos por el usuario repetidos.

Expresiones booleanas y campos repetidos

Las expresiones booleanas modificadas y sin modificar pueden actuar en campos repetidos.

Considera el siguiente evento:

event_original {
  principal {
    // ip is a repeated field
    ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]

    hostname: "host"
  }
}

Expresiones modificadas

Usa los modificadores any y all en expresiones de campos repetidos.

  • any: si cualquier elemento del campo repetido cumple la condición, el evento en su conjunto la cumple. Por ejemplo:

    • event_original satisface any $e.principal.ip = "192.0.2.1"
    • event_original falla any $e.repeated_field.field_a = "9.9.9.9"
  • all: si todos los elementos del campo repetido cumplen la condición, el evento en su conjunto la cumple. Por ejemplo:

    • event_original satisface net.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8")
    • event_original falla all $e.principal.ip = "192.0.2.2"

Cuando escribas una condición con any o all, ten en cuenta que negar la condición con not puede no tener el mismo significado que usar el operador negado.

Por ejemplo:

  • not all $e.principal.ip = "192.168.12.16" comprueba si no todas las direcciones IP coinciden con 192.168.12.16, lo que significa que la consulta comprueba si al menos una dirección IP no coincide con 192.168.12.16.
  • all $e.principal.ip != "192.168.12.16" comprueba si todas las direcciones IP no coinciden con 192.168.12.16, lo que significa que la consulta comprueba que ninguna dirección IP coincide con 192.168.12.16.

Restricciones:

  • Los operadores any y all solo son compatibles con campos repetidos (no con campos escalares).
  • any y all no se pueden usar para combinar dos campos repetidos. Por ejemplo, any $e1.principal.ip = $e2.principal.ip no es válido.
  • Los operadores any y all no se admiten con la expresión de lista de referencia.

Expresiones sin modificar

Con las expresiones sin modificar, cada elemento del campo repetido se trata de forma individual. Si el campo repetido de un evento contiene n elementos, la consulta se aplica a n copias del evento, donde cada copia tiene uno de los elementos del campo repetido. Estas copias son transitorias y no se almacenan.

La regla se aplica en las siguientes copias:

Copia del evento principal.ip principal.hostname
event_copy_1 "192.0.2.1" "host"
event_copy_2 "192.0.2.2" "host"
event_copy_3 "192.0.2.3" "host"

Si alguna copia del evento cumple todas las condiciones sin modificar del campo repetido, el evento en su conjunto cumple todas las condiciones. Por lo tanto, si tiene varias condiciones en un campo repetido, una sola copia del evento debe cumplir todas ellas. En las siguientes consultas de ejemplo se usa el conjunto de datos de ejemplo anterior para mostrar este comportamiento.

Ejemplo: expresiones sin modificar

La siguiente regla devuelve una coincidencia cuando se ejecuta en el conjunto de datos de ejemplo event_original, porque event_copy_1 cumple todos los predicados de eventos:

rule repeated_field_1 {
  meta:
  events:
    net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/8") // Checks if IP address matches 192.x.x.x
    $e.principal.ip = "192.0.2.1"
  condition:
    $e
}

La siguiente regla no devuelve ninguna coincidencia cuando se ejecuta en el conjunto de datos de ejemplo event_original porque no hay ninguna copia del evento en $e.principal.ip que cumpla _todos_ los predicados del evento.

rule repeated_field_2 {
  meta:
  events:
    $e.principal.ip = "192.0.2.1"
    $e.principal.ip = "192.0.2.2"
  condition:
    $e
}

Las expresiones modificadas en campos repetidos son compatibles con las expresiones sin modificar en campos repetidos porque la lista de elementos es la misma para cada copia del evento. Considera la siguiente regla:

rule repeated_field_3 {
  meta:
  events:
    any $e.principal.ip = "192.0.2.1"
    $e.principal.ip = "192.0.2.3"
  condition:
    $e
}

La regla se aplica en las siguientes copias:

Copia del evento principal.ip any $e.principal.ip
event_copy_1 "192.0.2.1" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
event_copy_2 "192.0.2.2" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
event_copy_3 "192.0.2.3" ["192.0.2.1", "192.0.2.2", "192.0.2.3"]

En este caso, todas las copias cumplen any $e.principal.ip = "192.0.2.1", pero solo event_copy_3 cumple $e.principal.ip = "192.0.2.3". Como resultado, el evento en su conjunto coincidiría.

Otra forma de entender estos tipos de expresiones es la siguiente:

  • Las expresiones de campos repetidos que usan any o all operan en la lista de event_original.
  • Las expresiones de campos repetidos que no usan any ni all operan en eventos event_copy_n individuales.

Marcadores de posición y campos repetidos

Los campos repetidos funcionan con asignaciones de marcadores de posición. Al igual que ocurre con las expresiones sin modificar en campos repetidos, se crea una copia del evento para cada elemento. Siguiendo con el ejemplo de event_copy, el marcador de posición toma el valor del campo repetido de event_copy_n en cada una de las copias del evento, donde n es el número de copia del evento. Si el marcador de posición se usa en la sección de coincidencias, se pueden producir varias coincidencias.

Ejemplo: marcador de posición de campo repetido

En el siguiente ejemplo se genera una coincidencia. El marcador de posición `$ip` es igual a `192.0.2.1` en `event_copy_1`, lo que cumple los predicados de la regla. Las muestras de eventos de la coincidencia contienen un solo elemento, `event_original`.

// Generates 1 match.
rule repeated_field_placeholder1 {
  meta:
  events:
    $ip = $e.principal.ip
    $ip = "192.0.2.1"
    $host = $e.principal.hostname

  match:
    $host over 5m

  condition:
    $e
}

En el siguiente ejemplo se generan tres coincidencias. El marcador de posición $ip es igual a diferentes valores para cada una de las copias de event_copy_n. La agrupación se hace en $ip, ya que está en la sección de coincidencias. Por lo tanto, obtienes tres coincidencias, cada una con un valor diferente para la variable de coincidencia $ip. Cada coincidencia tiene el mismo ejemplo de evento: un solo elemento, event_original.

// Generates 3 matches.
rule repeated_field_placeholder2 {
  meta:
  events:
    $ip = $e.principal.ip
    net.ip_in_range_cidr($ip, "192.0.2.0/8") // Checks if IP matches 192.x.x.x

  match:
    $ip over 5m

  condition:
    $e
}

Resultados al usar marcadores de posición asignados a campos repetidos

Los marcadores de posición se asignan a cada elemento de cada campo repetido, no a toda la lista. Cuando se usan en la sección outcome, el resultado se calcula usando solo los elementos que cumplen las secciones anteriores.

Considera la siguiente regla:

rule outcome_repeated_field_placeholder {
  meta:
  events:
    $ip = $e.principal.ip
    $ip = "192.0.2.1" or $ip = "192.0.2.2"
    $host = $e.principal.hostname

  match:
    $host over 5m

  outcome:
    $o = array_distinct($ip)

  condition:
    $e
}

Esta regla tiene cuatro fases de ejecución. La primera fase es la copia de eventos:

Copia del evento $ip $host $e
event_copy_1 "192.0.2.1" "host" event_id
event_copy_2 "192.0.2.2" "host" event_id
event_copy_3 "192.0.2.3" "host" event_id

En la sección de eventos, se filtrarán las filas que no coincidan con los filtros:

Copia del evento $ip $host $e
event_copy_1 "192.0.2.1" "host" event_id
event_copy_2 "192.0.2.2" "host" event_id

Se ha excluido event_copy_3 porque "192.0.2.3" no cumple $ip = "192.0.2.1" or $ip = "192.0.2.2".

La sección match se agrupará por variables de coincidencia y la sección outcome agregará los datos de cada grupo:

$host $o $e
"host" ["192.0.2.1", "192.0.2.2"] event_id

$o = array_distinct($ip) se calcula a partir de $ip de la fase anterior, no de la fase de copia de eventos.

Por último, la sección condition filtrará cada grupo. Como esta regla solo comprueba si existe $e, la fila anterior generará una sola detección.

$o no contiene todos los elementos de $e.principal.ip porque no todos los elementos cumplen todas las condiciones de la sección de eventos. Sin embargo, todos los elementos de e.principal.ip aparecerán en la muestra de eventos porque esta usa event_original.

Indexación de arrays

Puedes realizar indexación de arrays en campos repetidos. Para acceder al elemento del campo repetido n-ésimo, usa la sintaxis de lista estándar (los elementos tienen un índice que empieza por 0). Si el elemento está fuera de los límites, se devuelve el valor predeterminado.

  • $e.principal.ip[0] = "192.168.12.16"
  • $e.principal.ip[999] = "" Si hay menos de 1000 elementos, el resultado es true.

Restricciones:

  • Un índice debe ser un literal de número entero no negativo. Por ejemplo, $e.principal.ip[-1] no es válido.
  • Los valores que tienen el tipo int (por ejemplo, un marcador de posición con el valor int) no se tienen en cuenta.
  • La indexación de arrays no se puede combinar con any ni all. Por ejemplo, any $e.intermediary.ip[0] no es válido.
  • La indexación de arrays no se puede combinar con la sintaxis de mapas. Por ejemplo, $e.additional.fields[0]["key"] no es válido.
  • Si la ruta del campo contiene varios campos repetidos, todos ellos deben usar la indexación de arrays. Por ejemplo, $e.intermediary.ip[0] no es válido porque intermediary y ip son campos repetidos, pero solo hay un índice para ip.

Mensajes repetidos

Cuando se repite un campo message, se reduce la probabilidad de que se produzca una coincidencia. Esto se ilustra en los siguientes ejemplos.

Considera el siguiente evento:

event_repeated_message {
  // about is a repeated message field.
  about {
    // ip is a repeated string field.
    ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]

    hostname: "alice"
  }
  about {
    hostname: "bob"
  }
}

Como se ha indicado en el caso de las expresiones sin modificar en campos repetidos, se crea una copia temporal del evento para cada elemento del campo repetido. Considera la siguiente regla:

rule repeated_message_1 {
  meta:
  events:
    $e.about.ip = "192.0.2.1"
    $e.about.hostname = "bob"
  condition:
    $e
}

La regla se aplica en las siguientes copias:

Copia del evento about.ip about.hostname
event_copy_1 "192.0.2.1" "alice"
event_copy_2 "192.0.2.2" "alice"
event_copy_3 "192.0.2.3" "alice"
event_copy_4 "" "bob"

El evento no coincide con la regla porque no hay ninguna copia del evento que cumpla todas las expresiones.

Mensajes repetidos e indexación de arrays

Otro comportamiento inesperado puede producirse al usar la indexación de arrays con expresiones sin modificar en campos de mensajes repetidos. Veamos la siguiente regla de ejemplo que usa la indexación de arrays:

rule repeated_message_2 {
  meta:
  events:
    $e.about.ip = "192.0.2.1"
    $e.about[1].hostname = "bob"
  condition:
    $e
}

La regla se aplica a las siguientes copias:

Copia del evento about.ip about[1].hostname
event_copy_1 "192.0.2.1" "bob"
event_copy_2 "192.0.2.2" "bob"
event_copy_3 "192.0.2.3" "bob"
event_copy_4 "" "bob"

Como event_copy_1 cumple todas las expresiones de repeated_message_2, el evento coincide con la regla.

Esto puede provocar un comportamiento inesperado, ya que la regla repeated_message_1 no tenía indexación de matriz y no produjo ninguna coincidencia, mientras que la regla repeated_message_2 sí tenía indexación de matriz y produjo una coincidencia.

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