Suricata
Motor de detecção/prevenção de intrusão multi-thread nativo, com logging estruturado EVE JSON — da arquitetura à integração com SIEM, com foco em ISP.
Nesta página
1. Contexto histórico e normativo
O Suricata foi lançado em 2009 pela OISF (Open Information Security Foundation), uma organização sem fins lucrativos criada com o apoio de governos e da indústria para desenvolver um motor IDS/IPS de código aberto e alto desempenho. A principal motivação foi superar a limitação do Snort de processamento single-thread, introduzindo uma arquitetura multi-thread nativa capaz de aproveitar múltiplos núcleos de CPU.
O Suricata é amplamente adotado como o motor de IDS/IPS em firewalls de borda conhecidos, como pfSense e OPNsense, o que valida sua robustez e integração com infraestruturas de segurança. Ele segue as diretrizes do NIST SP 800-94 (Guide to Intrusion Detection and Prevention Systems) e é compatível com regras no formato Snort (VRT/Talos) e Emerging Threats.
2. Arquitetura interna
A arquitetura do Suricata é dividida em módulos que operam em paralelo, cada um com sua própria thread:
- Capture threads — recebem pacotes das interfaces (via AF_PACKET, PF_RING, Netmap).
- Decoder — interpreta protocolos de rede e normaliza o tráfego.
- Stream engine — remonta fluxos TCP para inspeção de conteúdo.
- Detection engine — aplica regras de assinatura.
- Output modules — geram logs em EVE JSON, syslog, pcap, etc.
Essa separação permite que o Suricata escale horizontalmente com o número de núcleos de CPU, tornando-o adequado para inspeção em redes de alto throughput, como as de ISPs.
3. Instalação
# Debian/Ubuntu — repositório oficial da OISF (mais atualizado que o da distro)
add-apt-repository ppa:oisf/suricata-stable
apt update
apt install suricata
suricata --build-info | head -20 # confirma suporte multi-thread ativo
4. IDS vs. IPS — modos de operação
Recomendação amplamente seguida na indústria: sempre começar em modo IDS (só detecção, via espelhamento de porta/SPAN, sem interferir no tráfego real) até o conjunto de regras estar afinado (poucos falsos positivos) — só então migrar para IPS (inline, bloqueando ativamente), quando o risco de bloquear tráfego legítimo por engano já foi reduzido pela fase de tuning.
| Modo | Posição na rede | Risco |
|---|---|---|
| IDS | Fora do caminho (espelho/SPAN) — só observa | Zero impacto no tráfego, mas não bloqueia nada sozinho |
| IPS | Inline — todo pacote passa por ele antes de seguir | Falso positivo vira indisponibilidade real — exige tuning prévio, e hardware que aguente a latência de inspeção sem virar gargalo |
5. Regras — suricata-update
# Baixa e atualiza conjuntos de regras (Emerging Threats Open é gratuito
# e amplamente usado; Suricata é compatível com regras no formato Snort/VRT)
suricata-update
# Listar fontes de regra disponíveis
suricata-update list-sources
# Habilitar uma fonte adicional
suricata-update enable-source et/open
suricata-update
Suricata é compatível com o mesmo formato de regra usado historicamente pelo Snort (regras VRT/Talos e Emerging Threats) — migrar conjunto de regras entre as duas ferramentas exige pouco ou nenhum ajuste na maioria dos casos.
6. Escrever regra própria — exemplo ISP
Regra detectando padrão de varredura de porta contra a rede de gerência (15+ SYN de origem externa em 60 segundos):
# /etc/suricata/rules/local.rules
alert tcp !$HOME_NET any -> $HOME_NET any (msg:"Possível varredura de porta na rede de gerencia"; \
flags:S; threshold:type threshold, track by_src, count 15, seconds 60; \
classtype:attempted-recon; sid:1000001; rev:1;)
$HOME_NET é uma variável definida em suricata.yaml, apontando pra sua própria faixa de rede — ajustar corretamente é pré-requisito antes de qualquer regra fazer sentido.
7. EVE JSON — o diferencial de logging
Diferente do formato de texto plano tradicional, Suricata registra eventos em EVE JSON — estruturado, fácil de consultar e ingerir direto em ferramenta de análise:
tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
# Também gera eventos estruturados de protocolo (não só alerta) —
# DNS, TLS, HTTP, SMB, NFS — útil pra investigação além de "malicioso ou não"
tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="dns")'
8. Integração com SIEM/dashboard
O formato EVE JSON foi desenhado justamente pra alimentar pipeline moderno de log — encaminhar direto pra Elasticsearch/Loki (via Filebeat/Promtail) e visualizar em Kibana/Grafana é o padrão de mercado mais citado. Pra ISP já usando PRTG/Zabbix como base, alerta de severidade alta do Suricata também pode disparar notificação direta via webhook/syslog, tratado com a mesma prioridade de incidente de infraestrutura.
9. Monitoramento e métricas
Script de health check para Zabbix/PRTG:
#!/bin/bash
# check_suricata.sh
if pgrep -x suricata > /dev/null; then
echo "OK: Suricata rodando"
exit 0
else
echo "CRITICAL: Suricata parado"
exit 2
fi
Métricas úteis: número de alertas por minuto, taxa de pacotes processados, taxa de packet drop (a mais crítica), uso de CPU por thread e volume de logs gerados.
10. Backup e recuperação
- Configuração —
/etc/suricata/(incluindosuricata.yamle regras customizadas). - Regras próprias —
local.rulese qualquer arquivo de regra customizado. - Restauração — recriar os arquivos e reiniciar o serviço.
Use restic ou Borg com a regra 3‑2‑1‑1‑0.
11. Dimensionamento e performance
O Suricata escala bem com múltiplos núcleos de CPU. Para ISPs, as considerações de dimensionamento incluem:
- CPU — dedique núcleos exclusivos para as worker threads (CPU affinity).
- Regras ativas — mais regras = mais processamento por pacote.
- Modo IPS — exige hardware mais robusto que IDS (latência adicional).
- Logs EVE JSON — podem crescer rápido; configure rotação e retenção adequadas.
# suricata.yaml
threading:
set-cpu-affinity: yes
cpu-affinity:
- management-cpu-set:
cpu: [ 0 ]
- worker-cpu-set:
cpu: [ "1-7" ] # dedica núcleos específicos à inspeção
Monitorar taxa de packet drop (não taxa de alerta) é o indicador mais importante de saúde operacional — Suricata descartando pacote sob carga alta significa tráfego passando sem inspeção nenhuma, silenciosamente.
12. Comparação com Snort
| Característica | Suricata | Snort |
|---|---|---|
| Threading | Multi-thread nativo | Single (2.x) / Multi (3.x) |
| Logging | EVE JSON nativo | Texto/syslog/banco |
| Detecção de aplicação | Não equivalente nativo | OpenAppID |
| Performance | Melhor aproveitamento multi-core | Limitada por CPU única no 2.x |
Para redes novas, o Suricata tende a ser a recomendação mais citada — arquitetura multi-thread madura, logging EVE JSON nativo, e compatibilidade quase total com o mesmo formato de regra do Snort.
13. Troubleshooting
Rodar em modo IDS (não IPS) até afinar — desabilitar regras específicas ruidosas por SID em vez de descartar a categoria inteira de regra.
Verificar ajuste de CPU affinity (seção 11) e considerar reduzir conjunto de regras ativas — mais regras significa mais inspeção por pacote, exigindo mais CPU.
Confirmar em suricata.yaml que a variável reflete a faixa de rede real — erro comum é deixar o valor padrão de exemplo sem ajustar.
14. Glossário
15. Referências
- OISF — documentação oficial Suricata (docs.suricata.io).
- Emerging Threats — conjunto de regras open (rules.emergingthreats.net).
- NIST SP 800-94 — Guide to Intrusion Detection and Prevention Systems.
- Páginas relacionadas: Snort, pfSense.
Conteúdo técnico independente. Nenhum trecho é cópia literal de fonte de terceiro.