Campos repetidos
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_originalsatisfaceany $e.principal.ip = "192.0.2.1"event_originalfallaany $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_originalsatisfacenet.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8")event_originalfallaall $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 con192.168.12.16, lo que significa que la consulta comprueba si al menos una dirección IP no coincide con192.168.12.16.all $e.principal.ip != "192.168.12.16"comprueba si todas las direcciones IP no coinciden con192.168.12.16, lo que significa que la consulta comprueba que ninguna dirección IP coincide con192.168.12.16.
Restricciones:
- Los operadores
anyyallsolo son compatibles con campos repetidos (no con campos escalares). anyyallno se pueden usar para combinar dos campos repetidos. Por ejemplo,any $e1.principal.ip = $e2.principal.ipno es válido.- Los operadores
anyyallno 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
anyoalloperan en la lista deevent_original. - Las expresiones de campos repetidos que no usan
anynialloperan en eventosevent_copy_nindividuales.
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 estrue.
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 valorint) no se tienen en cuenta. - La indexación de arrays no se puede combinar con
anyniall. 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 porqueintermediaryyipson campos repetidos, pero solo hay un índice paraip.
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.