Cómo comprender la sintaxis de búsqueda
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
.exeopcional, sin distinguir mayúsculas de minúsculas, como en el siguiente ejemplo:target.process.command_line = /\bpsexec(\.exe)?\b/ nocaseCoincide 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:
additionalcampos: Pueden contener varios pares clave-valor por evento (additional.fields["key"] = "value").labelscampos: 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_.*/ nocaseCoincide con valores booleanos o numéricos dentro de los campos personalizados:
additional.fields.value.bool_value = true additional.fields.value.number_value > 500Busca 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
nocasedirectamente con la sintaxis de corchetes:additional.fields["pod_name"] = /br/ additional.fields["pod_name"] = bar nocaseCombina varios pares clave-valor de
additional.fieldsconAND: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_domainabout.asset.network_domainnetwork.dns.questions.namenetwork.dns_domainprincipal.administrative_domainprincipal.asset.network_domaintarget.administrative_domaintarget.asset.hostnametarget.asset.network_domaintarget.hostname |
email |
intermediary.user.email_addressesnetwork.email.fromnetwork.email.toprincipal.user.email_addressessecurity_result.about.user.email_addressestarget.user.email_addresses |
file_path |
principal.file.full_pathprincipal.process.file.full_pathprincipal.process.parent_process.file.full_pathtarget.file.full_pathtarget.process.file.full_pathtarget.process.parent_process.file.full_path |
hash |
about.file.md5about.file.sha1about.file.sha256principal.process.file.md5principal.process.file.sha1principal.process.file.sha256security_result.about.file.sha256target.file.md5target.file.sha1target.file.sha256target.process.file.md5target.process.file.sha1target.process.file.sha256 |
hostname |
intermediary.hostnameobserver.hostnameprincipal.asset.hostnameprincipal.hostnamesrc.asset.hostnamesrc.hostnametarget.asset.hostnametarget.hostname |
ip |
intermediary.ipobserver.ipprincipal.artifact.ipprincipal.asset.ipprincipal.ipsrc.artifact.ipsrc.asset.ipsrc.iptarget.artifact.iptarget.asset.iptarget.ip |
namespace |
principal.namespacesrc.namespacetarget.namespace |
process_id |
principal.process.parent_process.pidprincipal.process.parent_process.product_specific_process_idprincipal.process.pidprincipal.process.product_specific_process_idtarget.process.parent_process.pidtarget.process.parent_process.product_specific_process_idtarget.process.pidtarget.process.product_specific_process_id |
user |
about.user.useridobserver.user.useridprincipal.user.user_display_nameprincipal.user.useridprincipal.user.windows_sidsrc.user.useridtarget.user.user_display_nametarget.user.useridtarget.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.