Entender a sintaxe de pesquisa
Este guia é destinado a analistas de segurança que querem configurar expressões de pesquisa (valores de dados, escapes, operadores etc.) no editor de consultas da página de pesquisa do SIEM.
Ao escrever expressões de pesquisa YARA-L 2.0 ou SQL no editor de consultas do Google Security Operations, você precisa formatar os valores de dados, operadores e sequências de escape de string de acordo com o tipo de dados exato do campo UDM de destino. Uma condição de pesquisa consiste em um nome de campo da UDM, um operador de comparação (=, !=, >, <, <=, >=) e um valor de dados formatado.
Formatar valores de dados por tipo de dados
Esta seção descreve:
Valores enumerados (enums)
Os enums precisam ser escritos como strings de texto em maiúsculas que correspondem exatamente às definições válidas do dicionário da UDM, entre aspas duplas ("), como no exemplo a seguir:
metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"
Valores booleanos
Os campos booleanos aceitam verdadeiro ou falso (não diferenciam maiúsculas de minúsculas, não exigem aspas), como no exemplo a seguir:
network.dns.response = true target.user.is_admin = false
Números inteiros e valores numéricos
Números inteiros e de porta são escritos como dígitos literais sem aspas duplas, como no exemplo a seguir:
target.port = 443 network.sent_bytes > 10485760
Valores de ponto flutuante e decimais
Para campos UDM do tipo float ou double, insira um número decimal ou inteiro sem aspas duplas, como no exemplo a seguir:
security_result.about.asset.vulnerabilities.cvss_base_score = 9.8
Strings de texto
Os valores de texto padrão precisam estar entre aspas duplas ("), como no exemplo a seguir:
metadata.product_name = "Google Cloud VPC Flow Logs" target.asset.asset_id = "srv-prod-us-central1-a"
Correspondência que não diferencia maiúsculas de minúsculas (nocase)
Por padrão, as comparações de strings em YARA-L 2.0 diferenciam maiúsculas de minúsculas. Para corresponder a qualquer combinação de caracteres maiúsculos e minúsculos, adicione o operador nocase diretamente ao final da condição, como no exemplo a seguir:
principal.hostname != "http-server" nocase principal.user.userid = "jdoe" nocase
Escape de string (\ e ")
Se um literal de string contiver barras invertidas ou aspas duplas, faça escape desses caracteres usando uma barra invertida inicial (\\), como no exemplo a seguir:
- Use
\\para corresponder a uma barra invertida literal (\\). Use
\"para corresponder a uma aspa dupla literal (").Pesquise caminhos de arquivos do Windows com barras invertidas de escape:
principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"Pesquise linhas de comando que contenham aspas duplas incorporadas:
target.process.command_line = "cmd.exe /c \"c:\\program files\\malicious.exe\""
Expressões regulares (sintaxe RE2)
Para pesquisar usando expressões regulares, coloque o padrão entre barras (/ /) em vez de aspas duplas. O Google SecOps usa o mecanismo de expressão regular RE2 padrão:
Corresponda a qualquer IP principal no intervalo 10.x.x.x, assim:
principal.ip = /10\..*/Pesquise a execução do PsExec com a extensão
.exeopcional, sem diferenciar maiúsculas de minúsculas, como no exemplo a seguir:target.process.command_line = /\bpsexec(\.exe)?\b/ nocaseCorresponda a nomes de host DNS dinâmicos seguindo um padrão numerado, como no exemplo a seguir:
principal.hostname = /dns-server-[0-9]+/ nocase
Lógica booleana e precedência de operadores
Combine várias condições de pesquisa usando os operadores AND, OR e NOT. Você pode usar parênteses () para agrupar expressões explicitamente e controlar a precedência da avaliação, conforme mostrado nos exemplos a seguir:
Pesquise eventos de login de usuários específicos em um host sensível, como no exemplo a seguir:
metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"Use parênteses para isolar condições OR de cadeias AND, como no exemplo a seguir:
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/)
Pesquisar pares de chave-valor nos campos additional e labels
Os campos additional e labels servem como contêineres flexíveis para dados de eventos personalizados e atributos de fornecedores terceirizados que não são mapeados para campos padrão da UDM. Cada entrada armazena um par de chave-valor:
additionalfields: pode conter vários pares de chave-valor por evento (additional.fields["key"] = "value").labelsfields: pode conter apenas um par de chave-valor por evento (labels["key"] = "value").
Correspondência exata de chave-valor (field["key"] = "value")
Use a sintaxe de colchetes para consultar diretamente uma chave específica e o valor de string correspondente, como no exemplo a seguir:
additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"
Correspondência avançada de expressões regulares e valores não string em campos additional
Se você precisar consultar valores numéricos/booleanos em campos additional ou corresponder chaves e valores usando expressões regulares, use o caminho totalmente qualificado do campo protobuf:
Corresponda a qualquer string de valor dentro do contêiner adicional por regex:
additional.fields.value.string_value = /suspicious_payload_.*/ nocaseCorresponder valores booleanos ou numéricos em campos personalizados:
additional.fields.value.bool_value = true additional.fields.value.number_value > 500Pesquisar várias chaves dinâmicas que correspondem a um prefixo de regex:
additional.fields.key = /^myKeyNumber_.*/Verifique se uma chave existe, independente do valor:
additional.fields["pod_name"] != ""Use expressões regulares e
nocasediretamente com a sintaxe de colchetes:additional.fields["pod_name"] = /br/ additional.fields["pod_name"] = bar nocaseCombine vários pares de chave-valor
additional.fieldsusandoAND:additional.fields["pod_name"] = "kube-scheduler" AND additional.fields["namespace"] = "kube-system"
Pesquisar campos agrupados
Os campos agrupados são aliases para grupos de campos de UDM relacionados. É possível usá-los para consultar vários campos da UDM ao mesmo tempo sem digitar cada um deles individualmente.
O exemplo a seguir mostra como inserir uma consulta para corresponder aos campos comuns da UDM que podem conter o endereço IP especificado:
ip = "1.2.3.4"
É possível corresponder um campo agrupado usando uma expressão regular e o operador nocase. As listas de referência também são aceitas. Os campos agrupados também podem ser usados em combinação com campos normais da UDM, conforme mostrado no exemplo a seguir:
ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"
Tipos de campos agrupados do UDM
Você pode pesquisar em todos os seguintes campos agrupados da UDM:
| Nome do campo agrupado | Campos de UDM associados |
|---|---|
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 |
Adicionar comentários em uma consulta
Você pode adicionar comentários no editor de pesquisa para documentar uma lógica de busca complexa ou desativar temporariamente as condições durante o teste:
- Comentários de linha única: adicione o prefixo de duas barras (
//) ao texto do comentário. Tudo o que vier depois das barras nessa linha será ignorado. - Comentários em bloco de várias linhas: coloque o texto do comentário entre
/*e*/. Os comentários em bloco podem abranger várias linhas.
Exemplo:
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
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.