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.
Links relacionados
- https://suricata.readthedocs.io/en/suricata-6.0.2/index.html
- https://kifarunix.com/install-and-setup-suricata-on-centos-8/
- https://materials.rangeforce.com/tutorial/2020/02/09/Suricata-Intrusion-Prevention-System/
- https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Setting_up_IPSinline_for_Linux