A engine de busca de dados do Harpia oferece ao usuário a possibilidade de construir consultas utilizando duas possíveis linguagens/bibliotecas de busca.
Lucene não é propriamente uma linguagem, e sim uma biblioteca de software de código aberto amplamente utilizada para indexação e pesquisa de texto em aplicativos. Lucene é uma biblioteca Java que fornece recursos para criar índices de texto a partir de documentos e, em seguida, realizar pesquisas eficientes nesses índices. Ela é usada em muitos sistemas de pesquisa, mecanismos de busca na web, sistemas de recomendação e em qualquer aplicativo que envolva a busca e recuperação de informações baseadas em texto.
No Harpia, é considerada a biblioteca de busca default (padrão) e pode ser utilizada para realização de buscas na tela de investigação, bem como na criação de consultas nos casos de uso do tipo match, threshold e correlation.
Assim como toda linguagem/biblioteca, possui peculiaridades, e por esta razão descreveremos alguns dos principais operadores, pontuando sua aplicação, bem como fornecendo exemplos para auxíliar na formulação de consultas.
Operadores/Sinais | Descrição | Exemplo |
---|---|---|
: | Sinal representa a igualdade entre um campo e um dado valor | idade:45 |
. | Utilizado para representação flatten de objetos aninhados (json) | destination.ip:10.1.254.10 é o mesmo que: {"destination": {"ip": "10.1.254.10"}} |
> | Operador lógico maior que | source.port:>5000 |
>= | Operador lógico maior que ou igual | source.port:>=5000 |
< | Operador lógico menor que | source.port:<5000 |
<= | Operador lógico menor que ou igual | source.port:<=5000 |
AND | Operador lógico "E" | destination.ip:10.1.254.10 AND source.port:53 |
OR | Operador lógico "OU" | destination.ip:10.1.254.10 OR source.port:53 |
NOT | Operador de negação | NOT destination.ip:10.1.254.10 |
_exists_ | Verifica se determinado campo existe no mapping do Harpia | _exists_:MemberName |
() | Usa-se parênteses quando se deseja pesquisar um campo dentro de uma lista de possíveis valores | source.port:(53, 22, 80, 433) |
Esta busca funciona porque o valor buscado não contém espaços.
user.name:joao.maria
Esta busca não funciona porque o valor buscado contém espaços.
user.name:joao maria
Para buscar frases ou sequências com espaços, deve-se envolver o texto entre aspas duplas e adicionar o caractere de escape antes do espaço. Isso funcionará.
user.name:"joao\ maria"
O mesmo deve ser feito quando o nome do campo contiver um espaço, deve-se adicionar o caractere de escape antes do espaço. Isso funcionará.
Não funciona:
protection Type:"IPS"
Funciona:
protection\ Type:"IPS"
Consultas que envolvam campos do tipo IPV6 como parâmetro devem ser envolvidas entre aspas duplas. Isto é necessário em razão do caractere : ser um caractere reservado do Opensearch para representar o divisor entre chave e valor em Lucene.
Não funciona:
destination.ip:1050:0:0:0:5:600:300c:326b
Funciona:
destination.ip:"1050:0:0:0:5:600:300c:326b"
O caractere coringa * possibilita a generalização de algumas buscas, trazendo eventos que possuem algum termo comum. Também é útil para retornar termos independentemente de sua posição no texto.
user.name:*Nascimento*
Quando estamos usando LUCENE no Harpia, por convenção, não são permitidos operadores ou funções que manipulem o tempo (essas manipulações são realizadas nos filtros interativos da tela de investigação ou no campo "interval" existente na tela de cadastro de regras) e/ou realizem funções agregadas de domínio. Isto é convencionado para que a principal utilização da biblioteca seja no retorno de eventos por meio de consultas que explorem a combinação de operadores lógicos.
É uma linguagem de programação projetada para gerenciar, consultar e manipular dados em bancos de dados relacionais. Use comandos SQL para recuperar informações específicas (consultas), adicionar, atualizar ou excluir dados (operações CRUD) e definir a estrutura de suas tabelas (DDL - Linguagem de Definição de Dados).
A motivação para inclusão do SQL no Harpia foi possibilitar a construção de consultas e casos de uso mais robustos, utilizando funções de agregaçã,o tais como HAVING COUNT, GROUP BY, COUNT, MIN, MED, MAX, JOIN, INNER JOIN, LEFT JOIN, entre outras, permitindo a análise do dado de forma mais sumarizada, bem como a realização de consultas que busquem determinados campos em outras listas de dados. Por esta razão, funções de agregação de domínio, entre outras que manipulam tempo, são permitidas.
O Harpia considera o alias harpia-search como a tabela principal para a execução das consultas, logo, toda SQL testada na tela de investigação, bem como regra (caso de uso) criado no harpia deve referir-se ao database dos eventos pelo alias harpia-search. O ponto de atenção é que ao executar uma SQL na tela de investigação do SIEM, a gestão de períodos de tempo das consultas deve ser informada através do filtro de seleção de tempo presente na tela de investigação.
Quando na tela de criação de regras avançadas, a especificação do intervao é um pouco diferente e requer a menção do intervalo de forma explicita dentro da própria query SQL, conforme exemplo a seguir que especifica um intervalo de análise de 5 minutos:
SELECT device.manufacturer, device.hostname, source.ip, destination.ip FROM harpia-search WHERE
harpia.timestamp > date_sub(now(), INTERVAL 5 minute) AND
harpia.timestamp < date_add(now(), INTERVAL 0 minute)
Para abordar em SQL a comparação de campos do tipo IP, também há uma particularidade no Harpia, isto porque nossa base de big data mapeia os campos de IP's como IP e não como String.
Não funciona:
source.ip = "10.0.12.250"
source.ip <> "10.0.12.250"
Funciona:
AND (MATCH("source.ip", "10.0.12.250"))
AND NOT (MATCH("source.ip", "10.0.12.250"))
Por questões de segurança dos dados, alguns comandos, tais como INSERT, UPDATE, DELETE, são vetados pela engine de buscas. Ou seja, apenas consultas do tipo SELECT podem ser realizadas.
No Harpia, a SQL não é uma linguagem de busca nativa do cluster de dados, e sim um plugin que o mesmo oferece para que o usuário tenha a possibilidade de criar consultas e casos de uso mais robustos utilizando o poder da SQL. Resumidamente, o cluster de dados do Harpia não é relacional, logo, o plugin SQL é uma bela abstração que permite que o usuário realize buscas na linguagem SQL, sendo que estas são transpiladas para Lucene antes de serem processadas pela engine de buscas.