var HONE_NET 192.168.0.0
var HOME_NET 192.168.1.0
var HOME_NET 10.0.0.0
var HOME_NET 172.16.0.0
Provavelmente, porém, também não queremos incluir toda uma rede interna no escopo da HOME_NET, e nesse caso, vamos querer restringir sua seção. Para tanto, precisamos expecificar sub-redes com o padrão CIDR. Para saber mais, dê uma olhada nesta página sobre o padão CIDR na wikipedia.
Uma definição como aquelas acima, que incluem toda rede interna, é o mesmo que os exemplos abaixo, utilizando CIDR:var HONE_NET 192.168.0.0/32
var HOME_NET 192.168.1.0/32
var HOME_NET 10.0.0.0/32
var HOME_NET 172.16.0.0/32
Podemos definir sub-redes como:var HOME_NET 192.168.0.0/16
var HONE_NET 192.168.0.0/24
var HOME_NET 192.168.0.0/26
var HOME_NET 192.168.0.0/28
Para determinar como HOME_NET somente a nossa própria máquina, porém, definimos, mais que naturalmente, o nosso próprio IP, como por exemplo:
var HOME_NET 192.168.0.2
Note que, neste caso, o Snort não precisa trabalhar em modo promíscuo (ainda que ele o faça por padrão).Caso queiramos, o que é razoável, incluir mais de uma máquina, definimos uma lista separada por vírgula, sem espaços e entre colchetes, como por exemplo:var HOME_NET [192.168.0.2,192.168.0.3]
Analogamente, se queremos definir duas sub-redes distintas, ou mesmo uma máquina e uma sub-rede, fazemos, por exemplo:
var HOME_NET [10.0.0.1/24,192.168.0.0/24]
ouvar HOME_NET [10.0.0.1/24,192.168.0.2]
EXTERNAL_NET
A variável EXTERNAL_NET é reservada para a definição de que endereços serão reconhecidos como externos para o Snort. Podemos, seguindo as mesmas regras sintáticas da definição da HOME_NET, defini-la selecionando a rede ou mesmo mantendo-a como "any". O ideal, no entanto, talvez fosse simplesmente definir EXTERNAL_NET como tudo aquilo que não é considerado interno pelo Snort, ou seja, tudo aquilo que não for HOME_NET. Note, entretanto, que neste caso estará ignorando pacotes internos, correndo o risco de perder detecções de ataques de dentro da própria rede. Para definir a rede externa como a negação do que seja a interna, enfim, podemos utilizar o símbolo ' ! ' (exclamação), que significa a negação do valor que o segue. Para definir EXTERNAL_NETcomo sendo aquilo que não é HOME_NET, basta defini-la como:
var EXTERNAL_NET !$HOME_NET
Tome somente o cuidado de não definir a EXTERNAL_NET como !$ HOME_NET se antes definiu a HOME_NET como "any", pois neste caso estaria informando que a rede externa é tudo que não é qualquer coisa, o que não é possível, visto que a sua rede externa tem de ser alguma coisa. Caso queira fazer o Snort experimentar a vertigem de um paradoxo, faça-o e depois me conte o resultado. Provavelmente um erro simples.
Como de se esperar, temos de utilizar o símbolo do cifrão ' $ ' antes de HOME_NET para estarmos referindo a variável HOME_NET, e não à palavra HOME_NET.
RULE_PATH
A variável RULE_PATH não depende da sua rede nem do que queremos fazer com ela. Esta variável indica o caminho do diretório no seu sistema de arquivos em que se encontram as regras que o Snort poderá utilizar. Dentre essas, indicaremos algumas ao final do arquivo de configuração e adequaremos e faremos outras. Mas todos arquivos de regras indicados no final do snort.conf devem estar no mesmo diretório. O caminho desse diretório deve ser o valor da variável RULE_PATH. Na instalação que sugeri, o diretório de regras fica em /etc/snort, e seu caminho absotulo é /etc/snort/rules. A definição de RULE_PATH para essa instalação pode ser, portanto:var RULE_PATH /etc/snort/rules
ou até mesmo
var RULE_PATH rules
As outras variáveis
As outras variáveis dizem respeito aos servidores da sua rede e a algumas portas relevantes. Cada tipo de serviço possui uma variável particular que deve apontar para o IP da máquina que o realiza. Se sua própria máquina que serve o Snort realiza um serviço, a definição pode ser:var HTTP_SERVERS $HOME_NET
Algumas portas também devem ser informadas, como a porta em que o serviço Web roda:var HTTP_PORTS [80,8080]
var SHELLCODE_PORTS !80
Introdução às regras
Tudo o que preparamos até então dentro do arquivo snort.conf, que foi adequar as variáveis as nossas condições, tem uma única e exclusiva finalidade: a de permitir o funcionamento das regras comuns, como as três básicas e as que dizem respeito a serviços e portas. Afinal, são essas regras que utilizarão das variáveis que definimos. Essas regras têm a função de decidir que processamento um pacote sofrerá e que caminho o dignóstico tomará, para que essas decisões sejam tomadas, as informações que colocamos nas variáveis são fundamentais. Essas regras decidem, pois, sobre o valor que as variáveis a elas relevantes possuem. Note que ainda que a maioria delas faça referência às variáveis HOME_NET e EXTERNAL_NET, somente algumas fazem referência às variáveis do endereço de serviços específicos. Definir bem todas as variáveis permite que o Snort faça uma análise mais inteligente tendo em vista o destino dos pacotes intrusivos, ao mesmo tempo que economiza seu processamento evitando que ele procure exploits para Web direcionados para o servidor exclusivo de DNS.
O funcionamento das regras:
Assim como essas linhas de 'includes' estão apontando para outros arquivos, poderíamos perfeitamente simplesmente colar em seus lugares o conteúdo dos arquivos aos quais apontam. Utilizar arquivos distintos que são referenciados pelo snort.conf é, pois, uma maneira de manter um arquivo de configuração mais organizado e regras mais fáceis de se manter e desatualizar. Fica claro porque utilizar linhas que apontam para arquivos
separados e não simplesmente deixar todos códigos no mesmo arquivo se abrirmos um arquivos de regra qualquer.
Abra, por exemplo, o arquivo de regras porn.rules. O caminho do arquivo, como sabemos, é /etc/snort/rules/porn.rules. Como pode imaginar, as regras desses arquivos se destinam a reconhecer conteúdos de pacotes que vêm de sites pornográficos. Esse arquivo de regras, apesar de engraçado e até constrangedor, revela de forma simples como as regras, em geral, operam. Sua função pode servir muito bem a instituições decididas a retardar a difusão da pedofilia impedindo o acesso a sites pornográficos de dentro das redes, ou mesmo pode servir a pais que querem saber se seus filhos vêem pornografia na internet. O exemplo é interessante, pois é um arquivo de regras que busca por strings no payload dos pacotes, tendo um funcionamento intuitivo, portanto.
Com o porn.rules aberto, observe que a partir da linha 9 há uma regra por linha. A frente segue uma regra do arquivo recortada:
alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"PORN erotica"; content:"erotic"; nocase; flow:to_client,established; classtype:kickass-porn; sid:1798; rev:1;)
As informações escritas até os parênteses são parte do que chamamos de cabeçalho da regra, e o que vem dentro deles são as opções da regra. Aquilo que vem dentro dos parênteses e antes dos 'dois pontos' é chamado de palavra-chave.
- Com alert, esta regra diz ao Snort para gerar um alerta e logar;
- tcp informa o protocolo do pacote;
- $var1 $var2 -> $var3 $var4 informa que os pacotes que interessam a esta regra são aqueles que vêm da rede de fora (no caso, $var1) pelas portas que servem o protocolo http (no caso, $var2) e entram ( -> ) na rede interna (no caso, $var3) por qualquer porta (any);
- msg é a palavra-chave que leva o alert do Snort a imprimir uma mensagem no alerta e nos logs. No caso, a mensagem é "PORN erotica";
- content informa ao Snort que string será procurada dentro do payload do pacote;
- nocase desabilita a sensibilidade da regra a se as letras são minúsculas ou maiúsculas;
- flow:to_client,established indica, no caso, que o pacote vai em direção ao cliente da conexão e que o estado desta é estabelecido;
- classtype classifica o tipo de pacote;
- Sid e Rev respectivamente se referem ao número de identificação da regra e ao número de sua revisão.
Montando regras
Vamos tentar montar uma regra para Snort extremamente simples, mas funcional, para tentarmos ganhar alguma familiaridade com o desenvolvimento de regras. Aquelas pessoas que gostam de programar, entendem de protocolos de rede e que gostam do Snort, podem, quem sabe, partir daqui para uma
pesquisa aprofundada de como se desenvolve regras especais para o Snort.Vamos dizer que gostaríamos de saber quantas vezes em nossa rede aparece o nome do atual presidente do Brasil, Lula, e de que ips vêm os pacotes em que ele aparece. Digamos, por exemplo, que quiséssemos essa informação para uma pesquisa.Abra, portanto, o seu snort.conf com qualquer editor de textos e vá até o seu final. Para conseguir o que queremos precisamos gerar um alerta, que éuma das ações que uma regra pode realizar. A, em geral, mais interessante e certamente a mais comum. Nossa regra começa, portanto, com a ação alert.alert
Note que até a última versão do Snort todas as regras tinham que ser escritas em uma única linha, mas que agora podemos continuá-las na linha seguinte se 'escaparmos' o salto de linha com o caractere ' \ ' ao final de cada linha.
Depois de alert informamos que tipo de protocolo constitui a conexão dos pacotes em que estamos interessados(as). Como vamos procurar por pacotes relativos a conexões web, a um site, então o protocolo dos nossos pacotes será o tcp regular.
alert tcp
Em seguida, como já vimos em nosso exemplo de regra, vem os ips e portas de origem e de destino dos pacotes. Em nosso caso, queremos encontrar pacotes que saiam de nossa rede, portanto podemos informar o ip de origem como qualquer um que venha de nossa rede, a definida em $HOME_NET e o ip de destino como qualquer um que saia de nossa rede, a definida em $EXTERNAL_NET. A porta de destino é a 80, e a de saída podemos definir como qualquer uma, any. Veja como está a nossa regra até então:
alert tcp $HOME_NET any -> $EXTERNAL_NET 80
O que acabamos de escrever foi o cabeçalho de nossa regra. Agora precisamos abrir parenteses e escrever as opções da regra, que são sempre iniciadas por palavras-chave. Estamos interessados(as) no uso de duas palavras-chave em particular: a content e a msg. Com 'content' definiremos que string procurar, e com 'msg' definiremos que mensagem aparecerá no alerta que será gerado para nós.
Como procuramos por aparições da stringLula, podemos informar a palavra-chave content com a stringLula. A mensagem que queremos que apareça pode ser algo como "La vem 'Lula' pelo cabo de rede!". Adapte esta frase caso esteja em uma rede wireless! Nossa regra fica:alert tcp $HOME_NET any -> $EXTERNAL_NET 80 (content: "Lula"; msg: "La vem 'Lula' pelo cabo de rede!";)
Nossa regra pode ser considerada pronta. Como vimos, podemos adicionar um indicador do tipo de alerta em que os alvos dessa regra devem se encaixar, podemos dar um valor de identificação para a regra e setar a sua prioridade frente às outras. Este tipo de informação tem de ser previa e adequadamente configurada dentro do arquivo classification.config. As pessoas interessadas realmente deviam dar uma olhada na documentação oficial.Mais tarde neste curso vamos ter a oportunidade de testar nossa regra.
Os logs
Uma última configuração que vai nos interessar por hora é o destino dos diagnósticos, os logs. Os logs, além de poderem ser enviados para o console em tempo real, podem ser tanto armazenado em arquivos quanto escritos em tabelas de um banco de dados. O arquivo pode ser escrito tanto em alertas quanto em formato tcpdump. Este formato não é legível sem uma ferramenta como o ethereal ou o próprio Snort.
Existem outras formas de gerar outputs com o Snort, dêem uma olhada nesta página da documentação on-line. Aqueles já familiarizados com o syslog podem se interessar em utilizar o syslog como gerenciador dos logs do Snort. A documentação é bastante completa.#Para logar os alertas no arquivo de alerta regular, descomente ou escreva a linha a seguir e substitua os valores:
output alert_unified: filename , limit
#Para logar todos os pacotes, escreva e substitua os valores:
output log_unified: filename , limit
#Para o snort colocar os resultados em um banco de dados mysql, descomente a seguinte linha e substitua os valores:
output database: log, mysql, user= password= dbname= host=
Conferindo os alertas
Enfim temos uma boa oportunidade de testar a regra que criamos. Como é uma única regra e foi escrita dentro do nosso arquivosnort.conf, não precisamos deixá-la na pasta de regras.
Bom, entremos na linha de comando e vamos botar pra rodar nosso Snort no modo NIDS deixando-o logar no diretório padrão todos os alertas.$ snort -A full -c snort.conf
Agora, enquanto o Snort roda, abra um navegador qualquer e procure em um site de busca por notícias sobre o presidente Lula. Abra alguns sites que falem sobre ele, navegue um pouco nas notícias e depois de um tempo feche a aba do navegador e retorne para o console.
Leia enfim o arquivo com os alertas gerados:
$ cat /var/log/snort/alert
Outros aplicativos
Como já comentado no curso, existem programas que podem auxiliar e muito o uso do Snort. Existem basicamente três atividades ou funções em que o Snort pode ser auxiliado:
- Otimização do processo de logging;
- Gerenciamento e organização dos logs;
- Estender o Snort para agir como um IDS ativo.
Com 'ativo' quero dizer que um IDS poderia tomar medidas de segurança a partir dos resultados dos logs. O Snort, no entanto, é passivo na medida em que simplesmente loga eventos, mas não bloqueia ips nem normalmente impede de forma alguma que os ataques aconteçam.Aqui vai pois a sugestão de três programas destinados a satisfazer cada uma das funções listadas acima. Caso pense em implementar a sério o Snort, considere bem essas ferramentas pesquisando sobre elas.1 - Barnyard
O Snort analisa pacote por pacote, procurando aqueles que se encaixam em alguma regra configurada. Antes de passar para o próximo pacote, o Snort pode precisar gerar um log e/ou um alerta sobre esse pacote. Se, por exemplo, o Snort estiver escrevendo no banco de dados diretamente, ele precisa esperar a confirmação da escrita no banco antes de analisar o próximo pacote. Em redes de grande tráfego, esse tempo da confirmação pode fazer com que o Snort deixe de analisar algum pacote, o que deterioraria a confiabilidade do programa. E se o banco de dados cair, o Snort cai também.O Barnyard foi feito para contornar esse problema. Você configura o Snort para escrever em um arquivo, e o Barnyard cuida de jogar os dados desse arquivo para o banco, deixando o Snort livre para a análise de pacotes.
2 - Oinkmaster
Oinkmaster é um programa que gerencia as regras usadas pelo Snort. Ele baixa o arquivo, descompacta, faz backup das regras antigas e oferece outras facilidades. Enfim, ele nos ajuda a gerenciar as regras.
3 - Guardian
Segundo a própria descrição do site oficial, o Guardian é um programa que trabalha em conjunto com o Snort para atualizar automaticamente regras de firewall de acordo com os alertas gerados pelo Snort.
As regras de firewall geradas bloqueiam todos dados que vêm de endereços de máquinas que estão realizando ataques segundo os diagnóstico dos alertas.
Existem recursos, no entanto, que previnem que o iptables termine bloqueando o endereço de máquinas importantes e amistosas.