◇ OpenCyber Academy
Tecnólogo · Capítulo 4 · Português

Capítulo 4 — Modelos de dados

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

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

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

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.