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.
IDS Center: Criando uma central de alertas unificados
Algo muito interessante utilizando o Snort é o recurso que
temos de criar verdadeiras databases de alertas e históricos de
logs de tentativa de ataques, e um plugin de saída ajuda muito na
hora de ler os logs e alertas que muitas vezes acabam sendo falsos.
Imagine um administrador que tem um IDS tomando conta de 4
sub-redes, supondo que um IDS default gera em média de 400
assinaturas entre ataques falsos e reais tentativas de exploração,
imaginem o tempo que seria gasto analisando todos os possíveis alertas
e descartando os alertas falsos. Isso seria perda de um tempo
precioso, em que o administrador poderia estar melhorando bastante
o sistema de segurança da rede.
Assim, tudo que queremos fazer é facilitar bastante a vida dos
administradores de rede e analistas que venham a utilizar um
sistema de IDS em rede.
Existem muitos plugins de saída e um dos mais conhecidos é o
ACID (Analise Console for Intrusion Detection). Realmente ele é
muito eficaz, tem uma saída bonita, gera gráficos, estatísticas e
tudo mais que todo administrador sonha em ter ajudando-o a
monitorar sua rede. Porém ele requer um conhecimento maior por
parte da pessoa que esteja implementando.
ACID requer que seja compilado Apache, PHP, Snort de maneira
diferente, com alguns módulos especiais. Ele requer utilização de
MySQL e eu sinceramente não gosto de ficar enchendo uma máquina que
vai ser um firewall/IDS de serviços, portanto o Snort Snarf vai
ser a melhor pedida.
Ele é simples, rápido e eficiente.
Snort Snarf gera páginas em HTML com os dados dos alertas que
o Snort gera, assim não necessitamos de MySQL para guardar os alertas,
muito menos de um servidor web utilizando módulos de PHP, assim
ganhamos tempo e temos uma ferramenta muito importante a nosso favor.
Utilizando o Snort Snarf
Bom, tendo que o seu Snort já está funcionando, vamos rodar o
Snort Snarf agora e deixar que ele nos retorne as informações que
tanto desejamos:
Snort Snarf possui muitas opções, é possível especificar vários filtros
nele, como por exemplo:
ID do sensor;
Prioridade do alerta;
Data;
Hora.
Assim agrupando de maneira mais conveniente os resultados.
Agora que tudo está funcionando (ou pelo menos parece ehehe),
vamos no próximo capítulo realizar alguns testes para averiguar
a integridade e confiabilidade do nosso sistema.
[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
[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. :)
[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..
[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
[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 "
[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.