Snort avançado: Projetando um perímetro seguro

Neste artigo veremos algumas características avançadas do sistema de detecção de invasão Snort e também como utilizar a criatividade para elaborar firewalls integrados com o IDS. Vamos montar uma central de análise utilizando Snort Snarf. Leitura recomendada para administradores e afins.

[ Hits: 176.458 ]

Por: Anderson L Tamborim em 06/01/2005 | Blog: http://y2h4ck.wordpress.com


Instalação e configuração



Neste capítulo iremos instalar e configurar os diversos aplicativos que serão utilizados para montar nosso sistema de Detecção de Invasão:
Primeiro iremos instalar o Apache 1.3.31, pode ser qualquer versão disponível do Apache, pois não iremos utilizar PHP ou banco de dados, então só precisa que ele sirva páginas HTML normais. Escolhi o 1.3.31 por ser um dos mais recentes.

Vamos criar um diretório /IDS e jogar todos os sources dentro dele para ficar mais organizado:

$ tar -jxzvf httpd-1.3.31.tar.bz2
$ cd httpd-1.3.31/
$ configure --prefix=/www
$ make
# make install


Feito isso o Apache estará instalado em /www, sendo assim vamos iniciá-lo:

# /www/bin/apachectl start

Recomendo que você dê uma olhada em /www/conf/httpd.conf e coloque as configurações de porta e hostname conforme for a sua máquina.


Uma vez o Apache instalado, vamos para a instalação do IPtables. Provavelmente sua box Linux com kernel 2.4* já tem o iptables instalado, mas mesmo assim que tal atualizarmos ele? Para tanto, baixe a versão 1.2.11 no site www.netfilter.org:

$ tar -jxvf iptables-1.2.11.tar.bz2
$ cd iptables-1.2.11
$ ./configure
$ make
# make install


Recomendo a instalação do patch-o-matic para complementar as funcionalidades do IPtables. Para aprender como instalar o Patch-O-Matic, basta ler o artigo do nosso amigo CVS.
Incremente o iptables com patch-o-matic


Vamos verificar se o iptables se atualizou:

# iptables -V
iptables v1.2.11

Pronto, o IPtables está atualizado.

Instalando o Snort


O Snort é a nossa ferramenta principal e que vai ser a chave de toda nossa configuração. Não vou falar muito sobre ele, porque creio eu que supostamente a pessoa que está lendo este artigo já tem algum conhecimento sobre ele, pois aqui abordaremos configurações avançadas.

Caso você tenha caído de para-quedas no artigo, leia:



# tar -zxvf snort-2.2.0.tar.gz
# ./configure
# make
# make install


Vamos criar uma pasta em /etc/snort para guardar os arquivos necessários do Snort e também /etc/snort/rules onde ficarão as regras do aplicativo. Vamos copiar agora os arquivos necessários para seu funcionamento dentro da pasta etc/ para /etc/snort:

# cp classification.config gen* threshold.conf unicode.map sid* snort.conf reference.config /etc/snort/
# cd ../rules
# cp * /etc/snort/rules


Muito bem, o Snort está instalado, mas vamos deixar sua configuração para o próximo capítulo, pois ela será algo diferenciado.

Instalando o SnortSnarf


O SnortSnarf é um script em Perl que irá fazer uma leitura dos logs e alertas gerados pelo Snort e assim retornar para gente estas informações em forma de páginas html.

Vamos baixar o SnortSnarf na parte de Contrib do Snort. Enquanto eu escrevia o artigo e realizava os testes, utilizei a versão "SnortSnarf-051301-1.tar.gz".

Uma vez baixado o pacote que é bem pequena, vamos instalar:

# tar -xzvf SnortSnarf-051301-1.tar.gz

O Snarf, como utiliza scripts Perl, vai necessitar de um módulo a parte, que poderemos instalar utilizando o CPAN.

# perl -e shell -MCPAN
cpan> install Time::JulianDay

Espere o CPAN baixar o pacote e instalar o módulo, ele irá realizar testes com o módulo para saber se realmente está tudo certo com o módulo.

Para garantir que e o SnortSnarf seja executado de maneira segura, vamos copiar os arquivos do include/ para o diretório site_perl:

# cp /src/snortsnarf/include/SnortSnarf /usr/lib/perl5/site-perl/5.8.5

Esta versão do Perl é a que eu utilizo, caso a versão seja diferente, não há problema :-)

Agora vamos copiar o script snortsnarf.pl para /etc:

# cp /src/snortsnarf/snortsnarf.pl /etc

A instalação do SnortSnarf fica por aqui, veremos no próximo capítulo como utilizá-lo junto ao Snort.

Instalação do Guardian


O Guardian é um script em Perl que utiliza os logs do Snort para bloquear atacantes em tempo real, adicionando assim uma camada de segurança legal em seu projeto.

Ele, apesar de ser meio antigo e simples, faz o trabalho muito bem.

Ele vem na pasta contrib do Snort, assim vamos instalá-lo:

# tar -xzvf Guardian.tar.gz
# cd Guardian


Edite o guardian.conf e adicione seu IP, caso seja fixo, sua interface de rede (eth0, eth1, ppp0, etc).

Feito isso, siga os seguintes passos:

# cp guardian.conf /etc/
# cp Guardian.pl /usr/sbin/
# touch /var/log/guardian.log
# touch /etc/guardian.ignore


Dentro do arquivo "guardian.ignore" você deverá adicionar todos os IPs que o Guardian deverá ignorar , isso é importante, afinal ninguém gostaria que seu roteador principal fosse bloqueado no firewall.


Uma vez que tudo está feito, vamos para o próximo capítulo.

Página anterior     Próxima página

Páginas do artigo
   1. Prólogo
   2. Introdução: Sistemas de detecção de invasão
   3. Tabela simbólica
   4. Projeto de perímetro seguro
   5. Instalação e configuração
   6. Adaptando o IDS ao nosso projeto
   7. IDS Center: Criando uma central de alertas unificados
   8. Proof of Concept: Projeto sob fogo
   9. Conclusão
   10. Apêndice
Outros artigos deste autor

OpenVZ: Virtualização para servidores Linux

Análise passiva (parte 2)

PaX: Solução eficiente para segurança em Linux

Jails em SSH: Montando sistema de Shell Seguro

Segurança no SSH via plugins da PAM

Leitura recomendada

HoneyPots em Linux

Security Hacks: Linux & BSD

Autenticação de servidores CentOS/Red Hat 6 em Windows 2008

Principais formas de anonimato ao navegar na Internet

Instalação do Snort + BASE no Debian Etch pelos fontes

  
Comentários
[1] Comentário enviado por fabio em 06/01/2005 - 04:16h

Momento do samba carioca:

"Sobre o artigo, dizer o quê...
O Anderson Tamborim, caprichou pra valê!

I ô lê lê... onde há segurança
a gente nunca perde a esperança

E diz!

REFRÃO..."

Meus parabéns!

0 0
[2] Comentário enviado por naoexistemais em 06/01/2005 - 04:24h

Caro Anderson,

Mais um artigo de qualidade e mantendo a qualidade do VOL, por isso digo para o zangado o VOL é o melhor e sempre será.

Parabéns,

0 0
[3] Comentário enviado por sUxSyS em 06/01/2005 - 06:53h

Meu po... muito bom teu artigo!
Como sempre muito profissional... meus parabens!!!

flws

0 0
[4] Comentário enviado por dudu_away em 06/01/2005 - 11:06h

Ae anderson.. naum precisava nem comentar né? haushahs

Tah perfeito como sempre! Continue assim kra....

Parabéns!

[]'s
Eduardo

0 0
[5] Comentário enviado por jeffestanislau em 06/01/2005 - 12:46h

Anderson,

Realmente está ótimo!!! Parabéns por seu trabalho!!!

PS: Ainda bem que o fábio não depende de samba para sobreviver!!!
hehehe

[]´s

0 0
[6] Comentário enviado por peregrino em 06/01/2005 - 13:53h

opa cara esse é mais um artigo daqueles que dispensa comentarios muito bommesmo continue assim fazendo varios artigos e tutorias para acomunidade

queria falar aqui que vc poderia fazer um tutorial sobre iptables+pom com regras avançadas e tambem algum falando sobre teste de fogo para testar o servidor se esta vuneravel

falow

0 0
[7] Comentário enviado por y2h4ck em 06/01/2005 - 14:00h

Obrigado a todos pelos comentarios e por terem apreciado meu artigo.
Peregrino gostei da Ideia ... e posso futuramente escrever um artigo sobre testes de penetração. :)

Abraços a todos.

Anderson Luiz Tamborim ( Spawn y2h4ck )

0 0
[8] Comentário enviado por fcc em 06/01/2005 - 16:26h

Ae man...mandou ver novamente....Jogou duro no IDS Parabens....continue sempre divugando seus artigos...eles sao o maximo!

Valeu!

0 0
[9] Comentário enviado por dexter_sbo em 07/01/2005 - 09:20h

Ae spawn mando muito bem como sempre seu artigo fico muito ótimo fico muito 10 memo meus parabéns

By __d3xt3r__

0 0
[10] Comentário enviado por removido em 07/01/2005 - 11:44h

EXCELENTE!!!!
E muito inspirado também o samba do fábio... ;-)

0 0
[11] Comentário enviado por davidsonpaulo em 08/01/2005 - 15:34h

Aê Fábio! Como sambista tu é um ótimo administrador de portal. Ahahahah!

Aê Anderson! Detonou hein! Parabéns meu velho, e continue evoluindo!

Abraços!

0 0
[12] Comentário enviado por peregrino em 01/02/2005 - 14:27h

opa so queria informar que o link do download do Snort Snarf ta errado e o endereço certo é esse qui http://www.snort.org/dl/contrib/data_analysis/snortsnarf/

falow

0 0
[13] Comentário enviado por mariux em 24/03/2005 - 18:05h

por gostei pra caramba muito legal o artigo. me ajudou muito!!

0 0
[14] Comentário enviado por montaro em 25/04/2005 - 04:14h

muito bom o artigo...eu me interesso bastante pela area de seguranca e ate penso em trabalhar nesse ramo, mais eh tanta coisa pra aprender que nao sei por onde comecar... ja montando um ids , um honeypot aki no lnx ja eh um comeco ... abracos..

0 0
[15] Comentário enviado por jgama em 23/07/2006 - 16:25h

Já faz mas de um ano que foi eleborado este tutorial, só agora que tive o prazer de ler, realmente muito bem elaborado.

Só como sou inexperiente no Linux, posso dizer assim, e tentei colocar o snort para Rodar num Servidor com Mandriva 2006, usando este Tutorial, só que aqui esta dando erro justamente no arquivo de regras abaixo, será que tenho que criar o arquivo com o conteudo igualzinho descrito abaixo?

# regras.conf
# ----------------------------------------------------------
# Anderson Luiz Tamborim ( security*NOSPAM*tionline.com.br )
# ----------------------------------------------------------
# Regras para IDS baseado em Plano
# Regras Alert

alert tcp any any <> [192.168.10.0/24,192.168.11.0/24]
alert udp any any <> [192.168.10.0/24,192.168.11.0/24]
alert ip any any <> [192.168.10.0/24,192.168.11.0/24]

#Isso iria gerar um alerta para qualquer tráfego entre essas duas redes, #assim nossa primeira política de alertas está feita, agora teremos que #fazer as regras para liberar as portas que serão válidas aos usuários:

pass tcp 192.168.10.0/24 any -> 192.168.11.1 25
pass tcp 192.168.10.0/24 any -> 192.168.11.1 80
pass tcp 192.168.10.0/24 any -> 192.168.11.1 110
pass tcp 192.168.10.0/24 any -> 192.168.11.1 143
pass tcp 192.168.10.0/24 any -> 192.168.11.1 21
pass tcp 192.168.10.0/24 any -> 192.168.11.1 137:139

# Agora pacotes UDP
pass udp 192.168.0.0/24 any -> 192.168.11.1 137:139
pass udp 192.168.0.0/24 any -> 192.168.11.1 21

# Pacotes IP
# Não utilizaremos pacotes IP, pois não estamos
# utilizando nenhum serviço como VPN ou sistema de
# autenticação como Kerberos


Pois aparece messagem de erro quando starto snort, dizendo que tem erro no include /etc/snort/rules/regras.conf (8) algo assim.

Tentei deica as linhas conforme abaixo mas não deu certo.

abaixo, será que tenho que criar o arquivo com o conteudo igualzinho descrito abaixo?

# regras.conf
# ----------------------------------------------------------
# Anderson Luiz Tamborim ( security*NOSPAM*tionline.com.br )
# ----------------------------------------------------------
# Regras para IDS baseado em Plano
# Regras Alert

alert tcp any any [192.168.0.0/24,192.168.1.0/24]
alert udp any any [192.168.0.0/24,192.168.1.0/24]
alert ip any any [192.168.0.0/24,192.168.1.0/24]

pass tcp 192.168.0.0/24 any 192.168.1.0 25
pass tcp 192.168.0.0/24 any 192.168.1.0 80
pass tcp 192.168.0.0/24 any 192.168.1.0 110
pass tcp 192.168.0.0/24 any 192.168.1.0 143
pass tcp 192.168.0.0/24 any 192.168.1.0 21
pass tcp 192.168.0.0/24 any 192.168.1.0 137:139

# Agora pacotes UDP
pass udp 192.168.0.0/24 any 192.168.1.0 137:139
pass udp 192.168.0.0/24 any 192.168.1.0 21

Alguém poderia ajudar-me a tirar esta dúvida

0 0
[16] Comentário enviado por removido em 17/10/2009 - 09:27h

Legal, SNORT Avançado.

0 0
[17] Comentário enviado por removido em 17/10/2009 - 22:42h

Snort, Porquinho Ninja.

0 0
[18] Comentário enviado por rhock em 06/12/2011 - 15:41h

Estou com um problema na hora de executar o comando " snortsnarf.pl --rulesfile /etc/snort/snort.conf -rulesdir /etc/snort -d /www/htdocs/snarf /var/log/snort/alert "


da o seguinte erro: " snortsnarf.pl: command not found "

Alguem pode me ajudar.

Obrigado.

0 0
[19] Comentário enviado por rhock em 06/12/2011 - 16:56h

Erro na execução:



perl snortsnarf.pl --rulesfile /etc/snort/snort.conf --rulesdir /etc/snort -d /var/www/snort /var/log/snort/alert
Parentheses missing around "my" list at /etc/perl/Time/ParseDate.pm line 108.
Parentheses missing around "my" list at /etc/perl/Time/ParseDate.pm line 109.
Useless use of a variable in void context at /etc/perl/Time/ParseDate.pm line 108.
Useless use of a variable in void context at /etc/perl/Time/ParseDate.pm line 108.
Useless use of a variable in void context at /etc/perl/Time/ParseDate.pm line 109.
Useless use of a variable in void context at /etc/perl/Time/ParseDate.pm line 109.
Using an array as a reference is deprecated at /etc/perl/HTMLMemStorage.pm line 290.
Using an array as a reference is deprecated at /etc/perl/HTMLAnomMemStorage.pm line 266.
Unknown option --rulesfile
Unknown option --rulesdir
Subroutine julian_day redefined at /etc/perl/Time/JulianDay.pm line 46.
Subroutine day_of_week redefined at /etc/perl/Time/JulianDay.pm line 82.
Subroutine inverse_julian_day redefined at /etc/perl/Time/JulianDay.pm line 96.
Subroutine jd_seconds redefined at /etc/perl/Time/JulianDay.pm line 127.
Subroutine jd_timelocal redefined at /etc/perl/Time/JulianDay.pm line 135.
Subroutine jd_timegm redefined at /etc/perl/Time/JulianDay.pm line 145.
unknown alert format for line: var HOME_NET any
; skipping
unknown alert format for line: var EXTERNAL_NET any
; skipping
unknown alert format for line: var DNS_SERVERS [xxxxxxx]
; skipping
unknown alert format for line: var SMTP_SERVERS [xxxxxxx]
; skipping
unknown alert format for line: var HTTP_SERVERS $HOME_NET
; skipping
unknown alert format for line: var SQL_SERVERS $HOME_NET
; skipping
unknown alert format for line: var TELNET_SERVERS $HOME_NET
; skipping
unknown alert format for line: var FTP_SERVERS $HOME_NET
; skipping
unknown alert format for line: var SNMP_SERVERS $HOME_NET
; skipping
unknown alert format for line: portvar HTTP_PORTS 80
; skipping
unknown alert format for line: portvar SHELLCODE_PORTS !80
; skipping
unknown alert format for line: portvar ORACLE_PORTS 1521
; skipping
unknown alert format for line: portvar FTP_PORTS 21
; skipping
unknown alert format for line: var RULE_PATH /etc/snort/rules
; skipping
unknown alert format for line: var PREPROC_RULE_PATH /etc/snort/preproc_rules
; skipping
unknown alert format for line: dynamicpreprocessor directory /usr/lib/snort_dynamicpreprocessor/
; skipping
unknown alert format for line: dynamicengine /usr/lib/snort_dynamicengine/libsf_engine.so
; skipping
unknown alert format for line: preprocessor frag3_global: max_frags 65536
; skipping
unknown alert format for line: preprocessor frag3_engine: policy first detect_anomalies overlap_limit 10
; skipping
unknown alert format for line: preprocessor stream5_global: max_tcp 8192, track_tcp yes, \
; skipping
unknown alert format for line: track_udp no
; skipping
unknown alert format for line: preprocessor stream5_tcp: policy first
; skipping
unknown alert format for line: preprocessor rpc_decode: 111 32771
; skipping
unknown alert format for line: preprocessor bo
; skipping
unknown alert format for line: preprocessor ftp_telnet: global \
; skipping
unknown alert format for line: encrypted_traffic yes \
; skipping
unknown alert format for line: inspection_type stateful
; skipping
unknown alert format for line: preprocessor ftp_telnet_protocol: telnet \
; skipping
unknown alert format for line: normalize \
; skipping
unknown alert format for line: ayt_attack_thresh 200
; skipping
unknown alert format for line: preprocessor ftp_telnet_protocol: ftp server default \
; skipping
unknown alert format for line: def_max_param_len 100 \
; skipping
unknown alert format for line: alt_max_param_len 200 { CWD } \
; skipping
unknown alert format for line: cmd_validity MODE < char ASBCZ > \
; skipping
unknown alert format for line: cmd_validity MDTM < [ date nnnnnnnnnnnnnn[.n[n[n]]] ] string > \
; skipping
unknown alert format for line: chk_str_fmt { USER PASS RNFR RNTO SITE MKD } \
; skipping
unknown alert format for line: telnet_cmds yes \
; skipping
unknown alert format for line: data_chan
; skipping
unknown alert format for line: preprocessor ftp_telnet_protocol: ftp client default \
; skipping
unknown alert format for line: max_resp_len 256 \
; skipping
unknown alert format for line: bounce yes \
; skipping
unknown alert format for line: telnet_cmds yes
; skipping
unknown alert format for line: preprocessor smtp: \
; skipping
unknown alert format for line: inspection_type stateful \
; skipping
unknown alert format for line: normalize cmds \
; skipping
unknown alert format for line: normalize_cmds { EXPN VRFY RCPT } \
; skipping
unknown alert format for line: alt_max_command_line_len 260 { MAIL } \
; skipping
unknown alert format for line: alt_max_command_line_len 300 { RCPT } \
; skipping
unknown alert format for line: alt_max_command_line_len 500 { HELP HELO ETRN } \
; skipping
unknown alert format for line: alt_max_command_line_len 255 { EXPN VRFY }
; skipping
unknown alert format for line: preprocessor sfportscan: proto { all } scan_type { all } memcap { 1000000 } sense_level { medium } logfile { sfPortscan.log }
; skipping
unknown alert format for line: preprocessor ssh: server_ports { 22 } \
; skipping
unknown alert format for line: max_client_bytes 19600 \
; skipping
unknown alert format for line: max_encrypted_packets 20 \
; skipping
unknown alert format for line: enable_respoverflow enable_ssh1crc32 \
; skipping
unknown alert format for line: enable_srvoverflow enable_protomismatch
; skipping
unknown alert format for line: preprocessor dcerpc2
; skipping
unknown alert format for line: preprocessor dcerpc2_server: default
; skipping
unknown alert format for line: preprocessor dns: \
; skipping
unknown alert format for line: ports { 53 } \
; skipping
unknown alert format for line: enable_rdata_overflow
; skipping
unknown alert format for line: preprocessor ssl: noinspect_encrypted, trustservers
; skipping
unknown alert format for line: output log_tcpdump: tcpdump.log
; skipping
unknown alert format for line: include classification.config
; skipping
unknown alert format for line: include reference.config
; skipping
unknown alert format for line: include $RULE_PATH/local.rules
; skipping
unknown alert format for line: include $RULE_PATH/scan.rules
; skipping
Undefined subroutine &MemTimeBase::jd_timelocal called at /etc/perl/MemTimeBase.pm line 38, <inputfile003> line 6.


Alguem sabe ?

0 0

Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Agora temos uma assistente virtual no fórum!!! (246)

Links importantes de usuários do VOL (3)

Artigos

Enviar mensagem ao usuário trabalhando com as opções do php.ini

Meu Fork do Plugin de Integração do CVS para o KDevelop

Compartilhando a tela do Computador no Celular via Deskreen

Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota

Configuração para desligamento automatizado de Computadores em um Ambiente Comercial

Dicas

Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil

Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil

Criando uma VPC na AWS via CLI

Multifuncional HP imprime mas não digitaliza

Dica básica para escrever um Artigo.

Tópicos

Arch Linux - Guia para Iniciantes (0)

Dificuldade para renderizar vídeo no kdenlive (6)

xubuntu sem sons de eventos (3)

Erro ao iniciar serviço samba4 como novo dc em um ambiente com ad [RES... (9)

tem problema em instalar o Chrome no tails? (7)

Top 10 do mês

Scripts

[C/C++] reverse shell na marra!

[Outros] Dicas e truques Matematica Básica

[C/C++] criptografia de modo simples

[C/C++] intdb - gerador de wordlist numerica

[C/C++] genpass - gerador de senhas seguras