Escrevendo Regras Snort

CibersegurançaBeginner
Pratique Agora

Introdução

O Snort é um poderoso Sistema de Detecção de Intrusão em Rede (NIDS) de código aberto. Uma de suas características mais marcantes é sua linguagem flexível baseada em regras, que permite aos profissionais de segurança definir assinaturas para atividades de rede maliciosas.

As regras são a ponte entre a teoria e a detecção. Uma ideia de segurança, como "varreduras de porta são suspeitas", só se torna operacionalmente útil quando você a expressa em uma forma que o motor possa avaliar contra o tráfego real. Aprender a sintaxe das regras, portanto, ensina mais do que o próprio Snort. Ensina como os defensores traduzem comportamentos em lógica legível por máquina.

Neste laboratório, você aprenderá a sintaxe principal e a anatomia de regras personalizadas do Snort. Você escreverá regras fundamentais definindo Ações, Protocolos, endereços IP, Portas e Opções para detectar e alertar especificamente sobre pings ICMP direcionados e padrões anômalos de tráfego TCP. Ao final deste laboratório, você entenderá como construir, testar e validar suas próprias regras Snort.

Entenda a Sintaxe e o Cabeçalho da Regra

Nesta etapa, você aprenderá a estrutura básica de uma regra do Snort e criará um arquivo para armazenar suas regras personalizadas.

O cabeçalho é, na verdade, uma definição de escopo. Ele decide qual tráfego vale a pena ser avaliado. Isso é importante porque uma detecção eficiente começa restringindo o conjunto de tráfego candidato o máximo possível antes que verificações de conteúdo mais profundas sejam aplicadas. Cabeçalhos amplos são mais fáceis de escrever, mas também podem gerar mais ruído.

Uma regra do Snort é dividida em duas seções lógicas principais: o Cabeçalho da Regra e as Opções da Regra.

O Cabeçalho da Regra contém a ação da regra, o protocolo, os endereços IP de origem e destino e as portas de origem e destino. Ele dita quem está falando com quem e qual protocolo eles estão usando. A sintaxe básica é assim:

[Action] [Protocol] [Source IP] [Source Port] -> [Destination IP] [Destination Port] (Options)

Aqui está uma análise dos componentes do cabeçalho:

  • Action: O que o Snort deve fazer quando encontra um pacote que corresponde aos critérios da regra (por exemplo, alert, log, drop).
  • Protocol: O protocolo do tráfego (por exemplo, tcp, udp, icmp, ip).
  • IP Addresses: Os endereços IP de origem e destino. Você pode usar any para corresponder a todos os endereços IP.
  • Ports: As portas de rede de origem e destino. Você pode usar any para corresponder a todas as portas.
  • Direction Operator: O símbolo -> indica a direção do tráfego (da origem para o destino). Você também pode usar <> para tráfego bidirecional.

Para começar a escrever nossas próprias regras, precisamos de um arquivo dedicado. Certifique-se de estar no seu diretório de trabalho padrão (~/project) e crie um novo arquivo chamado local.rules.

Use o comando touch para criar um arquivo vazio:

touch ~/project/local.rules

Você pode verificar se o arquivo foi criado com sucesso listando o conteúdo do seu diretório:

ls -l ~/project/local.rules

Você deve ver uma saída semelhante a esta, confirmando que o arquivo existe e está vazio no momento:

-rw-r--r-- 1 labex labex 0 Jul 25 10:00 /home/labex/project/local.rules

Escreva uma Regra de Detecção ICMP

Nesta etapa, você escreverá sua primeira regra do Snort para detectar tráfego ICMP. O ICMP (Internet Control Message Protocol) é comumente usado por utilitários de rede como o ping para verificar a conectividade.

O ICMP é um bom exemplo didático porque é simples e fácil de reconhecer, mas também ilustra um ponto operacional real: nem toda detecção significa um ataque. Muitas redes usam ping legitimamente. O trabalho do analista é combinar o que a regra detectou com o contexto ambiental antes de decidir se o evento é benigno ou suspeito.

Escreveremos uma regra que dispara um alerta sempre que qualquer pacote ICMP viajar de qualquer origem para qualquer destino.

Abra seu arquivo local.rules usando o editor de texto nano:

nano ~/project/local.rules

Digite a seguinte regra no editor:

alert icmp any any -> any any (msg:"ICMP Ping Detected"; sid:1000001; rev:1;)

Vamos analisar o que essa regra significa:

  • alert: A ação a ser tomada. O Snort gerará um alerta.
  • icmp: O protocolo que estamos monitorando.
  • any any -> any any: O tráfego pode se originar de qualquer IP e qualquer porta, e ir para qualquer IP e qualquer porta.
  • (msg:"ICMP Ping Detected"; sid:1000001; rev:1;): Estas são as opções da regra. msg é a mensagem de alerta, sid é um ID único do Snort (regras personalizadas devem ter um ID de 1.000.000 ou superior) e rev é o número de revisão da regra.

Após digitar a regra, salve o arquivo e saia do nano pressionando Ctrl+O, Enter para confirmar o nome do arquivo e, em seguida, Ctrl+X para sair.

Agora, vamos testar se o Snort entende nosso arquivo de regras. O Snort possui um modo de teste (-T) que verifica a configuração e as regras em busca de erros de sintaxe sem realmente iniciar o motor de detecção.

Execute o seguinte comando para testar seu arquivo de regras:

sudo snort -T -c ~/project/local.rules

Você verá muitas informações à medida que o Snort inicializa. Procure perto do final da saída por uma mensagem de sucesso indicando que o Snort validou a configuração com êxito:

Snort successfully validated the configuration!
Snort exiting

Se você vir esta mensagem, sua regra ICMP está sintaticamente correta.

Escreva uma Regra de Alerta de Porta TCP

Nesta etapa, você escreverá uma regra para detectar tráfego TCP específico. Embora o ICMP não use portas, o TCP e o UDP usam. Isso nos permite escrever regras que visam serviços específicos, como HTTP (porta 80) ou SSH (porta 22).

As portas fornecem um contexto de aplicação aproximado. Elas não contam a história toda, mas geralmente são a primeira aproximação que os defensores usam para separar tipos de serviço. Uma regra baseada na porta de destino 80 está essencialmente dizendo: "Eu me importo com o tráfego que provavelmente é direcionado a um serviço web".

Escreveremos uma regra que nos alerta sempre que alguém tentar se conectar a um servidor web na porta 80.

Abra seu arquivo local.rules novamente usando o nano:

nano ~/project/local.rules

Adicione uma nova linha abaixo da sua regra ICMP existente e digite a seguinte regra TCP:

alert tcp any any -> any 80 (msg:"HTTP Traffic to Port 80 Detected"; sid:1000002; rev:1;)

Vamos analisar o cabeçalho desta nova regra:

  • alert tcp: Estamos gerando um alerta para o protocolo TCP.
  • any any: A origem pode ser qualquer endereço IP e qualquer porta.
  • ->: O tráfego está fluindo em direção ao destino.
  • any 80: O destino pode ser qualquer endereço IP, mas a porta de destino deve ser 80.

Observe que incrementamos o sid para 1000002. Cada regra do Snort deve ter um ID único.

Salve o arquivo (Ctrl+O, Enter) e saia do nano (Ctrl+X).

Mais uma vez, é uma boa prática testar a sintaxe da sua regra para garantir que não haja erros de digitação. Execute o comando de teste do Snort:

sudo snort -T -c ~/project/local.rules

Role até o final da saída para confirmar que o Snort validou a configuração com êxito. Agora você deve ter duas regras carregadas com sucesso.

Inclua Opções de Regra (Msg, SID, Rev)

Nesta etapa, vamos nos aprofundar na seção de Opções de Regra. A seção de opções é delimitada por parênteses () e contém pares de palavra-chave/valor separados por ponto e vírgula ;.

As opções de regra são onde uma categoria de tráfego bruta se torna um alerta significativo. Uma msg clara ajuda um humano a entender o evento. Um sid único permite que os sistemas rastreiem qual regra foi disparada. Um valor rev permite que as equipes gerenciem o conteúdo de detecção ao longo do tempo. Esses campos suportam operações, não apenas sintaxe.

Você já usou as três opções mais fundamentais. A primeira é msg, que é a mensagem que será impressa nos logs de alerta e deve ser descritiva. A segunda é sid, que significa Snort ID; regras escritas por usuários devem ter um SID maior que 1.000.000. A terceira é rev, representando o número da revisão; toda vez que você modificar uma regra, deve incrementar esse número para acompanhar as versões.

Vamos escrever uma regra para detectar tentativas de conexão SSH (porta 22) para praticar o uso dessas opções.

Abra seu arquivo local.rules:

nano ~/project/local.rules

Adicione a seguinte regra ao final do arquivo:

alert tcp any any -> any 22 (msg:"SSH Connection Attempt"; sid:1000003; rev:1;)

Nesta regra, definimos uma msg básica e atribuímos um novo SID único (1000003).

Suponha que mais tarde decidamos atualizar a mensagem desta regra para ser mais específica. Alteraríamos a msg e incrementaríamos a rev para 2. Vamos fazer isso agora. Modifique a regra SSH que você acabou de escrever no final do arquivo para ficar assim:

alert tcp any any -> any 22 (msg:"Possible SSH Brute Force Attempt"; sid:1000003; rev:2;)

Salve o arquivo (Ctrl+O, Enter) e saia do nano (Ctrl+X).

Finalmente, execute a verificação de sintaxe mais uma vez para garantir que todas as suas três regras estejam perfeitamente formatadas:

sudo snort -T -c ~/project/local.rules

Procure pela mensagem de sucesso da validação. Agora você escreveu e estruturou com sucesso várias regras personalizadas do Snort usando cabeçalhos e opções.

Resumo

Neste laboratório, você aprendeu as habilidades fundamentais necessárias para escrever regras personalizadas do Snort. Você explorou a anatomia de uma regra, dividindo-a em Cabeçalho de Regra e Opções de Regra. Você escreveu com sucesso regras para detectar tráfego ICMP geral e tráfego de porta TCP específico. Além disso, você aprendeu como utilizar opções de regra essenciais como msg, sid e rev para tornar seus alertas descritivos e identificáveis de forma única. Essas habilidades formam a base para a criação de assinaturas avançadas de detecção de intrusão em rede.