NxFilter + Graylog = Relatórios

Integrando o NxFilter com o Graylog através do Syslog

10 minute read

Relatórios no NxFilter

O NxFilter tem relatórios gráficos e com apresentação diversificada mas, como todos os sistemas hoje existentes, os relatórios disponibilizados nem sempre atendem as mais diversas necessidades. Tendo isso sido previsto, assim como a maioria dos sistemas, o serviço NxFilter vem com a possibilidade de se usar o Syslog para exportar seus registros em tempo de execução.

O que é Syslog ?

O Syslog é um protocolo criado pelo IETF para permitir que os sistemas transmitam mensagens de log usando a rede IP. Esse protocolo permite que um determinado sistema envie a um determinado servidor os registros de operações aplicados a um determinado sistema. Ele pode enviar usando UDP ou TCP.

Por exemplo, imagine que há um servidor na internet que provê serviço HTTP ( Apache/NGinx ) e há o interesse de que os registros de utilização desses sistemas ( LOGs ) sejam armazenados não só no servidor local - como ocorre por padrão - mas que pra caso haja uma auditoria ele fique quardado em outro servidor.

Para isso se instalar um servidor syslogd que atende o padrão Syslog e que irá receber os dados enviados pelo servidor HTTP já citado. Desse modo todos os dados de acesso ficarão arquivados nesse servidor remoto.

Como funciona o Syslog no NxFilter

O servidor NxFilter, conforme documentação do mesmo Syslog no NxFilter, é composto por dados separados por ‘|’ e segue o seguinte padrão e ordem para envio dos dados aos servidores Syslog:

  1. Prefixo - Identificação
  2. Data - Data/Hora da Operação
  3. Bloqueado - Se foi bloqueado ou não
  4. Domínio - Domínio requisitado - vale ressaltar que como o NxFilter é um servidor DNS não se obterá a URL
  5. Usuario - Usuário requisitante
  6. IP - IP do Cliente requisitante
  7. Política - Política aplicada ao usuário/ip requisitante
  8. Categoria - Em que categoria o domínio se enquadrou
  9. Motivo - Razão, caso tenha sido bloqueado, por que foi bloqueado.
  10. Tipo de Consulta - Código da Consulta DNS

Por exemplo, o Syslog enviará para o servidor SyslogD o seguinte texto:

   NXFILTER|2013-01-28 10:53:23|Y|www.bbc.co.uk|pwuser|192.168.0.101|admin|news|Blocked by admin|33

Que significará:

  • Prefixo : NXFILTER
  • Data : ‘2013-01-28 10:53:23’
  • Bloqueado (Sim=y/Não=n) : Y
  • Domínio : www.bbc.co.uk
  • Usuário : pwuser
  • IP Cliente : 192.168.0.101
  • Política : admin
  • Categoria : news
  • Motivo do bloqueio : ‘Blocked by admin’
  • Tipo de consulta DNS : 33

Graylog

O serviço Graylog funciona como Centralizador de Logs. Permitindo receber logs de diversas maneiras inclusive através do modo Syslog.

São criados Inputs e esses recebem as mensagens, permitindo gerar Extratores ( para quebrar e manipular as mensagens ) e Streams para gerar Dashboards e alertas.

Não vou desperdiçar o tempo explicando os motivos de se utilizar um centralizador pois já foi comentado em Graylog - Centralizador de Logs e a instalação da versão mais nova do Graylog é explicada em outro post neste mesmo blog com o título GRAYLOG 2.0 GA - CENTRALIZADOR DE LOGS.

Para esse post eu utilizei a imagem do Graylog para Docker Graylog/AllInOne, afim de tornar mais rápida e fácil a criação deste post.

Graylog - Input e Extractor

O Graylog permite que sejam criados vários canais de Input ( Entrada ) de dados, isso facilita para separarmos ou organizarmos de onde vem as informações e como estas deverão ser trabalhadas. Não digo que o modo como farei seja o mais perfeito mas é o modo como tem me atendido e essa é a beleza da ferramenta, a flexibilidade.

INPUT ( Graylog )

Então o INPUT é composto basicamente do tipo a ser trabalhado, que pode ser GELF ( formato proprietário ), JSON ( para entradas de APIs HTTP ), Syslog ( que já comentamos anteriormente ) e outros. Somado ao tipo de Input, ao se definir a criação do mesmo surgirá uma nova janela pedindo informações como, isso para o caso de criar um Input do tipo “Syslog”:

  1. O nó que escutará/receberá essas informações ( pois o Graylog pode ser formado por diversos nós )
  2. O título que será dado a esse INPUT
  3. O IP ao qual ele será vinculado
  4. A porta que escutará o serviço

Há outras opções para o mesmo INPUT mas só usaremos estas para esse post.

EXTRACTOR ( Graylog )

O Extractor do Graylog permite que você trabalhe as mensagens recebidas de modo a classificar e especificar a que se referem os valores.

Para fazer isso o Extrator oferece diversos meios seja por usando Expressão Regular, JSON, “Split & Index” ( Cortar/Indexar ), Copiando a mensagem ou usando o GROK.

Quem já trabalhou com ElasticSearch ou Logstash já conhece ou deve ter ouvido falar dele. O Grok permite que se faça uma combinação de padrões afim de extrair informações e indexa-las. A sintaxe dele é bem simples %{SINTAXE:SEMÂNTICA}. Por exemplo, se você tem a mensagem

   srvl00nxf500.bemanuel.com.br NXFILTER|2016-11-01 08:45:37

Com o GROK você usaria os seguintes padrões pra capturar e indexar a parte da mensagem:

   %{HOSTNAME:srv} %{WORD:sys}\|%{TIMESTAMP_ISO8601:date}\|

Você obteria:

srv sys date
srvl00nxf500.bemanuel.com.br NXFILTER 2016-11-01 08:45:37

Foram criados os campos/fields: srv, sys e date. Me permitindo inclusive filtrar as ocorrências por eles.

Por conta dessa facilidade usarei o Grok. No Graylog ele já vem com diversos padrões especificados, além claro dos usados aqui no exemplo ( HOSTNAME, WORD e TIMESTAMP_ISO8601 )

Os padrões Grok, são uma prédefinição de expressõesque auxiliam no tratamento da mensagem.

IMPORTANTE: Para ativar o pacote de padrões já disponibilizado no Graylog é preciso que acesse “System > Content Packs” e ative o pacote “Core Grok Patterns”.

Graylog e NxFilter - configurando

Vamos usar os seguintes parâmetros:

Alias Descrição Valor
SRVNXF Servidor NxFilter 192.168.1.1
SRVGRA Servidor Graylog 192.168.1.2
PRTSYS Porta Syslog 5140
—- Placa de rede ens18
—- Procolo do Syslog UDP

Lembrando que estou considerando que já instalou o Graylog.

No NxFilter não há a opção de se mudar a porta 514 e no Graylog ( a não ser que você esteja fazendo errado ) não se consegue levantar portas inferiores a 1024 sem que o serviço seja levantado pelo usuário “root”.

Se já usa a versão 3.4.6 ou superior os passos abaixo já não são mais necessários pois o NxFilter a partir da 3.4.6 permite definir a porta a ser usada

Para que isso funcione faremos o redirecionamento de solicitações da porta 514 para a porta 5140 - que será a utilizada neste post, conforme especificado acima.

sudo iptables -A PREROUTING -t nat -i ens18 -p udp --dport 514 -j REDIRECT --to-port 5140 

Esse comando deve ser executado no servidor Graylog com o usuário root

No servidor NxFilter tudo que é necessário ser feito é ir em Config > Setup e definir o ip do servidor Graylog.

Configurando o serviço Syslog no NxFilter

Após esse procedimento é necessário reiniciar o NxFilter.

A partir daqui todo o processo é feito no Graylog.

No Graylog temos de fazer os seguintes passos:

  1. Criar o INPUT
  2. Aplicar um Extractor na mensagem recebida
  3. Criar os Gráficos

Criando o INPUT

O INPUT é a parte base do sistema de gerenciamento de logs, através dele que são coletadas as informações. Será criado um INPUT para a entrada de registros enviados pelo NxFilter e conforme definido anteriormente a porta usada será a 5140.

Acesse o menu em “System > Inputs”, lá você terá acesso a todos os Inputs registrados.

System > Inputs

Retornando a listagem de inputs existentes e suas estatísticas. Para criar o seu input acesse o combo com a listagem de tipos de input, escolho o modelo “Syslog UDP” e clique em “Launch new input”.

Combo Input

Criando Input

Em seguida aparecerá uma janela solicitando a definição de parâmetros para esse INPUT. Defina o título/nome do input como “NxFilter” e em Node você deve escolher que servidor do Graylog receberá os registros do syslog para isso basta clicar na seta do combo e aparecerá a listagem dos nodes registrados, deixe Bind address com o valor padrão ‘0.0.0.0’ e em port - que é a porta que o serviço deverá abrir para reveber os registros - sete o valor 5140.

Há ainda outros parâmetros mas para o momento somente esses interessam.

Deverá aparecer um item como o abaixo…

Definindo parâmetros do INPUT

Após a criação do Input deverá aparecer o item contendo: 1. título e protocolo definidos 2. a porta 3. Botões para: Exibir as mensagens, Gerenciar Extratores, Parar o Input e outros…

Resultado da criação do Input

Neste ponto se estiver tudo correto o item Input recém criado deverá exibir mensagens como a abaixo ao se clicar em “Show received messages”.

Mensagens capturadas

Agora é o momento de tratá-las usando o “Extractor” que nos auxiliará trabalhando a mensagem.

Criando o Extractor

A função do ‘Extractor’ é tratar/manipular o texto recebido e quebrá-lo em ‘fields’/campos, de um modo flexível permitindo ser especificado de acordo com o interesse do usuário do sistema.

Uma das formas de criá-lo é na área do Input, clicando no botão ‘Show messages’, como a imagem mostrada acima. Essa operação fará com que se abra uma tela contendo diversas mensagens recebidas pelo input ‘NxFilter’.

Clique na mensagem e aparecerá o campo “message” no canto direito há uma espécie de lupa. Ao clicar nela aparecerão diversas opções, dentre elas “Create extractor field message”, selecionado essa opção aparecerá um submenu.

No submenu escolha “Grok pattern’, que será o padrão que usaremos para extrair as informações e atribuir aos campos desejados.

IMPORTANTE: Para ativar o pacote de padrões já disponibilizado no Graylog é preciso que acesse “System > Content Packs” e ative o pacote “Core Grok Patterns”.

Deixe marcado o campo ‘Named captures only’, desse modo só os resultados recebidos na análise do padrão serão exibidos.

Em ‘Grok Pattern’ insira - exatamente - a seguinte expressão, tudo em uma linha só:

%{HOSTNAME:srv} %{WORD:sys}\|%{TIMESTAMP_ISO8601:date}\|%{WORD:block}\|%{HOSTNAME:domain}\
|%{GREEDYDATA:user}\|%{IP:src_ip}\|%{GREEDYDATA:policy}\|%{GREEDYDATA:category}\|%{GREEDYDATA:reason}\|%{INT:dns_type}

Clique no botão ‘Try’, se estiver tudo certo aparecerá um item “Extractor preview” mostrando a previsão do resultado da análise da mensagem, parecido como abaixo:

No campo ‘Condition’ é definido quando e o Extractor atuará, marque a 3a opção:

  • ‘Always try to extract’ - Sempre executar o Extractor
  • ‘Only attempt extraction if field contains string’ - Somente se encontrar uma determinada ocorrência
  • ‘Only attempt extraction if field matches regular expression’ - Somente se casar com uma determinada expressão regular

E preencha o campo ‘Field matches regular expression’, com o valor: ^NXFILTER|

Se estiver tudo correto, ao clicar no botão ‘Try’, que fica a direita do ‘Field matches…’, deverá receber um resultado como o da imagem abaixo.

Em ‘Extraction strategy’ deixe marcado ‘Copy’, pois segundo o Graylog o procedimento de recorte (‘Cut’) não funciona em campos como o ‘message’.

Em ‘Extractor title’ preencha com “NxFilter”. Clique em ‘Create extractor’. Irá para uma tela onde listam os Extractors para esse input, no caso deverá aparecer somente o ‘NxFilter’.

Clique em ‘Details’, se estiver tudo certo aparecerá como a tela abaixo.

Estando o serviço do NxFilter configurado para enviar as mensagens para o Graylog, já poderão ser vistas mensagens do NxFilter. A princípio parecerão as mesmas mensagens antes apresentadas, mas na área ‘Fields’ estarão listados os campos que criamos com o ‘Extractor’ como ‘block’ e ‘reason’.

Criando um Dashboard para o NxFilter

Com isso podemos criar agora o Dashboard com informações sobre o uso de DNS na nossa rede.

No canto esquerdo dos campos há uma seta, clicando nela aparece um quadro com opções.

. Generate Chart - Gera um gráfico, só funciona para campos númericos . Quick values - Gera um gráfico pizza, contendo estatísticas simples como quantidade/percentual de um determinado registro . Statistics - Estatísticas mostrando quantidades máximas, mínimas, desvio padrão, etc… . World Map - Se o campo for IP e estiver ativado o recurso de GeoIP ele apresenta um mapa indicando a origem dos mesmos, desde que sejam IPs válidos.

Tendo gerado a informação que julgue interessante você pode jogar ele em um Dashboard existente ou criar um novo caso não exista nenhum.

No gráfico gerado clique em ‘Add to Dashboard’, permitindo escolher um existente.

Se desejar criar um novo Dashboard vá no menu ‘Dashboards’ e clique em ‘Create Dashboard’.

Na criação do dashboard, o sistema pedirá o Título/Title e a Descrição/Description. Os campos são obrigatórios.

Em seguida aparecerá uma tela pedindo o Título/Title para o Widget que você selecionou. Tem as opções:

[] Show pie chart - Exibe gráfico torta [] Show data table - Exibe dados

Escolha o que interessar - isso pode ser modificado depois - e clique em “Create”.

Aparecerá o Dashboard já com o Widget. Seguem exemplos de Dashboards.

Agora é trabalhar esses dados da melhor forma possível e que atenda as suas necessidades.

comments powered by Disqus