Posts Tagged ‘Snort’

Instalação e integração Snort, PostgreSQL e Barnyard

April 22, 2008

Enjoy…

Objetivo
Instalação do Snort com gravação de log unificado (unified log), instlação do PostgreSQL 8.1 à partir dos pacotes pré-compilados para distribuição Debian Etch e também a compilação e configuração do aplicativo Barnyard, utilitário responsável pela leitura dos logs unificados e envio das informações para o banco de dados PostgreSQL.

Configurações utilizadas:

* Hostname: nids
* Interface de rede: eth0
* Endereço IP: 192.168.0.133
* Endereço de rede: 192.168.0.0/24

Ao final dos procedimentos a seguir, estarão instalados:

* PostgreSQL 8.1
* Snort Version 2.3.3 (Build 14)
* Barnyard Version 0.2.0 (Build 32)

Instalação PostgreSQL

Para instalar utilize:
# aptitude install postgresql-8.1

Crie a base de dados e o usuário que irá utilizá-la:
# su – postgres

Crie a base de dados:
$ createdb snort

Crie o usuário que será utilizado pelo Snort, usuário "snort":
$ createuser -P snort
Digite a senha para a nova role: snort123[ENTER]
Digite-a novamente: snort123[ENTER]
A nova role poderá criar um super-usuário? (s/n) n
A nova role poderá criar bancos de dados? (s/n) n
A nova role poderá criar novas roles? (s/n) n
CREATE ROLE

* Neste tutorial estou utilizando uma senha fraca, para instalações em produção recomendo utilizar senhas robustas, onde na sua criação utilize letras maiúsculas e minúsculas, números, símbolos com pelo menos dez caracteres.

Crie regra para acesso local à base de dados snort para o usuário snort.

* Também não recomendo o uso de nomes com fácil dedução, tanto para o banco de dados como para o usuário que o utiliza, em produção modifique isto também.

Como usuário root, edite o arquivo /etc/postgresql/8.1/main/pg_hba.conf, e abaixo da entrada:

(…)
# Database administrative login by UNIX sockets
local all postgres ident sameuser
(…)

Acrescente:
local snort snort md5

Salve o arquivo e saia.
Explicando:
local – Origem da conexão feita ao banco de dados;
snort – Nome da base de dados;
snort – Nome do usuário que tem permissão de acesso;
md5 – Método utilizado para autenticação.

Reinicie o serviço PostgreSQL:
# invoke-rc.d postgresql-8.1 stop
# invoke-rc.d postgresql-8.1 start

Verifique se o PostgreSQL está ouvindo na porta 5432 e aguardando por conexões locais:
# lsof -i -n -P | grep 5432

Logo, será configurado a estrutura para base de dados do Snort…

Instalação Snort

Para instalar o Snort com o suporte a PostgreSQL no Debian, utilize:
# aptitude install snort-pgsql

Serão feitas perguntas, na primeira irá questionar qual é sua rede, para este documento adotamos a seguinte rede:
192.168.0.0/24

Na segunda pergunta, responda NÃO, afinal não queremos que o Snort guarde seus log em um banco de dados e sim em um arquivo de log unificado para utilização com Barnyard, que demonstro logo a seguir.

Por precaução, faça uma cópia de segurança do arquivo de configuração:
# cp -av /etc/snort/snort.conf /etc/snort/snort.conf.original
# cp -av /etc/snort/snort.debian.conf /etc/snort/snort.debian.conf.original

Na distribuição Debian Etch, dentro de /etc/snort existe um arquivo chamado snort.debian.conf onde algumas configurações específicas são definidas, edite o arquivo e faça as seguintes modificações:

DEBIAN_SNORT_STARTUP="boot"
DEBIAN_SNORT_HOME_NET="192.168.0.0/24"
DEBIAN_SNORT_INTERFACE="eth0"

Explicando:
DEBIAN_SNORT_STARTUP – Diz ao Snort que deve iniciar na inicialização do sistema operacional;
DEBIAN_SNORT_HOME_NET – Define sua rede local;
DEBIAN_SNORT_INTERFACE – A interface que o snort ficará ouvindo.

Edite o arquivo snort.conf procure pela entrada var HOME_NET any e configure:

var HOME_NET 192.168.0.0/24

Definindo a forma de log que o Snort gravará os logs, para utilização em conjunto com o Barnyard é preciso que utilize o método de log unificado (unified log). Procure pelas linhas abaixo e descomente-as:

output alert_unified: filename snort.alert, limit 128
output log_unified: filename snort.log, limit 128

Salve o arquivo, saia.
Explicando:
filename – Nome do arquivo onde ficarão gravados os logs;
limit – Tamanho máximo até seu rotacionamento. (128mb)

O log unificado (unified log) faz com que o Snort grave suas mensagens em formato octal em um arquivo binário, com isto, ganha-se muito desempenho pois o Snort não precisa parar seu processamento de pacotes para executar os INSERTS no banco de dados.

* De acordo com algumas notas postadas em diversos blogs pela internet, não teremos esta perda de performance no Snort 3.0 pois utilizará um sistema de processamento diferente do atual, novas features e outras informações sobre o snort 3.0 ficam para um próximo post. ;)

Para verifcar onde o Snort grava seus arquivos de log, entre outras definições (Debian):
# cat /etc/default/snort

Para iniciar o Snort, remova antes o arquivo:
# rm /etc/snort/db-pending-config

Inicie o serviço do Snort:
# invoke-rc.d snort start

Verifique o status do serviço:
# invoke-rc.d snort status

O resultado deve ser este:
Status of snort daemon(s): eth0 (ok).

Criando estrutura para base de dados do Snort

Torne-se usuário postgres novamente:
# su – postgres

Com o script sql fornecido pelo pacote snort-pgsql, crie as tabelas necessárias:
$ zcat /usr/share/doc/snort-pgsql/create_postgresql.gz | psql -U postgres snort

Dê permissão somente para consultar, atualizar e inserir nas seguintes tabelas ao usuário snort:
$ psql -U postgres snort -c "GRANT INSERT, SELECT, UPDATE ON TABLE data,detail,encoding,event,icmphdr,iphdr,opt,reference,reference_system,schema,sensor,sig_class,signature,sig_reference,tcphdr,udphdr TO snort;"

E também para atualizar as tabelas sequenciais:
$ psql -U postgres snort -c "GRANT UPDATE ON reference_ref_id_seq,reference_system_ref_system_id_seq,sensor_sid_seq,sig_class_sig_class_id_seq,signature_sig_id_seq TO snort;"

Volte a ser usuário root:
$ exit

Instalação Barnyard

Barnyard foi desenvolvido com o objetivo de ler os arquivos de log unificados e enviar seu conteúdo ao banco, desta forma diminuindo o serviço "braçal" de inserir os logs no banco assim aumenando a performance do Snort como já foi mencionado.

Acesse o diretório:
# cd /usr/src/

E baixe o Barnyard:
# wget http://www.snort.org/dl/barnyard/barnyard-0.2.0.tar.gz

Descompacte e acesse o diretório:
# tar xvzf barnyard-0.2.0.tar.gz
# cd barnyard-0.2.0

Para instalar o Barnyard com suporte a PostgreSQL no Debian Etch, supra as dependências instalando os pacotes:
# aptitude install build-essential postgresql-server-dev-8.1

Para ativar o suporte a PostgreSQL utilize o parâmetro –enable-postgres ao configurar:
# ./configure –enable-postgres

Compile e instale:
# make && make install

Será instalado dentro de /usr/local/bin o executável barnyard e um arquivo de exemplo para configuração é criado no diretório /usr/src/barnyard-0.2.0/etc, mas não será utilizado.

Para organizar, crie e acesse o diretório:
# mkdir /etc/snort/barnyard
# cd /etc/snort/barnyard

Crie os arquivos de configuração para o Barnyard:
# vi barnyard.conf
config localtime
config hostname: nids
config interface: eth0
config sid-msg-map: /etc/snort/sid-msg.map
config gen-msg-map: /etc/snort/gen-msg.map
config class-file: /etc/snort/classifications.config
output alert_acid_db: postgres, database snort, server localhost, user snort, password snort123, detail full

Salve, saia e defina as permissões para o arquivo de configuração:
chown root:snort /etc/snort/barnyard/barnyard.conf
chmod 640 /etc/snort/barnyard/barnyard.conf

Crie o diretório e defina as permissões onde serão guardados os logs processados pelo Barnyard:
# mkdir /var/log/snort/processados
# chmod 2750 /var/log/snort/processados

Primeiramente faça o teste executando em dois terminais distintos o Barnyard sem a opção (-D) que o transforma em serviço.
Em um terminal, execute-o apontando para o arquivo de log unificado snort.log:
# /usr/local/bin/barnyard -c /etc/snort/barnyard/barnyard.conf -d /var/log/snort -a /var/log/snort/processados -f snort.log -w /etc/snort/barnyard/snort.log.bookmark

Em outro terminal execute apontando para o arquivo de log unificado snort.alert:
# /usr/local/bin/barnyard -c /etc/snort/barnyard/barnyard.conf -d /var/log/snort -a /var/log/snort/processados -f snort.alert -w /etc/snort/barnyard/snort.log.bookmark

Os terminais ficarão presos com uma mensagem similar a esta:
Barnyard Version 0.2.0 (Build 32)
Opened spool file ‘/var/log/snort/snort.log.1206731745′
Waiting for new data

Pare os dois Barnyards agora (Ctrl+C) e inicie-os como serviço.

Um apontando para o snort.log:
# /usr/local/bin/barnyard -c /etc/snort/barnyard/barnyard.conf -d /var/log/snort -a /var/log/snort/processados -f snort.log -w /etc/snort/barnyard/snort.log.bookmark -D

E outro apontando para snort.alert:
# /usr/local/bin/barnyard -c /etc/snort/barnyard/barnyard.conf -d /var/log/snort -a /var/log/snort/processados -f snort.alert -w /etc/snort/barnyard/snort.alert.bookmark -D

Explicando:
-c – Define o arquivo de configuração;
-d – Diretório onde será feito a busca pelos arquivos de log;
-a – Diretório onde serão guardados os aquivos que já foram processados;
-f – Arquivo de log unificado que o Barnyard processará;
-w – Arquivo utilizado para bookmark;
-D – Transforma-o em serviço.

Bookmark é utilizado para que o Barnyard lembre-se de onde parou caso ocorra algum problema, desta forma não sendo necessário processar novamente todo o arquivo de log.
O ambiente Snort, PostgreSQL e Barnyard está funcionando, abaixo demonstro uma forma de testar.

Colocando à prova

Para testar, de uma outra máquina faça uma varredura onde o Snort possa registrar algo, rode um Nmap:
# nmap -e <interface> -S <IP spoofado> -sX <IP do alvo>

Neste ambiente com estas configurações foi executado:
# nmap -e eth0 -S 10.10.10.10 -sX 192.168.0.133

Depois acesse a base de dados snort com usuário snort:
# psql -U snort snort

E faça uma consulta:
SELECT * from signature;

E também:
SELECT * from event;

Aparecerão informações registradas pelo Snort e enviadas pelo Barnyard.

Conclusão
A solução Snort, Barnyard e PostgreSQL é recomendada, quando bem posicionada na topologia. O Barnyard completa a solução do Snort, tornando-o mais rápido pois com a utilização dos logs unificados não se desperdiça tempo em executar sql’s para enviar seus logs ao banco, ganhando desta forma muito desempenho.

Referências

http://www.snort.org
http://www.postgresql.org
http://www.snort.org/dl/barnyard/
http://www.snorg.org.br/

Decidi postar este tutorial pois mesmo procurando muito na internet não encontrei informações de como utilizar o Barnyard em conjunto com o banco de dados PostgreSQL, espero que ajude outras pessoas.

Fiquem à vontade para sugestões, críticas e correções…

Obrigado! Abraços e até o próximo post! ;)