Capítulo 7 — Privacidade e proteção de dados: dados e telemetria
Mapa da aula
Aula 07 publicada. Mapa, exemplo, EX025.
flowchart TD
N0["7.1 Telemetria por toda parte"]
N1["7.2 O laboratório dos logs"]
N2["7.3 Corrigir na origem"]
N3["7.4 Retenção dos logs"]
N4["Laboratório — Dados pessoais nos logs do servidor de"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX025"]
Desenho lógico
flowchart LR
N0["7.1 Telemetria por toda parte"]
N1["7.2 O laboratório dos logs"]
N2["7.3 Corrigir na origem"]
N3["7.4 Retenção dos logs"]
N4["Laboratório — Dados pessoais nos logs do servidor de"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX025"]
[7.1 Telemetria por toda parte]
|
v
[7.2 O laboratório dos logs]
|
v
[7.3 Corrigir na origem]
|
v
[7.4 Retenção dos logs]
|
v
[Laboratório — Dados pessoais nos logs do servidor de]
|
v
[Exemplo resolvido] --> [Exercício EX025]
Objetivos de aprendizagem
Você vai (1) encontrar dados pessoais em logs e telemetria; (2) mascará-los com segurança; (3) definir a retenção dos logs.
7.1 Telemetria por toda parte
Os sistemas da Marlow produzem logs, relatórios de erro e estatísticas de uso. O servidor de agendamento registra cada requisição, o gateway de SMS registra os resultados de entrega e o site envia dados de desempenho a um serviço de monitoramento. Leila aprende que a telemetria costuma ser desenhada pelos desenvolvedores para depuração, com pouca atenção à privacidade. Os logs são copiados para ferramentas de monitoramento, compartilhados com fornecedores em chamados de suporte e guardados por mais tempo do que os dados que descrevem. Uma linha de log com um e-mail pode, portanto, viajar mais longe do que o próprio registro de agendamento.
7.2 O laboratório dos logs
Leila analisa uma amostra sintética dos logs do servidor de agendamento. O laboratório mostra que 95 de 400 linhas, 23,8%, contêm dados pessoais: 75 trazem e-mails de pacientes e 20 trazem telefones de mensagens que falharam. Cada uma dessas linhas liga uma pessoa a uma consulta odontológica. Depois de uma etapa de mascaramento que troca os e-mails por um marcador e oculta os dígitos dos telefones, nenhuma linha com dados pessoais permanece. O número da reserva continua permitindo que a equipe de suporte rastreie um problema pelo sistema de gestão clínica, quando autorizada a fazê-lo.
7.3 Corrigir na origem
Mascarar depois é útil, mas Leila argumenta que a correção melhor é deixar de registrar dados pessoais nos logs. Ela pede ao desenvolvedor que registre os números das reservas em vez dos e-mails e apenas os três últimos dígitos dos telefones nas mensagens que falharam. O desenvolvedor concorda e muda as chamadas de log na versão seguinte. Leila repete a análise com tráfego sintético da nova versão e confirma que nenhuma linha nova contém e-mails ou telefones completos. Ela registra a mudança e o resultado do novo teste, para que a correção possa ser conferida de novo em cada versão futura.
7.4 Retenção dos logs
Por padrão, os logs ficam noventa dias no serviço de monitoramento, e os logs antigos do servidor de agendamento nunca tinham sido apagados. Leila propõe trinta dias para os logs detalhados, o que cobre a maior parte da solução de problemas, e doze meses para as estatísticas agregadas sem dados pessoais. Ela documenta a decisão com o encarregado, ligando-a à limitação da conservação do artigo 5(1)(e) do GDPR. O prestador de TI configura a exclusão automática, e Leila acrescenta uma verificação trimestral de que o arquivo de log mais antigo está dentro do limite. A primeira verificação passa.
Laboratório — Dados pessoais nos logs do servidor de agendamento
"""Find and mask personal data in synthetic booking-server log lines (stdlib only)."""
import random, re
random.seed(7)
names = ["ana", "ben", "chloe", "dev", "erin", "farid", "gita", "hugo"]
lines = []
for i in range(400):
kind = random.random()
if kind < 0.15:
lines.append(f"INFO booking created for {random.choice(names)}@example.org slot={i}")
elif kind < 0.22:
lines.append(f"WARN sms failed to +44 7700 900{random.randint(100,999)} ref={i}")
else:
lines.append(f"INFO booking created ref=B{i:05d} clinic={random.randint(1,8)}")
EMAIL = re.compile(r"[\w.]+@[\w.]+"); PHONE = re.compile(r"\+44 \d{4} \d{6}")
hit = [l for l in lines if EMAIL.search(l) or PHONE.search(l)]
masked = [PHONE.sub("+44 **** ******", EMAIL.sub("<email>", l)) for l in lines]
left = sum(1 for l in masked if EMAIL.search(l) or PHONE.search(l))
print(f"log lines {len(lines)}; with personal data {len(hit)} ({100*len(hit)/len(lines):.1f}%)")
print(f"emails {sum(1 for l in lines if EMAIL.search(l))}; phones {sum(1 for l in lines if PHONE.search(l))}; after masking {left}")
Execute com python3 lab_logs.py. Saída verificada:
log lines 400; with personal data 95 (23.8%)
emails 75; phones 20; after masking 0
Exemplo resolvido
Leila encontra dados pessoais em 95 de 400 linhas sintéticas de log (23,8%), mascara-os até zero, faz o desenvolvedor deixar de registrar e-mails e telefones completos e define a retenção de trinta dias para os logs.
Caso sintético. Os logs são sintéticos; o artigo 5(1)(e) do GDPR é real.
Erros e limites
As expressões regulares deixam passar formatos incomuns; revise amostras à mão também.
Exercícios
- EX025 — Parcela dos logs. Que parcela das linhas de log tinha dados pessoais? Rubrica: 3 = 95 de 400, 23,8%;; 2 = aproximada;; 1 = errada;; 0 = nenhuma.
- EX026 — Correção na origem. O que o desenvolvedor mudou? Rubrica: 3 = registrar números de reserva e dígitos parciais do telefone;; 2 = menciona números de reserva;; 1 = vago;; 0 = nenhuma.
- EX027 — Por que os logs viajam. Por que os logs se espalham mais que os registros? Rubrica: 3 = são copiados para o monitoramento e compartilhados em chamados de suporte;; 2 = menciona cópias;; 1 = vago;; 0 = nenhuma.
- EX028 — Retenção dos logs. Que retenção Leila propôs para os logs detalhados? Rubrica: 3 = trinta dias;; 2 = parcialmente correta;; 1 = noventa;; 0 = nenhuma.
Continue estudando — aula 07 (capítulo 07 de 18)
← Capítulo 06 · Índice das aulas · Capítulo 08 →
Continue para a próxima aula já escrita.