Mapa da aula
Aula 13 publicada. Mapa, exemplo, EX037.
flowchart TD
N0["13.1 Normalização"]
N1["Laboratório 4 — normalizar e deduplicar"]
N2["13.2 Lendo o resultado"]
N3["13.3 Chaves e índices"]
N4["13.4 Proveniência"]
N5["13.5 Retenção"]
N6["Nota de prática — Padrões de consulta"]
N7["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX037"]
Desenho lógico
flowchart LR
N0["13.1 Normalização"]
N1["Laboratório 4 — normalizar e deduplicar"]
N2["13.2 Lendo o resultado"]
N3["13.3 Chaves e índices"]
N4["13.4 Proveniência"]
N5["13.5 Retenção"]
N6["Nota de prática — Padrões de consulta"]
N7["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX037"]
[13.1 Normalização]
|
v
[Laboratório 4 — normalizar e deduplicar]
|
v
[13.2 Lendo o resultado]
|
v
[13.3 Chaves e índices]
|
v
[13.4 Proveniência]
|
v
[13.5 Retenção]
|
v
[Nota de prática — Padrões de consulta]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX037]
Objetivos de aprendizagem
Você vai (1) normalizar e deduplicar indicadores antes do armazenamento; (2) escolher chaves e índices para consultas de inteligência; (3) modelar a proveniência de cada objeto armazenado; (4) projetar a retenção e a exclusão.
13.1 Normalização
O mesmo domínio pode chegar como C2.Example., c2.example ou em texto desarmado. Sem normalização, o repositório se enche de duplicatas e as contagens de correspondências mentem. O laboratório mostra o efeito: sete entradas, quatro valores reais. Uma contagem baseada nas strings brutas alegaria que a BEN viu sete indicadores distintos quando viu quatro. O normalizador de Kofi passa para minúsculas onde a caixa não importa, remove o ponto final dos domínios, retira os espaços e rearma o texto, com cada etapa testada isoladamente. A ordem das etapas é fixa e documentada.
Laboratório 4 — normalizar e deduplicar
"""Lab 4 (ch 13): normalise and de-duplicate synthetic indicators before storage."""
raw = ["C2.Example.", "c2.example", "hxxp://drop[.]example/a", "http://drop.example/a",
"203.0.113.9", " 203.0.113.9 ", "198.51.100.44"]
def norm(s):
s = s.strip().lower().replace("hxxp", "http").replace("[.]", ".")
return s[:-1] if s.endswith(".") else s
seen, out = set(), []
for r in raw:
n = norm(r)
if n not in seen:
seen.add(n); out.append(n)
print(f"raw={len(raw)} unique={len(out)}")
for o in out:
print(" ", o)
Execute com python3 lab_dedupe.py. Saída verificada:
raw=7 unique=4
c2.example
http://drop.example/a
203.0.113.9
198.51.100.44
13.2 Lendo o resultado
Sete strings brutas se reduzem a quatro valores únicos. O ponto final, as maiúsculas, o desarme e os espaços em volta eram todos ruído. As regras de normalização precisam ser documentadas, versionadas e idempotentes. Kofi trata as regras como parte do modelo de dados. Cada regra tem um motivo escrito, um teste e um número de versão armazenado com cada registro que produziu. Rodar o normalizador sobre a própria saída deve dar o mesmo resultado, o que os testes de propriedades do capítulo de programação verificam. Se uma regra muda, os registros mais antigos podem ser encontrados pela versão e reprocessados, em vez de deixar duas formas normais diferentes no repositório ao mesmo tempo.
13.3 Chaves e índices
Os objetos STIX 2.1 trazem um id da forma type--UUID. O Lantern usa esse id como chave dos objetos e indexa os valores normalizados dos indicadores para comparações rápidas. Os avistamentos têm como chave o id do indicador e o horário. O identificador nunca muda, mesmo que a descrição ou a confiança do indicador mudem, então as referências feitas por relacionamentos e avistamentos continuam válidas. Os índices são escolhidos a partir das perguntas que os analistas mais fazem. Kofi mediu a velocidade de comparação com e sem o índice de valores e achou a diferença grande o bastante para justificar seu custo de armazenamento. Consultas raras podem rodar mais devagar, em vez de ganhar índices próprios.
13.4 Proveniência
Cada objeto registra sua fonte, o rótulo TLP, o horário da coleta e a versão do parser. Indicadores duplicados vindos de duas fontes são armazenados uma vez, com as duas entradas de proveniência, para que os analistas vejam a corroboração. A corroboração só conta se as fontes forem independentes. Se o parceiro B simplesmente copia o feed do parceiro A, duas entradas não acrescentam nada. O modelo de Kofi registra onde cada parceiro diz ter obtido um indicador, quando o parceiro informa isso, para que os analistas percebam relatos repetidos, e não independentes. O rótulo mais restritivo entre as fontes acompanha o registro compartilhado, de modo que a fusão nunca afrouxa um limite de compartilhamento.
13.5 Retenção
A retenção segue os acordos e a lei. A exclusão precisa chegar aos backups dentro de um prazo declarado; "apagado da interface" não é exclusão. O desenho de Kofi dá a cada fonte um período de retenção tirado de seu acordo. Um job agendado remove os registros expirados do repositório ativo, e os backups são destruídos em um ciclo fixo, de modo que um registro expirado sobrevive nas cópias de backup por, no máximo, o prazo declarado. O job grava um log das contagens removidas por fonte, que o encarregado de privacidade revisa. Se um parceiro pedir a exclusão, o mesmo log mostra quando ela foi feita.
Nota de prática — Padrões de consulta
Os analistas fazem três tipos de pergunta: este valor existe, o que está relacionado a ele e o que mudou recentemente. Consultas de correspondência exata precisam de índices hash sobre os valores normalizados; consultas de relacionamento precisam de índices sobre os ids de origem e de destino; consultas de recência precisam de índices de tempo. Projetar os índices a partir de perguntas reais evita tanto consultas lentas quanto armazenamento desperdiçado. As exclusões em massa são ensaiadas primeiro em uma cópia, porque uma regra de normalização equivocada aplicada durante a exclusão pode remover muito mais do que o pretendido.
Exemplo resolvido
Kofi funde os feeds de dois parceiros. A normalização revela que 18% dos indicadores do parceiro B já existem a partir do parceiro A. Em vez de descartá-los, o Lantern acrescenta a proveniência do parceiro B aos registros existentes, aumentando sua contagem de corroboração.
Caso sintético. Os feeds e as porcentagens são inventados.
Erros e limites
Uma normalização agressiva demais pode fundir valores distintos (por exemplo, caminhos de URL sensíveis a maiúsculas e minúsculas). Teste as regras com formatos reais.
Exercícios
- EX037 — Contagem de únicos. Quantos valores únicos o laboratório produz a partir de sete entradas?
Mostrar critérios de avaliação
Rubrica: 3 = 4; 2 = correto, com um valor listado errado; 1 = 7; 0 = nenhuma. - EX038 — Corroboração. Por que manter as duas entradas de proveniência de um indicador duplicado?
Mostrar critérios de avaliação
Rubrica: 3 = mostra a corroboração por fontes independentes; auditoria; 2 = só auditoria; 1 = descartar duplicatas; 0 = nenhuma. - EX039 — Caixa do caminho. Dê um exemplo em que passar uma URL inteira para minúsculas poderia estar errado.
Mostrar critérios de avaliação
Rubrica: 3 = caminho/consulta sensível a maiúsculas no servidor; 2 = vago; 1 = nunca está errado; 0 = nenhuma.
Síntese
Normalize com cuidado, use ids estáveis como chave, mantenha a proveniência e torne a exclusão real.
Continue estudando — capítulo 13 de 50
← Capítulo 12 (rascunho) · Índice de capítulos do curso · Capítulo 14 (rascunho) →