OpenCyber Academy
Engenharia · Capítulo 13 · Português
Código do curso: OCA-122Capítulo 13: OCA-122-C013

Capítulo 13 — Sistemas 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.

Mapa da aula

Aula 13 publicada. Mapa, exemplo, EX037.

flowchart TD
  N0["13.1 Classificar dados"]
  N1["13.2 Consultas parametrizadas"]
  N2["Laboratório — Consulta concatenada versus parametriz"]
  N3["13.3 Retenção e minimização"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX037"]

Desenho lógico

flowchart LR
  N0["13.1 Classificar dados"]
  N1["13.2 Consultas parametrizadas"]
  N2["Laboratório — Consulta concatenada versus parametriz"]
  N3["13.3 Retenção e minimização"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX037"]
[13.1 Classificar dados]
    |
    v
[13.2 Consultas parametrizadas]
    |
    v
[Laboratório — Consulta concatenada versus parametriz]
    |
    v
[13.3 Retenção e minimização]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX037]

Objetivos de aprendizagem

Você vai (1) classificar os dados de uma organização de transporte; (2) prevenir injeção com consultas parametrizadas; (3) projetar a retenção e a minimização de dados.

13.1 Classificar dados

A Corvia guarda vários tipos de dados: identificadores de cartões e históricos de viagem, tokens de pagamento, registros de funcionários, dados de horários e telemetria dos veículos. Sofia ajuda a classificá-los. Os históricos de viagem são dados pessoais que revelam onde as pessoas moram e trabalham; os tokens de pagamento são dados financeiros sensíveis; os horários são públicos. A classificação orienta a arquitetura: dados pessoais e de pagamento precisam de criptografia, controles de acesso e logging, enquanto dados públicos precisam de integridade, mas não de confidencialidade. Daniel ressalta que a classificação precisa ser feita antes do projeto, porque adaptar a proteção a um banco cheio de dados misturados é caro e muitas vezes incompleto.

13.2 Consultas parametrizadas

Sofia escreve uma consulta para buscar viagens pelo identificador do cartão. Sua primeira versão monta a string SQL concatenando a entrada do usuário. Daniel lhe mostra que uma entrada como uma aspa seguida de OR 1=1 muda o sentido da consulta e devolve todas as viagens, um ataque de injeção. A correção é uma consulta parametrizada, em que o driver do banco passa a entrada como dado, nunca como código. O laboratório abaixo demonstra as duas com o módulo sqlite3 embutido no Python, sobre uma tabela sintética. A consulta concatenada vaza todas as linhas; a parametrizada não devolve nenhuma para a entrada maliciosa.

Laboratório — Consulta concatenada versus parametrizada

# Injection vs parameterised query with stdlib sqlite3 on a synthetic table.
import sqlite3
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE journeys (card TEXT, stop TEXT)")
db.executemany("INSERT INTO journeys VALUES (?, ?)", [("C100", "Harbour"), ("C100", "Market"), ("C200", "Depot"), ("C300", "Airport")])
evil = "X' OR '1'='1"
rows_bad = db.execute(f"SELECT * FROM journeys WHERE card = '{evil}'").fetchall()   # never do this
rows_ok = db.execute("SELECT * FROM journeys WHERE card = ?", (evil,)).fetchall()
print("concatenated query rows:", len(rows_bad))
print("parameterised query rows:", len(rows_ok))
print("legit lookup C100:", len(db.execute("SELECT * FROM journeys WHERE card = ?", ("C100",)).fetchall()))

Execute com python3 lab_sqli.py. Saída verificada:

concatenated query rows: 4
parameterised query rows: 0
legit lookup C100: 2

13.3 Retenção e minimização

Guardar dados para sempre aumenta o dano de qualquer vazamento. Sofia propõe um desenho de retenção: históricos de viagem detalhados mantidos por noventa dias para atendimento ao cliente e investigação de fraudes, e depois agregados em contagens anônimas para o planejamento. Os tokens de pagamento são mantidos só pelo tempo que o provedor de pagamentos exige. A ISO/IEC 27002:2022 inclui controles sobre exclusão de informações e mascaramento de dados. Ela documenta cada prazo de retenção com sua finalidade. A minimização é um controle de arquitetura: dados que não são armazenados não podem ser roubados, e um conjunto de dados menor é mais fácil de proteger bem.

Exemplo resolvido

Sofia classifica cinco tipos de dados da Corvia, demonstra a injeção e sua correção no sqlite3 e propõe um desenho de retenção de noventa dias para os históricos de viagem.

Caso sintético. Os dados, as tabelas e os prazos de retenção são sintéticos; a ISO/IEC 27002:2022 é real.

Erros e limites

A agregação ainda pode permitir a reidentificação em grupos pequenos. As regras de retenção dependem da lei e precisam ser conferidas com o jurídico.

Exercícios

Síntese

A arquitetura de dados classifica antes de projetar, mantém a entrada como dado e armazena apenas o necessário pelo tempo necessário.

Respostas comentadas

EX037. Porque revelam os padrões de moradia, trabalho e deslocamento das pessoas.

EX038. A consulta concatenada devolveu as 4 linhas, enquanto a consulta parametrizada devolveu 0.

EX039. Porque dados que nunca são guardados não podem vazar, e menos dados são mais fáceis de proteger adequadamente.