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, é necessário 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 de 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 tipos enumerados precisam ser escritos como strings de texto em maiúsculas que correspondam exatamente às definições válidas do dicionário do 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 true ou false (não diferenciam maiúsculas de minúsculas, sem aspas), como no exemplo a seguir:
network.dns.response = true target.user.is_admin = false
Números inteiros e valores numéricos
Os 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 flutuantes e decimais
Para campos UDM do tipo flutuante ou duplo, 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 no 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 uma string literal tiver barras invertidas ou aspas duplas, use uma barra invertida (\\) antes desses caracteres para que eles sejam ignorados, como no exemplo a seguir:
- Use
\\para corresponder a uma barra invertida literal (\\). Use
\"para corresponder a uma aspa dupla literal (").Pesquise caminhos de arquivo 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 de regex entre barras (/ /) em vez de aspas duplas. O Google SecOps usa o mecanismo de expressão regular RE2 padrão:
Corresponda qualquer IP principal no intervalo 10.x.x.x, como este:
principal.ip = /10\..*/Pesquise a execução do PsExec com a extensão opcional
.exe, sem diferenciar maiúsculas de minúsculas, como no exemplo a seguir:target.process.command_line = /\bpsexec(\.exe)?\b/ nocaseCorresponda nomes de host de DNS dinâmico que seguem 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. É possível usar parênteses () para agrupar explicitamente expressões e controlar a precedência de 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 as condições OR das 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 do UDM. Cada entrada armazena um par de chave-valor:
additionalcampos: podem conter vários pares de chave-valor por evento (additional.fields["key"] = "value").labelscampos: podem 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"
Regex avançada e correspondência de valores que não são strings 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 de campo protobuf totalmente qualificado:
Corresponder 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 > 500Pesquise em várias chaves dinâmicas que correspondem a um prefixo de regex:
additional.fields.key = /^myKeyNumber_.*/Verifique se uma chave existe, independentemente 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 de UDM ao mesmo tempo sem digitar cada campo individualmente.
O exemplo a seguir mostra como inserir uma consulta para corresponder aos campos comuns do UDM que podem conter o endereço IP especificado:
ip = "1.2.3.4"
É possível fazer a correspondência de um campo agrupado usando uma expressão regular e o operador nocase. Também é possível usar listas de referência. Os campos agrupados também podem ser usados em
combinação com campos de UDM regulares, como mostrado no exemplo a seguir:
ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"
Tipos de campos de UDM agrupados
É possível pesquisar em todos os seguintes campos de UDM agrupados:
| 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
É possível adicionar comentários no editor de pesquisa para documentar uma lógica de busca complexa ou desativar temporariamente as condições durante os testes:
- Comentários de linha única: use duas barras (
//) como prefixo do texto do comentário. Tudo o que estiver depois das barras nessa linha será ignorado. - Comentários de 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.