Posto de Observação

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
erro comum

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
disfarce

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`
nota

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)'
sinal confirmado

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.