Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

08 - Engenharia de Dados e Pipelines de CTI

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Engenharia de Dados e Pipelines de CTI

Nota 08 do capítulo 09 (Ferramentas e Plataformas), que trata a CTI como problema de engenharia de dados em escala.
Define a arquitetura de pipeline que leva fontes brutas de inteligência até produtos consumíveis por analistas, SIEM e SOAR.
Dialoga com a nota 08 do capítulo 02 (pipeline de coleta e enriquecimento), com a nota 09 do capítulo 02 (normalização) e com os controles COL.5 e AUT do capítulo 15.

1. Contexto e Posicionamento na Biblioteca

As notas de coleta do capítulo 02 mostram o que buscar; esta nota mostra como sustentar a operação quando o volume passa de dezenas de fontes e milhões de indicadores por dia. Engenharia de dados é a disciplina que transforma coleta artesanal de CTI, feita em scripts pontuais e planilhas, em um serviço interno com contratos de schema, metas de latência, custo medido e qualidade auditada. Sem essa disciplina, o time de inteligência passa mais tempo consertando crawlers e feeds corrompidos do que produzindo análise, e o time de hunting desconfia dos dados que consome.

O posicionamento dentro do ciclo de inteligência é preciso: a engenharia de dados habita a etapa de processamento, entre a coleta e a análise. Ela recebe feeds OSINT, licenciados, ISACs e saídas de sandboxes pela nota 08 do capítulo 02, entrega produtos normalizados e enriquecidos ao OpenCTI ou MISP da nota 04 do capítulo 03, e publica datasets para as caças do capítulo 07. O critério de sucesso não é a sofisticação da stack, mas três propriedades: o dado chega rápido, o dado é confiável e o dado tem custo conhecido por camada de retenção.

2. O Papel da Engenharia de Dados no CTI-TH

Três problemas operacionais justificam a existência do papel. Volume e heterogeneidade: uma operação séria consome feeds em STIX, CSV, JSON e texto corrido, com campos homônimos de semântica distinta, e nenhuma análise escala sobre essa sopa sem normalização. Qualidade: feeds de baixa procedência injetam falsos positivos direto no SIEM, e sem pipeline com validação e deduplicação o rateio de falso positivo vira custo do time de detecção. Reversibilidade: quando um feed muda de schema ou um enriquecimento é revogado, só um pipeline com dado bruto imutável armazenado permite reprocessar o histórico sem recoordenar tudo.

O engenheiro de dados de CTI cumpre funções específicas dentro do time de inteligência. Mantém conectores de coleta com agendamento, backoff e alerta de falha; define e evolui o schema canônico de indicadores, com revisão documentada; implementa transformações idempotentes e testadas; opera o enriquecimento com orçamento de API; e publica contratos de saída para os consumidores, SIEM, TIP e notebooks de hunting. É um papel de software com sensibilidade de analista: o produto final é decisão, não apenas dado.

3. Arquitetura de Pipeline: Estágios e Contratos

O pipeline canônico tem cinco estágios, cada um com contrato de entrada e de saída. A coleta extrai das fontes sem transformar, preservando payload bruto e metadados de proveniência (URL, horário, versão do feed). A camada de stream faz parse, validação de sintaxe (IP, domínio, hash, URL), deduplicação por janela e normalização para o schema canônico. O enriquecimento adiciona atributos derivados de forma assíncrona: reputação, geolocalização, WHOIS, passive DNS, com cache e rate limit conforme a nota 09. O armazenamento persiste em lake colunar particionado, e a distribuição publica marts curados para os consumidores.

O diagrama abaixo resume o desenho de referência que os exemplos desta nota implementam:

Fontes de CTI (OSINT, feeds licenciados, ISAC, MISP, TAXII, sandboxes)
   |
   v
[1] Coleta: conectores agendados e webhooks, payload bruto imutável
   |
   v
[2] Topicos Kafka: cti.raw (particionado por fonte)
   |
   v
[3] Stream Flink: parse, validacao, dedup, normalizacao para schema canonico
   |                            \
   v                             v
[4] Enriquecimento assincrono:   [5] Lake S3: Parquet particionado por data e fonte,
reputacao, geo, WHOIS, pDNS      bruto e normalizado, reprocessavel
   |                             |
   v                             v
[6] Marts dbt: iocs_validos, reputacoes, ttps_por_ator
   |
   v
[7] Distribuicao: OpenCTI, SIEM, SOAR, notebooks de hunting

Dois princípios de desenho valem mais que qualquer tecnologia. Primeiro, dado bruto é sagrado: nunca transforme no coletor, porque transformação precoce é irreversível. Segundo, idempotência em todos os estágios: rodar o estágio duas vezes sobre a mesma entrada produz o mesmo resultado, propriedade que permite reprocessar histórico e recuperar de incidentes de pipeline sem duplicar indicadores.

4. Tecnologias de Referência

Tecnologia Papel no pipeline Por que é a escolha comum
Apache Kafka Barramento de ingestão e desacoplamento ordenação por partição, replay, tolerância a pico
Apache Flink Processamento em stream com estado janelas de dedup, exatamente-uma vez, latência baixa
S3 com Parquet Lake de dados colunar e barato compressão alta, leitura seletiva por coluna, ciclo de vida
dbt Transformação SQL versionada e testada marts auditáveis, testes de schema, linhagem
OpenCTI e MISP Distribuição e gestão de inteligência consumidos pelos analistas, não substituídos pelo lake
Airflow ou Dagster Orquestração de lotes e backfills agendamento, dependências, alerta de execução

A escolha deve seguir o tamanho da operação. Um time pequeno roda o pipeline inteiro com Python, SQLite e agendador simples; a stack Kafka e Flink entra quando a coleta passa de dezenas de fontes ativas e o reprocessamento se torna rotina. O antipadrão a evitar é adotar todas as peças de uma vez, gerando complexidade sem consumidores para os dados, e o contrário também vale: times grandes com planilha de IOCs em CSV compartilhado por e-mail têm problema de engenharia, não de ferramenta.

5. Exemplos Práticos de Configuração

A configuração de tópicos abaixo materializa o contrato de desacoplamento: o bruto fica disponível por 72 horas para reprocessamento rápido, o normalizado por uma semana para consumidores online, e tudo é persistido em Parquet por outro caminho:

topicos:
  - nome: cti.raw.feeds
    particoes: 12
    fator_replicacao: 3
    retencao_horas: 72
  - nome: cti.norm.indicadores
    particoes: 12
    fator_replicacao: 3
    retencao_horas: 168
  - nome: cti.enriquecido
    particoes: 6
    fator_replicacao: 3
    retencao_horas: 168

O modelo dbt abaixo publica o mart iocs_validos, com deduplicação por valor e tipo, filtro de confiança mínima e janela de validade, contrato que o SIEM e os notebooks de hunting consomem como tabela única e estável:

-- models/marts/iocs_validos.sql
WITH dedup AS (
  SELECT
    LOWER(TRIM(valor)) AS ioc,
    tipo,
    fonte,
    primeiro_visto,
    ultimo_visto,
    confianca,
    tlp,
    ROW_NUMBER() OVER (
      PARTITION BY LOWER(TRIM(valor)), tipo
      ORDER BY confianca DESC, ultimo_visto DESC
    ) AS posicao
  FROM {{ ref('stg_indicadores_brutos') }}
  WHERE tipo IN ('ip', 'dominio', 'url', 'sha256')
    AND confianca >= 60
    AND ultimo_visto >= DATE_SUB(CURRENT_DATE(), 90)
)
SELECT * FROM dedup WHERE posicao = 1

O teste de qualidade em dbt fecha o ciclo de confiabilidade, e cada falha dispara alerta para o time antes que o dado corrompido chegue ao consumidor:

models:
  - name: iocs_validos
    columns:
      - name: ioc
        tests: [not_null, unique]
      - name: tipo
        tests:
          - accepted_values: {values: [ip, dominio, url, sha256]}
      - name: confianca
        tests:
          - dbt_utils.accepted_range: {min_value: 0, max_value: 100}

6. Custo, Retenção em Camadas e SLOs

Custo em pipeline de CTI concentra-se em três rubricas: processamento de stream, armazenamento do lake e quota de APIs de enriquecimento. A disciplina de camadas resolve a maior parte do armazenamento: índices quentes no SIEM são caros e não devem reter inteligência bruta por anos; o Parquet comprime indicadores em proporções altas e custa ordens de magnitude menos por terabyte. O ciclo de vida do bucket (lifecycle) automatiza a transição, e a recompressão periódica de arquivos pequenos em arquivos maiores corta o custo de leitura do Athena ou do Trino.

Camada Armazenamento Formato Retenção sugerida Uso dominante
Quente SIEM ou índice de busca índice invertido 30 a 90 dias detecção e triagem em tempo real
Morna Object storage, classe padrão Parquet particionado 12 a 18 meses hunting histórico e backtest de detecção
Fria Object storage, classe de arquivo Parquet compactado 3 a 7 anos auditoria, reconstrução de campanha antiga

SLOs transformam o pipeline em serviço com responsabilidade mensurável. As metas abaixo são um ponto de partida realista para uma operação de tamanho médio, e cada violação deve gerar revisão documentada, não apenas correção silenciosa:

SLO Meta Medição
Latência de coleta a normalizado menos de 5 minutos no p95 diferença de timestamps no stream
Latência de coleta a disponível para hunting menos de 15 minutos no p95 job de publicação do mart
Taxa de eventos com falha de parse menos de 1 por cento métricas do sink Flink
Completude diária de fontes críticas 100 por cento job de reconciliação com contagem esperada
Disponibilidade do pipeline 99,5 por cento mensal monitor sintético de ponta a ponta

7. Erros Comuns e Pontos de Atenção

O erro estrutural mais comum é transformar no coletor, quebrando a reversibilidade e amarrando o histórico ao schema do dia da coleta; o segundo é deduplicar cedo demais com chaves incompletas, o que funde indicadores distintos, como o mesmo domínio observado em campanhas diferentes. Times também tratam enriquecimento como etapa síncrona obrigatória, e uma API lenta então trava todo o stream; o desenho da nota 09 resolve isso com assincronia e cache. Outro erro recorrente é medir o pipeline por volume ingerido, que incentiva feeds baratos e sujos, em vez de medir por SLO de latência e taxa de erro, que medem serviço.

Na governança, atenção a dois riscos silenciosos. Schema drift de feeds quebra parse em silêncio e o pipeline continua rodando com menos dados; a defesa é teste de contrato por fonte com alerta imediato. E retenção indefinida sem base legal vira passivo, porque indicadores carregam contexto de investigação; o ciclo de vida da nota 13 do capítulo 02 deve ser aplicado ao lake com o mesmo rigor aplicado ao SIEM.

8. Integração com o Restante da Biblioteca

Esta nota é a infraestrutura que as notas conceituais assumem existir. A coleta do capítulo 02 fornece as fontes; a normalização da nota 09 do capítulo 02 vira estágio Flink aqui; a pontuação e priorização da nota 05 do capítulo 05 vira regra no mart dbt; o hunting do capítulo 07 consome os marts nos notebooks; e o ciclo AUT do capítulo 15 orquestra execuções e alertas. A nota 09 deste capítulo detalha o estágio de enriquecimento que aqui apareceu como caixa preta, com cache, rate limit e riscos de OPSEC.

O leitor deve sair desta nota com o desenho de cinco estágios memorizado, a disciplina de dado bruto imutável internalizada e o hábito de expressar compromissos de pipeline como SLO. A métrica de sucesso final é dupla: o analista confia no dado que consome sem validar manualmente, e o custo por terabyte por mês é conhecido no dashboard, não na fatura surpresa.