Campos repetidos
En el Modelo de datos unificado (UDM), algunos campos se etiquetan como repetidos, lo que indica que son listas de valores o de 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 los campos repetidos del UDM.
Expresiones booleanas y campos repetidos
Las expresiones booleanas modificadas y sin modificar pueden actuar sobre 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 en campos repetidos.
any: Si algún elemento del campo repetido satisface la condición, el evento en su totalidad satisface la condición. 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 satisfacen la condición, el evento en su totalidad satisface la condición. 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"verifica si no todas las direcciones IP coinciden con192.168.12.16, lo que significa que la búsqueda verifica que al menos una dirección IP no coincide con192.168.12.16.all $e.principal.ip != "192.168.12.16"verifica que ninguna dirección IP coincida con192.168.12.16, lo que significa que la búsqueda verifica que ninguna dirección IP coincida con192.168.12.16.
Restricciones:
- Los operadores
anyyallsolo son compatibles con los campos repetidos (no con los campos escalares). anyyallno se pueden usar para unir 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 la lista de referencia.
Expresiones sin modificar
Con 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, en las que cada copia tiene uno de los elementos del campo repetido. Estas copias son transitorias y no se almacenan.
La regla se aplica a 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 satisface todas las condiciones sin modificar en el campo repetido, el evento en su totalidad satisface todas las condiciones. Por lo tanto, si tienes varias condiciones en un campo repetido, una sola copia del evento debe satisfacer todas ellas. En los siguientes ejemplos de consultas, se usa el conjunto de datos de ejemplo anterior para demostrar este comportamiento.
Ejemplo: Expresiones sin modificar
La siguiente regla devuelve una coincidencia cuando se ejecuta en el conjunto de datos de ejemplo de event_original, ya que event_copy_1 satisface 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 una coincidencia cuando se ejecuta en el conjunto de datos de ejemplo de event_original, ya que no hay ninguna copia del evento en $e.principal.ip que satisfaga _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. Ten en cuenta 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 a 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 satisfacen any $e.principal.ip = "192.0.2.1", pero solo event_copy_3 satisface $e.principal.ip = "192.0.2.3". Como resultado, el evento en su conjunto coincidiría.
Otra forma de pensar en estos tipos de expresiones es la siguiente:
- Las expresiones en campos repetidos que usan
anyoalloperan en la lista enevent_original. - Las expresiones en campos repetidos que no usan
anynialloperan en eventosevent_copy_nindividuales.
Marcadores de posición y campos repetidos
Los campos repetidos funcionan con las asignaciones de marcadores de posición. Al igual que con las expresiones sin modificar en los campos repetidos, se crea una copia del evento para cada elemento. Con el mismo ejemplo de event_copy, el marcador de posición toma el valor del campo repetido de event_copy_n para cada una de las copias del evento en las que n es el número de copia del evento. Si el marcador de posición se usa en la sección de coincidencias, esto puede generar 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" para "event_copy_1", lo que satisface los predicados de la regla. Las muestras de eventos del partido 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 diferentes copias de event_copy_n.
La agrupación se realiza en $ip, ya que se encuentra en la sección de coincidencias. Por lo tanto, obtendrás tres coincidencias, en las que cada una tendrá un valor diferente para la variable de coincidencia $ip. Cada coincidencia tiene la misma muestra de eventos: 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 que usan marcadores de posición asignados a campos repetidos
Los marcadores de posición se asignan a cada elemento de cada campo repetido, no a la lista completa. Cuando se usan en la sección outcome, el resultado se calcula solo con los elementos que satisficieron las secciones anteriores.
Ten en cuenta 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 etapas de ejecución. La primera etapa 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 |
Luego, la sección de eventos filtrará 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 filtra event_copy_3 porque "192.0.2.3" no satisface $ip = "192.0.2.1" or $ip = "192.0.2.2".
Luego, la sección match agrupará por variables de coincidencia y la sección outcome realizará la agregación en cada grupo:
| $host | $o | $e |
|---|---|---|
| "host" | ["192.0.2.1", "192.0.2.2"] | event_id |
$o = array_distinct($ip) se calcula con $ip de la etapa anterior y no con la etapa de copia de eventos.
Por último, la sección condition filtrará cada grupo. Dado que esta regla solo verifica la existencia de $e, la fila anterior producirá una sola detección.
$o no contiene todos los elementos de $e.principal.ip porque no todos los elementos cumplieron con todas las condiciones de la sección de eventos. Sin embargo, todos los elementos de e.principal.ip aparecerán en la muestra del evento porque esta usa event_original.
Indexación de arreglos
Puedes realizar la indexación de arrays en campos repetidos. Para acceder al n-ésimo elemento del campo repetido, usa la sintaxis de lista estándar (los elementos se indexan a partir de 0). Un elemento fuera de los límites devuelve el valor predeterminado.
$e.principal.ip[0] = "192.168.12.16"$e.principal.ip[999] = ""Si hay menos de 1,000 elementos, se evalúa comotrue.
Restricciones:
- Un índice debe ser un literal de número entero no negativo. Por ejemplo,
$e.principal.ip[-1]no es válido. - No se tienen en cuenta los valores que tienen un tipo
int(por ejemplo, un marcador de posición establecido enint). - 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 de acceso al campo contiene varios campos repetidos, todos los campos repetidos 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 una coincidencia, lo que no es el efecto deseado. 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 indicó para las expresiones sin modificar en campos repetidos, se crea una copia temporal del evento para cada elemento del campo repetido. Ten en cuenta 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 a 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 existe ninguna copia del evento que satisfaga todas las expresiones.
Mensajes repetidos e indexación de arrays
Otro comportamiento inesperado puede ocurrir cuando se usa la indexación de arrays con expresiones sin modificar en campos de mensajes repetidos. Considera 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" |
Dado que event_copy_1 satisface todas las expresiones en repeated_message_2, el evento coincide con la regla.
Esto puede generar un comportamiento inesperado porque la regla repeated_message_1 no tenía indexación de array y no produjo coincidencias, mientras que la regla repeated_message_2 sí usó la indexación de array y produjo una coincidencia.
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.