Cómo comprender la sintaxis de búsqueda

Compatible con:

Esta guía está dirigida a los analistas de seguridad que desean configurar expresiones de búsqueda (valores de datos, escapes, operadores, etcétera) en el editor de consultas de la página de búsqueda de SIEM.

Cuando escribas expresiones de búsqueda en YARA-L 2.0 o SQL en el editor de consultas de Google Security Operations, debes dar formato a tus valores de datos, operadores y secuencias de escape de cadenas según el tipo de datos exacto del campo de UDM objetivo. Una condición de búsqueda consta de un nombre de campo de UDM, un operador de comparación (=, !=, >, <, <=, >=) y un valor de datos con formato.

Cómo dar formato a los valores de datos por tipo de datos

En esta sección, se describe lo siguiente:

Valores enumerados (enums)

Los enums deben escribirse como cadenas de texto en mayúsculas que coincidan exactamente con las definiciones válidas del diccionario de UDM, encerradas entre comillas dobles ("), como en el siguiente ejemplo:

metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"

Valores booleanos

Los campos booleanos aceptan verdadero o falso (no distinguen mayúsculas de minúsculas y no requieren comillas), como en el siguiente ejemplo:

network.dns.response = true target.user.is_admin = false

Números enteros y valores numéricos

Los números enteros y los números de puerto se escriben como dígitos literales sin comillas dobles, como en el siguiente ejemplo:

target.port = 443 network.sent_bytes > 10485760

Valores de punto flotante y decimales

En el caso de los campos de UDM de tipo float o double, ingresa un número decimal o entero sin comillas dobles, como en el siguiente ejemplo:

security_result.about.asset.vulnerabilities.cvss_base_score = 9.8

Cadenas de texto

Los valores de texto estándar deben estar entre comillas dobles ("), como en el siguiente ejemplo:

metadata.product_name = "Google Cloud VPC Flow Logs" target.asset.asset_id = "srv-prod-us-central1-a"

Coincidencia sin distinción entre mayúsculas y minúsculas (nocase)

De forma predeterminada, las comparaciones de cadenas en YARA-L 2.0 distinguen mayúsculas de minúsculas. Para que coincida con cualquier combinación de caracteres en mayúsculas y minúsculas, agrega el operador nocase directamente al final de la condición, como en el siguiente ejemplo:

principal.hostname != "http-server" nocase principal.user.userid = "jdoe" nocase

Escape de cadenas (\\ y ")

Si un literal de cadena contiene barras inversas o comillas dobles, debes escapar esos caracteres con una barra inversa inicial (\\), como en el siguiente ejemplo:

  • Usa \\ para que coincida con una barra inversa literal (\\).
  • Usa \" para que coincida con una comilla doble literal (").

  • Busca rutas de acceso de archivos de Windows con barras inversas de escape:

    principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
    
  • Busca líneas de comandos que contengan comillas dobles incorporadas:

    target.process.command_line = "cmd.exe /c \"c:\\program files\\malicious.exe\""
    

Expresiones regulares (sintaxis RE2)

Para buscar con expresiones regulares, encierra el patrón de regex entre barras diagonales (/ /) en lugar de comillas dobles. Google SecOps usa el motor de expresiones regulares RE2 estándar:

  • Haz coincidir cualquier IP principal dentro del rango 10.x.x.x, de la siguiente manera:

    principal.ip = /10\..*/
    
  • Busca la ejecución de PsExec con la extensión .exe opcional, sin distinguir mayúsculas de minúsculas, como en el siguiente ejemplo:

    target.process.command_line = /\bpsexec(\.exe)?\b/ nocase
    
  • Coincide con los nombres de host de DNS dinámico que siguen un patrón numerado, como en el siguiente ejemplo:

    principal.hostname = /dns-server-[0-9]+/ nocase
    

Lógica booleana y prioridad de operadores

Combina varias condiciones de búsqueda con los operadores AND, OR y NOT. Puedes usar paréntesis () para agrupar expresiones de forma explícita y controlar la precedencia de la evaluación, como se muestra en los siguientes ejemplos:

  • Busca eventos de acceso de usuarios específicos en un host sensible, como en el siguiente ejemplo:

    metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"
    
    
  • Usa paréntesis para aislar las condiciones OR de las cadenas AND, como en el siguiente ejemplo:

    metadata.event_type = "PROCESS_LAUNCH" AND principal.process.file.full_path = /winword.exe/ nocase AND (target.process.file.full_path = /cmd.exe/ OR target.process.file.full_path = /powershell.exe/)
    

Buscar pares clave-valor en los campos additional y labels

Los campos additional y labels sirven como contenedores flexibles para los datos de eventos personalizados y los atributos de proveedores externos que no se asignan a los campos estándar del UDM. Cada entrada almacena un par clave-valor:

  • additional campos: Pueden contener varios pares clave-valor por evento (additional.fields["key"] = "value").

  • labels campos: Solo pueden contener un par clave-valor por evento (labels["key"] = "value").

Coincidencia exacta de par clave-valor (campo["clave"] = "valor")

Usa la sintaxis de corchetes para consultar una clave específica y su valor de cadena correspondiente directamente, como en el siguiente ejemplo:

additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"

Coincidencia avanzada de regex y valores que no son cadenas en los campos additional

Si necesitas consultar valores numéricos o booleanos dentro de los campos additional, o bien hacer coincidir claves y valores con expresiones regulares, usa la ruta de acceso completamente calificada del campo .proto:

  • Coincide con cualquier cadena de valor dentro del contenedor adicional por medio de una regex:

    additional.fields.value.string_value = /suspicious_payload_.*/ nocase
    
  • Coincide con valores booleanos o numéricos dentro de los campos personalizados:

    additional.fields.value.bool_value = true additional.fields.value.number_value > 500
    
  • Busca en varias claves dinámicas que coincidan con un prefijo de regex:

    additional.fields.key = /^myKeyNumber_.*/
    
  • Comprueba si existe una clave, independientemente del valor:

    additional.fields["pod_name"] != ""
    
  • Usa expresiones regulares y nocase directamente con la sintaxis de corchetes:

    additional.fields["pod_name"] = /br/
    additional.fields["pod_name"] = bar nocase
    
  • Combina varios pares clave-valor de additional.fields con AND:

    additional.fields["pod_name"] = "kube-scheduler" AND additional.fields["namespace"] = "kube-system"
    

Cómo buscar campos agrupados

Los campos agrupados son alias de grupos de campos de UDM relacionados. Puedes usarlos para consultar varios campos del UDM al mismo tiempo sin tener que escribir cada campo de forma individual.

En el siguiente ejemplo, se muestra cómo ingresar una consulta para que coincida con los campos comunes del UDM que podrían contener la dirección IP especificada:

ip = "1.2.3.4"

Puedes hacer coincidir un campo agrupado con una expresión regular y con el operador nocase. También se admiten las listas de referencias. Los campos agrupados también se pueden usar en combinación con los campos de UDM normales, como se muestra en el siguiente ejemplo:

ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"

Tipos de campos de UDM agrupados

Puedes realizar búsquedas en todos los siguientes campos de UDM agrupados:

Nombre del campo agrupado Campos de UDM asociados
domain about.administrative_domain
about.asset.network_domain
network.dns.questions.name
network.dns_domain
principal.administrative_domain
principal.asset.network_domain
target.administrative_domain
target.asset.hostname
target.asset.network_domain
target.hostname
email intermediary.user.email_addresses
network.email.from
network.email.to
principal.user.email_addresses
security_result.about.user.email_addresses
target.user.email_addresses
file_path principal.file.full_path
principal.process.file.full_path
principal.process.parent_process.file.full_path
target.file.full_path
target.process.file.full_path
target.process.parent_process.file.full_path
hash about.file.md5
about.file.sha1
about.file.sha256
principal.process.file.md5
principal.process.file.sha1
principal.process.file.sha256
security_result.about.file.sha256
target.file.md5
target.file.sha1
target.file.sha256
target.process.file.md5
target.process.file.sha1
target.process.file.sha256
hostname intermediary.hostname
observer.hostname
principal.asset.hostname
principal.hostname
src.asset.hostname
src.hostname
target.asset.hostname
target.hostname
ip intermediary.ip
observer.ip
principal.artifact.ip
principal.asset.ip
principal.ip
src.artifact.ip
src.asset.ip
src.ip
target.artifact.ip
target.asset.ip
target.ip
namespace principal.namespace
src.namespace
target.namespace
process_id principal.process.parent_process.pid
principal.process.parent_process.product_specific_process_id
principal.process.pid
principal.process.product_specific_process_id
target.process.parent_process.pid
target.process.parent_process.product_specific_process_id
target.process.pid
target.process.product_specific_process_id
user about.user.userid
observer.user.userid
principal.user.user_display_name
principal.user.userid
principal.user.windows_sid
src.user.userid
target.user.user_display_name
target.user.userid
target.user.windows_sid

Cómo agregar comentarios en una consulta

Puedes agregar comentarios dentro del editor de búsqueda para documentar la lógica de búsqueda compleja o inhabilitar temporalmente las condiciones durante las pruebas:

  • Comentarios de una sola línea: Agrega dos barras diagonales (//) antes del texto del comentario. Se ignorará todo lo que aparezca después de las barras en esa línea.
  • Comentarios de bloque de varias líneas: Encierra el texto del comentario entre /* y */. Los comentarios de bloqueo pueden abarcar varias líneas.

Ejemplo:

metadata.event_type = "NETWORK_CONNECTION" AND
// Exclude approved corporate proxy traffic
target.ip != "192.0.2.100" AND
/* Uncomment the lines below when investigating specific lateral
   movement across subnet 10.240.0.0/16 */
// principal.ip = /10.240\..*/ AND
// network.sent_bytes > 5000000

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.