capítulo 03
IDS + Honeypot
Suricata observando a rede, Cowrie fingindo ser um alvo fácil — e a confirmação de que um enxerga o outro corretamente.
Suricata
sudo apt install -y suricata
suricata --build-info | head -20
Antes de configurar, descubra o nome real da interface de rede dentro da VM — quase nunca é eth0 em ambientes virtualizados:
ip a
Em VMs VirtualBox o nome costuma ser enp0s3; em outros hypervisors pode ser diferente ainda. Configurar o Suricata com um nome de interface que não existe de verdade na máquina não gera erro nenhum na inicialização — ele simplesmente nunca captura pacote nenhum, e o sintoma vira "nenhum alerta aparece nunca", sem pista clara do motivo.
af-packet:
- interface: SUA_INTERFACE
vars:
address-groups:
HOME_NET: "[IP_DA_VM/32]"
sudo suricata-update
sudo suricata -T -c /etc/suricata/suricata.yaml -v
sudo systemctl enable --now suricata
sudo systemctl status suricata
Regra de teste
Antes de depender de tráfego de ataque real (que só dispara regras baseadas em contagem/padrão), confirme que o pipeline de alerta funciona com algo simples:
alert icmp any any -> $HOME_NET any (msg:"Teste local: ICMP recebido"; sid:1000001; rev:1;)
Confirme que local.rules está listado em rule-files no suricata.yaml, reinicie, e teste de outra máquina da rede:
ping -c 3 IP_DA_VM
sudo tail -n 5 /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
Cowrie
Crie a rede Docker isolada antes de subir o container — esquecer esse passo é a causa mais comum de erro na hora do compose up:
docker network create honeypot-net
services:
cowrie:
image: cowrie/cowrie:latest
container_name: cowrie
restart: unless-stopped
networks:
- honeypot-net
ports:
- "2222:2222"
- "2223:2223"
volumes:
- cowrie-etc:/cowrie/cowrie-git/etc
- cowrie-var:/cowrie/cowrie-git/var
deploy:
resources:
limits:
memory: 256M
cpus: "1.0"
environment:
- COWRIE_HONEYPOT_HOSTNAME=web-prod-02
- COWRIE_TELNET_ENABLED=yes
networks:
honeypot-net:
external: true
volumes:
cowrie-etc:
cowrie-var:
docker compose up -d
docker compose ps
Evite hostnames parecidos com o padrão da ferramenta (svr04) — algo como srv-04 ainda é reconhecível por quem já viu um Cowrie antes. Prefira algo genuinamente genérico, como no exemplo acima.
Inspecionar antes de expor
ssh -p 2222 root@localhost
# qualquer usuário/senha é aceito — a armadilha do honeypot
# rode alguns comandos, depois `exit`
A imagem oficial do Cowrie é minimalista de propósito — não tem tail nem outros utilitários dentro do container. Pra ver o log, use docker logs cowrie --tail 20 em vez de docker exec.
Confirmar que o Suricata enxerga o Cowrie
De outra máquina da rede:
ssh -p 2222 fake_user@IP_DA_VM
sudo tail -n 20 /var/log/suricata/eve.json | jq 'select(.dest_port==2222)'
dest_port: 2222 bate com a porta externa do Cowrie — prova que o Suricata enxerga o pacote antes da reescrita do NAT do Docker. E o src_ip sendo o IP real de outra máquina (não algo como 172.18.0.1, que é o gateway interno do Docker) confirma que o tráfego passou pela rede de verdade, não só pela ponte interna do container.