Capítulo 4 — Modelos de dados
Mapa da aula
Aula 04 publicada. Mapa, exemplo, EX007.
flowchart TD
N0["4.1 Um esquema de inventário"]
N1["4.2 Proveniência e atualidade"]
N2["4.3 Tempos de vida"]
N3["4.4 Caso resolvido"]
N4["4.5 Atividade prática"]
N5["4.7 Mantendo o modelo atualizado"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX007"]
Desenho lógico
flowchart LR
N0["4.1 Um esquema de inventário"]
N1["4.2 Proveniência e atualidade"]
N2["4.3 Tempos de vida"]
N3["4.4 Caso resolvido"]
N4["4.5 Atividade prática"]
N5["4.7 Mantendo o modelo atualizado"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX007"]
[4.1 Um esquema de inventário]
|
v
[4.2 Proveniência e atualidade]
|
v
[4.3 Tempos de vida]
|
v
[4.4 Caso resolvido]
|
v
[4.5 Atividade prática]
|
v
[4.7 Mantendo o modelo atualizado]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX007]
Objetivos de aprendizagem
Você vai (1) modelar serviços, endpoints, certificados e algoritmos como registros relacionados; (2) projetar um esquema de inventário com proveniência; (3) associar atributos de tempo de vida dos dados; e (4) consultar o modelo em busca de candidatos à migração.
4.1 Um esquema de inventário
Um esquema prático tem tabelas para service (nome, dono, nível), endpoint (host, porta, protocolo), crypto_use (endpoint, função, algoritmo, parâmetro, biblioteca, versão), observation (crypto_use, método, data e hora, observador) e data_class (nome, confidentiality_years) ligadas aos serviços. Separar a observação do uso permite registrar que o mesmo uso foi visto por um scanner na segunda-feira e confirmado na configuração na quarta-feira.
A KLS acrescenta duas colunas práticas: change_mechanism em crypto_use, com configuração, pacote, versão do fornecedor ou hardware, e controller em endpoint. Com elas, uma única consulta lista todas as trocas de chaves clássicas que a KLS pode corrigir por configuração neste mês.
4.2 Proveniência e atualidade
Toda linha precisa de um método (captura passiva, configuração, varredura de código, declaração do fornecedor) e de uma data e hora. As observações antigas são rebaixadas para "não verificadas" em vez de apagadas. Sem proveniência, um painel mistura fatos com palpites, e ninguém sabe quais são quais.
A KLS usa três graus: confirmado (dois métodos independentes concordam), observado (um método nos últimos 30 dias) e não verificado (mais antigo, ou uma única declaração do fornecedor). O painel de 71 % do Capítulo 9 deu errado em parte porque linhas da época do scanner, sem rótulo de método, foram contadas como atuais. O grau é calculado a partir da tabela de observações, nunca digitado à mão, para que não possa se afastar das evidências.
4.3 Tempos de vida
Associe confidentiality_years às classes de dados. Os registros de embarque da KLS precisam permanecer confidenciais por dez anos, por contrato; os dados de faturamento, sete; a telemetria, um. Uma consulta que cruza os tempos de vida com os algoritmos de troca de chaves produz automaticamente a lista de candidatos a colher agora, decifrar depois.
O texto do contrato vale mais do que as tabelas de retenção: os dados de faturamento da KLS são retidos por sete anos por razões fiscais, mas o contrato de um cliente de frete exige confidencialidade de dez anos para as tarifas, então as linhas de faturamento desse cliente herdam dez. Por isso, a coluna de tempo de vida fica na classe de dados e pode ser sobrescrita por cliente, e a consulta usa o maior tempo de vida entre as classes que um fluxo transporta.
4.4 Caso resolvido
import sqlite3
db = sqlite3.connect(":memory:")
db.executescript("""
CREATE TABLE use(service TEXT, function TEXT, algorithm TEXT, data_years INT);
INSERT INTO use VALUES ('api-gateway','kex','X25519MLKEM768',10),('partner-sftp','kex','ecdh-sha2-nistp256',10),
('billing-db','kex','ECDHE-P256',7),('telemetry','kex','ECDHE-P256',1);""")
rows = db.execute("SELECT service FROM use WHERE function='kex' AND algorithm NOT LIKE '%MLKEM%' AND data_years>=5").fetchall()
print("HNDL candidates:", [r[0] for r in rows])
A consulta devolve o SFTP dos parceiros e o banco de dados de faturamento; a telemetria fica de fora porque os seus dados têm vida curta, e o gateway já é híbrido.
A consulta codifica três decisões que vale a pena ler em voz alta. A condição function='kex' a limita à exposição a colher agora, decifrar depois, porque as assinaturas seguem outro calendário. O teste NOT LIKE '%MLKEM%' trata qualquer grupo híbrido como aceitável. O limite data_years>=5 é uma política da KLS, não uma norma; com três anos, o banco de dados de faturamento continuaria listado e a telemetria continuaria fora. Executada de novo após cada alimentação do inventário, a lista se torna uma fila de trabalho viva para a equipe de plataforma.
4.5 Atividade prática
Estenda o exemplo com uma tabela observation e uma consulta que liste os usos cuja observação mais recente tem mais de 90 dias.
Dê à tabela observation uma chave estrangeira para use, uma coluna method e uma data e hora observed_at guardada como texto ISO. Insira duas observações para o gateway, uma de 10 dias e outra de 200 dias, e uma observação de 120 dias para o SFTP dos parceiros. A consulta correta agrupa por uso e compara a data e hora máxima com o limite, de modo que o gateway é atual porque a sua linha mais recente é recente. Uma consulta que compara todas as linhas listaria o gateway por engano; inclua esse erro como teste negativo.
4.6 Erros comuns e limites
- Planilhas planas sem proveniência.
- Apagar dados antigos em vez de marcá-los.
- Tempos de vida copiados das tabelas de retenção sem conferir os contratos.
Na KLS, a planilha plana tinha uma coluna "algoritmo" com valores digitados por quatro pessoas; ninguém sabia dizer se o "ECDHE" do faturamento tinha vindo de uma varredura, de um arquivo de configuração ou da memória. Apagar as linhas antigas removeu por completo a telemetria das empilhadeiras, o que escondeu que ninguém conhecia a sua criptografia. E a primeira lista de tempos de vida copiou a retenção fiscal de sete anos para o faturamento, deixando de lado a cláusula contratual de dez anos. Cada erro torna a lista de migração mais curta do que deveria ser, o que parece progresso, mas não é.
4.7 Mantendo o modelo atualizado
Um modelo de inventário começa a envelhecer no momento em que é preenchido. Alimente-o automaticamente: exportações noturnas de configuração dos balanceadores de carga, listas de certificados do banco de dados da AC, manifestos de imagens do registro e resumos de handshakes tirados dos logs. Cada alimentação grava observações com o seu próprio rótulo de método, para que o modelo sempre mostre o que foi visto, como e quando. As linhas digitadas à mão devem ser a exceção e devem trazer o nome de quem as digitou. Quando duas fontes discordam — a configuração diz que o híbrido está habilitado, os logs não mostram nenhuma negociação híbrida —, registre as duas e abra uma tarefa; a discordância costuma ser o fato mais útil do modelo.
O acesso ao modelo também importa. Um mapa completo de quais serviços ainda usam troca de chaves clássica é útil para um atacante, então restrinja o acesso de escrita às alimentações e o de leitura às equipes que precisam dele, e publique apenas agregados fora do grupo de plataforma.
Exercícios
- EX007 — Esquema. Liste as colunas de uma tabela
observatione explique cada uma. Rubrica: 3 = referência ao uso, método, data e hora, observador, ponteiro para a evidência bruta. - EX008 — Consulta. Escreva um SQL que devolva os serviços com assinaturas clássicas em certificados válidos além de 2030. Rubrica: 3 = condições corretas sobre função, algoritmo e validade.
Síntese
Um inventário relacional com proveniência e tempos de vida transforma o planejamento da migração em consultas que podem ser executadas de novo sempre que o parque mudar.
Continue estudando — capítulo 04 de 30
← Capítulo 03 · Índice de capítulos do curso · Capítulo 05 →
Siga para a próxima lição escrita.