Capítulo 9 — Dados e bancos de dados
Mapa da aula
Aula 09 publicada. Mapa, exemplo, EX025.
flowchart TD
N0["9.1 Por que um banco de dados"]
N1["9.2 Projeto da tabela"]
N2["Laboratório — consultar o repositório"]
N3["9.3 Lendo o resultado"]
N4["9.4 Envelhecimento de indicadores"]
N5["9.5 Consultas parametrizadas"]
N6["9.6 Manter o histórico"]
N7["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX025"]
Desenho lógico
flowchart LR
N0["9.1 Por que um banco de dados"]
N1["9.2 Projeto da tabela"]
N2["Laboratório — consultar o repositório"]
N3["9.3 Lendo o resultado"]
N4["9.4 Envelhecimento de indicadores"]
N5["9.5 Consultas parametrizadas"]
N6["9.6 Manter o histórico"]
N7["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX025"]
[9.1 Por que um banco de dados]
|
v
[9.2 Projeto da tabela]
|
v
[Laboratório — consultar o repositório]
|
v
[9.3 Lendo o resultado]
|
v
[9.4 Envelhecimento de indicadores]
|
v
[9.5 Consultas parametrizadas]
|
v
[9.6 Manter o histórico]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX025]
Objetivos de aprendizagem
Você vai (1) projetar uma pequena tabela de indicadores; (2) consultá-la com SQL por meio do sqlite3 do Python; (3) encontrar indicadores desatualizados; (4) guardar os rótulos de tratamento junto com os dados.
9.1 Por que um banco de dados
Uma planilha funciona até que dois analistas a editem ao mesmo tempo. Um pequeno banco SQLite dá uma única fonte da verdade, consultas no lugar da filtragem manual e um registro do que se sabia e quando. Amara passa sua lista de indicadores de uma planilha compartilhada para o SQLite depois que dois analistas sobrescreveram as notas um do outro. O arquivo do banco entra no backup junto com os outros registros da equipe, e toda mudança é feita pelo script de importação ou por uma consulta revisada, então fica claro quem mudou o quê e quando.
9.2 Projeto da tabela
Colunas: value, type, source, rótulo TLP, first_seen, last_seen e status. Guardar o TLP em cada linha significa que as consultas podem filtrar o que pode ser compartilhado antes que qualquer coisa saia do HCHT. O status registra se um indicador está ativo, em revisão ou expirado. Amara acrescenta uma restrição para que a coluna TLP aceite apenas os cinco rótulos válidos, o que impede que um erro de digitação crie um rótulo que as consultas deixariam passar. As datas de primeira e última observação permitem à equipe mostrar por quanto tempo um indicador foi relevante, o que importa para as decisões de envelhecimento.
Laboratório — consultar o repositório
"""Lab 2 (ch 09): store synthetic indicators in an in-memory SQLite database and query by TLP and age."""
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("create table ioc(value text primary key, type text, tlp text, last_seen text)")
db.executemany("insert into ioc values(?,?,?,?)", [
("portal-login.example", "domain", "TLP:GREEN", "2026-10-01"),
("203.0.113.50", "ipv4", "TLP:AMBER", "2026-07-15"),
("files.example", "domain", "TLP:CLEAR", "2026-10-08"),
("198.51.100.7", "ipv4", "TLP:GREEN", "2026-05-02"),
])
q = "select value, tlp from ioc where tlp in ('TLP:CLEAR','TLP:GREEN') and last_seen >= ? order by value"
for row in db.execute(q, ("2026-09-01",)):
print(row)
print("stale:", db.execute("select count(*) from ioc where last_seen < '2026-09-01'").fetchone()[0])
Execute com python3 lab_sql.py. Saída verificada:
('files.example', 'TLP:CLEAR')
('portal-login.example', 'TLP:GREEN')
stale: 2
9.3 Lendo o resultado
A consulta retorna dois domínios com seus rótulos TLP: files.example em TLP:CLEAR e portal-login.example em TLP:GREEN. Uma segunda consulta conta dois indicadores cuja data last_seen é mais antiga que o limiar de revisão — candidatos a expirar. A consulta filtra pelo TLP antes de retornar as linhas, então uma lista preparada para compartilhamento não pode incluir entradas restritas por engano. Amara revisa os dois candidatos a expirar com a supervisora antes de mudar o status deles, já que um pode continuar ativo segundo uma atualização recente do HSSC.
9.4 Envelhecimento de indicadores
Endereços mudam de mãos; domínios são registrados de novo. Um indicador do ano passado pode hoje pertencer a alguém inocente. Regras de envelhecimento — revisão depois de 90 dias para endereços, prazo maior para hashes — mantêm as listas de bloqueio precisas. A Pyramid of Pain de Bianco explica o porquê: indicadores de baixo nível são baratos de mudar para os adversários. Amara aplica as regras por meio de uma consulta agendada que lista os indicadores que devem ser revisados. Cada revisão pergunta se o indicador ainda aparece em relatórios ou logs recentes. Se não aparece, ele passa para monitoramento ou expira, e o motivo é registrado. Os hashes envelhecem mais devagar porque o hash de um arquivo nunca muda, embora o arquivo possa deixar de ser usado.
9.5 Consultas parametrizadas
Sempre passe os valores como parâmetros, nunca por concatenação de strings. Isso impede que valores malformados corrompam as consultas. Os scripts de Amara usam parâmetros em toda consulta que inclui um valor vindo de um feed, mesmo quando o valor já foi validado. Às vezes os feeds trazem aspas ou pontos e vírgulas dentro de nomes de domínio desarmados à mão, e uma consulta concatenada poderia falhar ou mudar de formas inesperadas. Os parâmetros eliminam o risco por completo e deixam o código mais fácil de ler e revisar. É um hábito simples e permanente.
9.6 Manter o histórico
Quando um indicador é aposentado, mude seu status para "expired" em vez de apagar a linha. Uma investigação posterior pode perguntar se o HCHT estava bloqueando aquele endereço em um dia específico, e só um histórico de mudanças de status com datas pode responder à pergunta com honestidade. Amara acrescenta uma pequena tabela de histórico que registra cada mudança de status com a data e o analista. Isso permite responder a essas perguntas com datas, e não com a memória, e deixa a equipe medir por quanto tempo os indicadores costumam ficar ativos antes de serem aposentados.
Exemplo resolvido
Antes de enviar um resumo semanal aos membros do HSSC, Amara filtra apenas as linhas rotuladas TLP:CLEAR ou TLP:GREEN. Uma linha TLP:AMBER de um parceiro é excluída automaticamente. Ela também exporta a lista de desatualizados para revisão pela equipe de rede, em vez de apagar as linhas ela mesma.
Caso sintético. Todas as linhas são inventadas.
Erros e limites
Um banco de dados herda a qualidade de suas entradas. Os rótulos precisam ser registrados corretamente na importação.
Exercícios
- EX025 — Saída do laboratório. O que a consulta de domínios retornou? Rubrica: 3 = files.example CLEAR e portal-login.example GREEN; 2 = um; 1 = só a contagem; 0 = nenhuma.
- EX026 — Por que guardar o TLP. Por que manter o rótulo TLP em cada linha? Rubrica: 3 = filtrar por consulta os dados compartilháveis antes da liberação; 2 = parcial; 1 = decoração; 0 = nenhuma.
- EX027 — Tratamento dos desatualizados. O que deve acontecer com os dois indicadores desatualizados? Rubrica: 3 = revisar com os responsáveis; expirar, não apagar em silêncio; 2 = apagar; 1 = manter para sempre; 0 = nenhuma.
Síntese
Modele os indicadores com rótulos e datas, consulte com segurança, envelheça os indicadores e mantenha o histórico.
Continue estudando — capítulo 09 de 40
← Capítulo 08 (rascunho) · Índice de capítulos do curso · Capítulo 10 (rascunho) →