Por: @jonasc
Publicado em: 2021-06-16

Suricata IDS/IPS com NFQUEUE

O Suricata é um software Open Source de IDS/IPS (Intrusion Detection System / Intrusion Prevention System) de alta performance. Ele é mantido pela OISF (Open Information Security Foundation), uma fundação comunitária sem fins lucrativos.

O código fonte é regido pela licença GNU GPLv2. O suporte é comunitário, principalmente através de fóruns ( mais detalhes em https://suricata.io/community/). É possível também se tornar um membro Consortium.

O software possui duas versões: Suricata Old Stable 5.0.6 e Suricata Stable 6.0.2. O primeiro pode ser instalado a partir do repositório EPEL, já o segundo através do repo oficial da OISF.

Este laboratório implementa a versão 6.0 do Suricata.

Topologia

Topologia de rede padrão com FWFLEX sobre CentOS 8.

Instalação

Instalando Suricata:

yum install epel-release yum-plugin-copr
yum copr enable @oisf/suricata-6.0
yum install suricata

Configuração

Informações sobre configuração:

  • Por padrão, o Suricata já vem pré-configurado para funcionar;
  • O arquivo de configuração principal fica em /etc/suricata/suricata.yaml;
  • Opções de execução do serviço podem ser alteradas em /etc/sysconfig/suricata (não alterar a unit do systemd);
  • Em /etc/suricata/rules/ há uma organização de regras sugerida que pode ser usada como base, mas não vem ativa por padrão;
  • As regras padrão do Suricata ficam em /var/lib/suricata/rules/.

Na primeira instalação, o Suricata vem sem regras. Necessário fazer download do conjunto de regras Emerging Threats Open (et/open), através do comando:

suricata-update 

É possível usar outros conjuntos de regras, como por exemplo o Emerging Threats Pro (et/pro) da Proofpoint, que requer chave de acesso, bem como outras listas gratuitas. Comandos para visualizar os disponíveis e adicionar um escolhido:

suricata-update update-sources
suricata-update list-sources
suricata-update enable-source tgreen/hunting

Para adicionar um arquivo customizado de regras, basta incluir em /etc/suricata/suricata.yaml:

rule-files:
  - suricata.rules
  - itflex-custom.rules

A syntax de regra é igual a do Snort 3, exceto que não aceita formatação como quebra de linha e identação. A regra fica toda em uma linha só, no seguinte formato:

drop icmp any any -> 8.8.8.8 any (msg:"TESTE ICMP"; sid:1000001; rev:1; classtype:icmp-event;)
alert icmp any any -> any any (msg:"TESTE ICMP"; sid:1000002; rev:1; classtype:icmp-event;)
pass icmp any any -> 1.1.1.1 any (msg:"TESTE ICMP"; sid:1000003; rev:1; classtype:icmp-event;)

Para ativar o Suricata com NFQUEUE basta adicionar a opção -q com os números das filas em /etc/sysconfig/suricata e remover o parâmetro de interface:

#OPTIONS="-i eth0 --user suricata"
OPTIONS="-q 4:5 --user suricata"

OBS: Caso não queira subir outras queues e threads, basta manter a configuração padrão e usar -j NFQUEUE sem especificar o número da fila, assim o iptables encaminha para a queue 0.

Configuração de Regras do iptables

Basta configurar para que uma regra de encaminhamento comum seja direcionada para uma QUEUE do iptables:

iptables -I FORWARD -j NFQUEUE --queue-num=4
iptables -I FORWARD -d 8.8.8.8 -j NFQUEUE --queue-num=5

Com os parâmetros acima, caso ocorra erro ou Suricata esteja parado, o tráfego será descartado, pois o QUEUE não faz return. É possível ativar bypass:

iptables -I FORWARD -j NFQUEUE --queue-num=4 --queue-bypass

OBS: Bypass não é o mesmo que return. Significa aceitar imediatamente o tráfego. Por exemplo, mesmo tendo um DROP imediatamente abaixo do bypass, este não tem efeito algum:

[root@lab-suricata-ips.itflex.local suricata]# iptables -nvL FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6   360 NFQUEUE    all  --  *      *       0.0.0.0/0            0.0.0.0/0            NFQUEUE num 4 bypass
    1    60 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0  

Testes

Regras usadas para simulação em itflex-custom.rules, conforme citado acima. Testes executados:

$ ping 1.1.1.1
$ ping 8.8.8.8
$ ping 8.8.4.4

Host 1.1.1.1 liberado sem gerar log, 8.8.4.4 liberado gerando alerta e 8.8.8.8 bloqueado gerando alerta.

Logs:

06/16/2021-17:44:30.944757  [**] [1:1000002:1] TESTE ICMP [**] [Classification: Generic ICMP event] [Priority: 3] {ICMP} 172.28.60.50:8 -> 8.8.4.4:0
06/16/2021-17:44:30.961533  [**] [1:1000002:1] TESTE ICMP [**] [Classification: Generic ICMP event] [Priority: 3] {ICMP} 8.8.4.4:0 -> 172.28.60.50:0

06/16/2021-17:44:45.813742  [Drop] [**] [1:1000001:1] TESTE ICMP [**] [Classification: Generic ICMP event] [Priority: 3] {ICMP} 172.28.60.50:8 -> 8.8.8.8:0
06/16/2021-17:44:45.813742  [**] [1:1000002:1] TESTE ICMP [**] [Classification: Generic ICMP event] [Priority: 3] {ICMP} 172.28.60.50:8 -> 8.8.8.8:0

Resultados

Ponto positivo: Mostrou que atende bem a necessidade de ativar IPS em regra de firewall específica e permitiu configuração de múltiplos threads. Ponto preocupante: Qualquer problema com Suricata, a QUEUE descarta o tráfego ou faz bypass (libera). Não possui return.

Em relação às funcionalidades básicas, faz tudo o que o Snort 3 faz e é muito mais fácil de instalar e manter atualizado, tanto software quanto listas de regras.