Começar a usar: YARA-L 2.0 em SecOps
A YARA-L 2.0 é a linguagem de consulta exclusiva e altamente estruturada que alimenta o Google Security Operations para todas as pesquisas, painéis e detecção de ameaças baseada em regras. Este documento ajuda você a entender a estrutura principal do YARA-L e fornece etapas práticas para usá-lo, seja você um analista de segurança em busca de ameaças ou um engenheiro de detecção criando uma nova lógica robusta.
Antes de começar
- Verifique se você tem acesso à plataforma do Google SecOps.
- Verifique a ingestão de dados usando regras de teste.
- É necessário ter um conhecimento básico de conceitos de segurança e dados de registros.
- Este documento pressupõe que os dados estão sendo ingeridos na sua instância do Google SecOps e normalizados para o modelo de dados unificado (UDM).
Entender a estrutura do YARA-L
Cada consulta YARA-L é segmentada em seções distintas e nomeadas, que determinam o comportamento da consulta.
Essa estrutura permite a análise e a correlação em várias etapas.
| Comando | Ação | Opcional | Obrigatório |
|---|---|---|
meta |
Define metadados descritivos para a regra, como autor, descrição e gravidade. | Opcional para pesquisa e painéis. Necessário apenas para regras. |
events |
Define e filtra eventos. Declara todas as fontes de dados (principalmente eventos) a serem consideradas e as filtra usando campos da UDM. | Obrigatório (lógica principal da consulta) para pesquisa, painéis e regras. |
match |
Agrupa por eventos e permite especificar o período aceito (por exemplo, by 5m). |
Necessário em alguns casos para pesquisas estatísticas em que ocorre agregação. Obrigatório para consultas de correlação de vários eventos. A especificação de tempo é obrigatória no match para regras e opcional para pesquisa e painéis. |
outcome |
Calcula métricas essenciais e gera insights (por exemplo, count(), avg()). |
Opcional. |
condition |
Define a lógica que precisa ser atendida para retornar resultados (na pesquisa) ou acionar um alerta (em uma regra). Avalia os critérios da variável de consulta para determinar se um resultado se aplica (por exemplo, $event >5). |
Opcional em pesquisas e painéis. Necessário apenas para regras. |
dedup |
Remove eventos duplicados agrupando-os com base em variáveis ou caminhos de eventos principais (por exemplo, target.user.userid, target.ip, principal.hostname ou variáveis, como $host, $user). Saiba mais sobre variáveis de evento. |
Opcional. Não disponível em regras. |
order |
Classifica os resultados definidos por campos específicos (por exemplo, asc). |
Opcional (aplicável somente quando match é usado). Não disponível em regras. |
limit |
Restringe o número máximo de eventos retornados da consulta. | Opcional. Não disponível em regras. |
select |
Especifica a lista de campos da UDM a serem incluídos nos resultados da consulta. | Opcional. Não disponível em regras. |
unselect |
Especifica a lista de campos do UDM a serem excluídos dos resultados da consulta. | Opcional. Não disponível em regras. |
Disponibilidade de fontes de dados da YARA-L
A YARA-L tem acesso a diferentes fontes de dados, dependendo de onde você está na plataforma. Eventos, entidades (ECG) e tabelas de dados estão totalmente disponíveis em pesquisas, painéis e regras.
A tabela a seguir lista os recursos disponíveis na YARA-L:
| Recurso | Disponível em |
|---|---|
| Casos e histórico de casos | Painéis |
| Tabela de dados | Pesquisa, painéis, regras |
| Entidades (ECG) | Pesquisa, painéis, regras |
| Métricas de ingestão | Painéis |
| Correspondências de IoC | Painéis |
| Detecções de regras | Painéis, regras |
| Conjuntos de regras | Painéis |
| Eventos | Pesquisa, painéis, regras |
| Métricas de UEBA | Pesquisa, painéis |
Criar sua primeira pesquisa YARA-L
Todos os dados no Google SecOps são pesquisados usando dois métodos principais com base nas suas metas: pesquisa por filtro e pesquisa estatística (agregações).
Filtrar pesquisa (filtragem de eventos)
O método pesquisa de filtro permite isolar eventos específicos do fluxo de telemetria mais amplo sem a sobrecarga da agregação estatística. Esse método usa critérios para reduzir grandes volumes de dados de segurança, como registros ou tráfego de rede, a um conjunto de resultados direcionado. A lógica exige apenas que você especifique eventos na seção events.
Para criar sua primeira pesquisa de filtro YARA-L, siga estas etapas para pesquisar usuários com falhas de login:
- No Google SecOps, acesse a página Pesquisar.
-
Filtre eventos de login:
metadata.event_type = "USER_LOGIN"
Dica: você pode omitir o cabeçalho da seção
events:nas suas pesquisas. Por padrão, a sintaxe de pesquisa implica esta seção. - Adicione ações
eventpara logins com falha de usuários que não têm umuseridvazio.metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" - Execute essa pesquisa para conferir os resultados.
Usar variáveis de marcador de posição
Use variáveis de substituição para extrair valores específicos dos seus eventos, como um nome de usuário ou um endereço IP. Essas variáveis funcionam como âncoras temporárias que permitem comparar dados de diferentes eventos ou mostrar esses valores na saída final.
Você aplica variáveis de marcador de posição para fazer o seguinte:
- Fazer ponte entre dados: use marcadores de posição, como
$useridou$ip, para encontrar correspondências entre diferentes variáveis de evento. Por exemplo, use$useridpara vincular o identificador do usuário nos eventos de login e logout. - Agrupar resultados: na seção
match, use variáveis de marcador de posição para definir o período da saída da consulta, comomatch: $userid over 1h. - Criar resultados: use marcadores de posição para capturar e mostrar pontos de dados específicos na saída da consulta.
Por exemplo, se você atribuir $user = principal.user.userid, a variável $user vai conter o valor específico extraído do evento. Em seguida, use $user na seção match para agrupar toda a atividade relacionada a esse usuário específico.
Pesquisa estatística (agregação)
O método de pesquisa estatística ajuda você a receber insights, tendências ou anomalias realizando cálculos em conjuntos de eventos. Em vez de retornar uma lista de registros individuais, ele fornece resumos agregados dos seus dados. A lógica usa as seções match (para agrupamento) e outcome (para cálculos). A seção outcome é compatível com funções de agregação, como count(), sum(), avg(), max(), min() e stddev().
O exemplo a seguir usa esta lógica de consulta:
events: filtra os dados brutos de tentativas de login sem sucesso.match: define os eventos de agrupamento (poruserid).outcome: realiza a agregação estatística (contagem de eventos por usuário).
Exemplo: agregar a atividade de login com falha usando funções outcome
O exemplo a seguir usa as funções de agregação da seção outcome (como count() ou sum()) para resumir a atividade de falha no login.
Use a seção
matchpara agrupar os eventos de login com falha poruserid:metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" match: principal.user.useridUse o
countde logins com falha para cada usuário ($failed_login_count), definido pela variáveloutcome:metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" match: principal.$user.userid outcome: $failed_login_count = count(metadata.id)Execute essa pesquisa para conferir os resultados.
Opcional: adicione um elemento de tempo à seção
match(neste caso,day). Em seguida, atualize a variáveloutcomepara ser mais explícita ($daily_failed_login_count):metadata.event_type = "USER_LOGIN" security_result.action = "FAIL" principal.user.userid != "" $user =principal.user.userid match: principal.$user.userid by day outcome: $daily_failed_login_count = count(metadata.id)
Criar um widget de painel com base na pesquisa
Você pode criar um widget de painel com base em pesquisas agregadas, como mostrado no exemplo de como criar sua primeira pesquisa.
Depois que a pesquisa for validada, você poderá salvá-la como um widget e adicioná-la ao painel da seguinte forma:
- Quando os resultados aparecerem, clique na guia Visualizar > Adicionar ao painel.
- Configure o widget:
- Dê um nome ao widget (por exemplo,
"Daily Failed Login"). - Selecione um período.
- Escolha se quer adicionar a um painel existente ou novo.
- Clique em Adicionar.
- Dê um nome ao widget (por exemplo,
- Opcional: crie consultas diretamente nos painéis. Como alternativa, copie painéis selecionados e modifique as edições nas consultas deles como ponto de partida.
- Opcional: você pode criar um painel personalizado e adicionar widgets a ele usando YARA-L. Para mais detalhes, consulte Criar um painel personalizado.
Configure um painel
Ao criar um painel, a seção events é um ponto de partida obrigatório. Lá, você tem a flexibilidade de usar match (para agrupar resultados) ou outcome (para calcular saídas e agregações).
Por exemplo, você pode ter um painel com seções events e match, em que o painel mostra a gravidade ($severity) das detecções agrupadas em intervalos by hour.
Exemplo: agregar séries temporais por gravidade
É possível criar um painel usando as seções events e match para mostrar a gravidade ($severity) das detecções agrupadas em intervalos hour:
detection.detection.severity != "UNKNOWN_SEVERITY"
$severity = detection.detection.severity
match:
$severity by hour
Exemplo: agregar o impacto crítico total
Da mesma forma, é possível criar um painel usando as seções events e outcome para rastrear detecções de alta gravidade:
detection.detection.severity = "CRITICAL"
$severity = detection.detection.severity
outcome:
$detection_count = count_distinct($severity)
Exemplo: visualizar o volume de detecção por gravidade ao longo do tempo
No exemplo a seguir, você pode contar detecções críticas e especificar o período no console. Em muitos casos, você vai usar as seções match e outcome ao criar uma visualização em um dashboard:
detection.detection.severity != "UNKNOWN_SEVERITY"
$severity = detection.detection.severity
match:
$severity by hour
outcome:
$detection_count = count_distinct(detection.id)
Exemplo: calcular a frequência de login do usuário
O exemplo a seguir se concentra no cálculo do login_count para usuários específicos usando as seções match e outcome:
events:
metadata.event_type = "USER_LOGIN"
match:
target.user.userid
outcome:
$login_count = count(metadata.id)
Criar uma regra
Uma regra requer as seguintes seções:
meta: contém o nome da regra e detalhes descritivos.events: define suas fontes de dados e filtros usando variáveis de evento.condition: especifica quais variáveis de evento precisam existir para que a regra seja acionada.
Definir e usar variáveis de evento
As variáveis de evento funcionam como um contêiner lógico, agrupando seus filtros para que você possa consultar essa atividade específica em toda a pesquisa, regra ou painel.
Ao definir a lógica na seção events, você pode usar variáveis de evento (como $e) para representar um evento específico (ou um grupo de eventos) que corresponda aos seus critérios.
Exemplo: definir e filtrar variáveis de evento
Para definir uma variável de evento (por exemplo, $e), use um prefixo na seção events da consulta. Isso declara que esses eventos serão representados pela variável. Por exemplo, a expressão $e.principal.hostname = "dev" avalia cada evento para determinar se o nome do host é uma correspondência exata.
$e.principal.hostname = "dev"
$e.metadata.event_type = "USER_LOGIN"
Em seguida, use essa variável em outras seções da consulta para fazer referência a esse grupo específico de eventos (nas seções match, outcome e condition) e aos campos de dados deles.
Organizar a estrutura e a sintaxe das regras
Use a seguinte estrutura e sintaxe de regra para definir variáveis, lógica de agrupamento e limites de acionamento:
| Elemento | Descrição | Exemplo |
|---|---|---|
| Estrutura da regra | Encapsula sua consulta em um bloco rule e atribui um nome exclusivo para identificar a detecção. |
rule DailyFailedLoginAttempts { } |
Seção meta |
Obrigatório. Inclui metadados descritivos (como "author", "description", "severity") para melhorar o gerenciamento de regras e fornecer contexto à sua equipe. Recomendado como prática recomendada para gerenciamento de regras. | author = "Alex"severity = "Medium" |
| Variável de evento | Em uma consulta de regras, cada campo na seção events tem um prefixo com uma variável de evento (como $e) para representar um evento específico (ou um grupo de eventos) que corresponda aos seus critérios. Eles funcionam como agrupamentos lógicos de filtros. No exemplo Converter sua pesquisa em uma regra YARA-L, $e representa todas as falhas de login do usuário. |
$e.metadata.event_type = "USER_LOGIN" |
| Variável de marcador | Atribui um evento a um nome comum que pode ser referenciado mais tarde na consulta. Para mais detalhes, consulte Usar variáveis de marcador de posição. | $userid = $e.principal.user.userid |
Seção match |
Define seus agrupamentos e especifica um período compatível. No exemplo Converter sua pesquisa em uma regra YARA-L, o agrupamento match: $userid over day agrupa corretamente os eventos pelo ID do usuário em cada período de 24 horas (1d). Ao escrever uma regra, especifique um período de tempo compatível para definir seu período de retorno. É possível implementar uma janela de salto, deslizante ou de rotação, dependendo dos requisitos da sua lógica. Usar o operador over explicitamente cria uma janela de salto. |
$userid over 1d |
Seção outcome |
Realiza agregações estatísticas ou captura variáveis específicas para tornar os alertas resultantes mais informativos. Use a função count() em $e.metadata.id para agregar eventos em cada grupo match. Você também pode atribuir variáveis, como $userid, para capturar campos específicos do UDM e fornecer mais contexto na saída de detecção resultante. |
$failed_count = count($e.metadata.id) |
Seção condition |
Obrigatório para que uma regra gere uma detecção. Define o limite de detecção na seção condition. Por exemplo, usar #e > 5 exige que a contagem de eventos exceda cinco (5) para acionar um alerta. Se você não estiver fazendo cálculos, ainda precisará de uma seção condition e declarar a existência da variável de evento (por exemplo, #e). Analise a linha de base do seu ambiente para definir limites que detectem atividades suspeitas e minimizem os falsos positivos. Se você não estiver fazendo cálculos, ainda precisará de uma seção condition e simplesmente declarar a existência da variável de evento, como #e. |
#e > 5 ou $e |
Para entender como essa estrutura funciona, confira o exemplo a seguir.
Exemplo: detectar força bruta (vários logins com falha)
O exemplo a seguir detecta várias tentativas de login malsucedidas de um único usuário em um período de 24 horas:
rule DailyFailedLoginAttempts {
meta:
author = "Alex"
description = "Detects multiple failed login attempts for a single user within a day."
severity = "Medium"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
$e.principal.user.userid != ""
$userid = $e.principal.user.userid
match:
$userid over 1d
outcome:
$daily_failed_login_count = count($e.metadata.id)
condition:
$daily_failed_login_count > 5
}
Converter sua pesquisa em uma regra YARA-L
Para converter uma consulta de pesquisa finalizada em uma regra confiável para gerar detecções, siga estas etapas:
- No Google SecOps, acesse o Editor de regras.
- Inicie uma nova regra.
- Cole a consulta de pesquisa e modifique-a para se adequar à estrutura da regra, incluindo:
- Seção
meta: define a regra de metadados, incluindo o nome, o autor e o nível de gravidade. - Seção
event: obrigatória. Ao contrário da pesquisa, você precisa ter um cabeçalho de seçãoevent` nomeado. - Variáveis de evento: declaram e referenciam eventos específicos (ou grupos de eventos) na sua lógica.
- Seção
matchcom períodos de tempo compatíveis: especifica as chaves de agrupamento e define os parâmetros de tempo (por exemplo,5mou1d). Observação: se você usar uma seçãomatchem regras, adicione um período de tempo. - Seção
condition: define a lógica ou o limite final que precisa ser atendido para acionar uma regra.
- Seção
Avançado: criar uma regra de vários eventos
Você usa uma regra de vários eventos para correlacionar diferentes tipos de atividade que ocorrem em um período específico. Em vez de analisar um único evento, você conecta vários eventos, como um usuário fazendo login e imediatamente realizando um download de arquivo incomum, para identificar ameaças complexas.
Uma regra de vários eventos requer as seguintes seções:
meta: contém o nome da regra e detalhes descritivos.events: define suas fontes de dados e filtros usando variáveis de evento.match: define o período e a variável de marcador de posição usada para vincular seus eventos.outcomeCaptura mais contexto para o alerta. As regras de vários eventos exigem uma função de agregação.condition: especifica quais variáveis de evento precisam existir para que a regra seja acionada.
Para criar uma regra de vários eventos, faça o seguinte:
- Defina as variáveis de evento: na seção de eventos, defina
$e1para capturar eventos"PROCESS_LAUNCH"e$e2para capturar hashes de arquivos maliciosos específicos. - Correlacionar com marcadores de posição: use a variável de marcador de posição
$userpara conectar esses dois fluxos de eventos distintos por um ID de usuário principal compartilhado (por exemplo,$user = $e1.principal.user.userid and $user = $e2.principal.user.userid). - Agrupe a correspondência: na seção
match, especifique que esses eventos precisam acontecer para o mesmo$userem um período definido, como 5 minutos (5m).
Exemplo: criar uma regra de vários eventos
No exemplo a seguir, $e1 representa um evento PROCESS_LAUNCH, e $e2 representa um evento com um hash malicioso específico. A variável de marcador de posição $user correlaciona esses eventos pelo mesmo ID de usuário principal.
rule MultiEventExample {
meta:
author = "Alex"
description = "Detects a bad hash execution or a process launch from a specific IP for the same user."
events:
$e1.principal.ip = "1.1.1.1"
$e1.metadata.event_type = "PROCESS_LAUNCH"
$e2.target.file.sha256 = "badhash..."
$user = $e1.principal.user.userid
$user = $e2.principal.user.userid
match:
$user over 5m
condition:
$e1 or $e2
}
Os componentes de regra a seguir descrevem a lógica usada no exemplo:
- Variáveis de evento: definidas duas variáveis de evento,
$e1e$e2. Usamos a variável de marcador de posição$userpara unir esses eventos no campo comumuserid. - Seção
match: incluímos uma seçãomatchpara que essa regra de vários eventos agrupe por usuário e especifique uma janela de tempo de salto de cinco minutos (5m) para correlacionar os eventos. - Seção
condition: define a lógica para acionar o alerta. Esse exemplo aciona um alerta se o primeiro ou o segundo evento existir.
Usar outras ferramentas para criar sua consulta
Essas ferramentas são companheiras essenciais para escrever, validar e acelerar a adoção do YARA-L:
- Ferramenta de pesquisa do UDM: pesquise e consulte rapidamente nomes de campos, definições e tipos de dados do UDM diretamente na UI. Se o ID do campo for desconhecido, priorize a verificação dessa referência.
- Pesquisa de linguagem natural para YARA-L: na barra de pesquisa, insira descrições para criar sua consulta inicial ou receber/traduzir sugestões correspondentes em YARA-L.
- Tradutor de SPL para YARA-L (ferramenta do Labs): se você estiver migrando de plataformas concorrentes, use essa ferramenta (disponível na seção Labs) para converter consultas SPL legadas do Splunk em YARA-L. Isso gera um ponto de partida estruturado, o que acelera a migração e refina a lógica de detecção. Para usar a ferramenta do Labs, no Google SecOps, acesse yourinstancename.chronicle.security/labs.
A seguir
- Confira a sintaxe completa da linguagem YARA-L 2.0.
- Navegue pelas funções da YARA-L 2.0
- Procure mais exemplos na comunidade do Google SecOps.
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.