Capítulo 29 — Segurança da informação: medição
Mapa da aula
Aula 29 publicada. Mapa, exemplo, EX085.
flowchart TD
N0["29.1 Medindo a adivinhação de senhas"]
N1["29.2 O laboratório dos logins"]
N2["Laboratório — Detectando rajadas de adivinhação de s"]
N3["29.3 Por que a taxa supera o total"]
N4["29.4 Relatando"]
N0 --> N1 --> N2 --> N3 --> N4
N4 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX085"]
Desenho lógico
flowchart LR
N0["29.1 Medindo a adivinhação de senhas"]
N1["29.2 O laboratório dos logins"]
N2["Laboratório — Detectando rajadas de adivinhação de s"]
N3["29.3 Por que a taxa supera o total"]
N4["29.4 Relatando"]
N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX085"]
[29.1 Medindo a adivinhação de senhas]
|
v
[29.2 O laboratório dos logins]
|
v
[Laboratório — Detectando rajadas de adivinhação de s]
|
v
[29.3 Por que a taxa supera o total]
|
v
[29.4 Relatando]
|
v
[Exemplo resolvido] --> [Exercício EX085]
Objetivos de aprendizagem
Você vai (1) projetar uma medida de detecção; (2) distinguir padrões de ataque de ruído benigno; (3) relatar os resultados de detecção com honestidade.
29.1 Medindo a adivinhação de senhas
A Saltmarsh quer saber com que frequência as contas enfrentam adivinhação de senhas. Lindiwe define uma medida: uma conta é sinalizada se tiver dez ou mais falhas de login em qualquer janela de cinco minutos. Os erros comuns de digitação produzem algumas falhas espalhadas ao longo do dia, enquanto a adivinhação produz muitas em rápida sucessão. Ela escolhe a janela e o limiar antes de olhar os dados e os registra para que os resultados futuros possam ser comparados com a mesma definição. O líder de segurança aprova a definição antes que Lindiwe a execute sobre quaisquer dados.
29.2 O laboratório dos logins
O laboratório monta um dia sintético de 1.672 falhas de login em 863 contas. Três contas são sinalizadas: u17, u402 e u977, com 40, 42 e 40 falhas, respectivamente, todas em rajadas curtas. A conta com mais falhas no total, u1200, tem 61, mas elas estão espalhadas a cada poucos minutos ao longo do dia, então ela não é sinalizada. Lindiwe investiga e descobre um cliente de sincronização quebrado que tenta de novo com uma senha antiga. Ela registra a explicação ao lado da conta no relatório, para que ninguém confunda as falhas do cliente com um ataque. A central de atendimento confirma que a usuária tinha trocado a senha na semana anterior.
Laboratório — Detectando rajadas de adivinhação de senhas num log sintético de autenticação
"""Detect password-guessing bursts in a synthetic authentication log (stdlib only)."""
import random
from collections import defaultdict
random.seed(5)
events = []
for u in range(1500): # ordinary mistyping
for _ in range(random.choice([0, 0, 0, 1, 1, 2, 3])):
events.append((f"u{u}", random.uniform(0, 86400)))
for u in ["u17", "u402", "u977"]: # guessing bursts
start = random.uniform(0, 80000)
events += [(u, start + random.uniform(0, 240)) for _ in range(40)]
for u in ["u1200"]: # a broken sync client retrying slowly
events += [(u, k * 400.0) for k in range(60)]
by = defaultdict(list)
for u, t in events: by[u].append(t)
flag = []
for u, ts in by.items():
ts.sort()
if any(ts[j + 9] - ts[j] <= 300 for j in range(len(ts) - 9)):
flag.append(u)
total = sorted(by, key=lambda u: -len(by[u]))[:4]
print(f"failed logins {len(events)}; accounts with failures {len(by)}")
print(f"flagged (10 failures within 5 min): {sorted(flag)}")
print(f"top accounts by total failures: {[(u, len(by[u])) for u in total]}")
Execute com python3 lab_logins.py. Saída verificada:
failed logins 1672; accounts with failures 863
flagged (10 failures within 5 min): ['u17', 'u402', 'u977']
top accounts by total failures: [('u1200', 61), ('u402', 42), ('u17', 40), ('u977', 40)]
29.3 Por que a taxa supera o total
Ordenar as contas pelo total de falhas teria posto o cliente quebrado em primeiro lugar e o misturado com a adivinhação real. A medida por janela separa a adivinhação rápida das novas tentativas lentas. Lindiwe observa que os atacantes também podem adivinhar devagar para evitar a detecção, então a medida pega os ataques ruidosos, mas não os pacientes. Ela acrescenta um segundo indicador, mais fraco: contas com falhas vindas de muitos endereços diferentes num dia. O Prof. Hale valoriza que ela declare o que a medida não consegue ver. Ela documenta os dois indicadores juntos numa breve nota.
29.4 Relatando
Lindiwe relata as três contas sinalizadas à equipe de segurança, que redefine suas senhas e confirma que a autenticação multifator está ativada. Ela também relata o cliente quebrado à central de atendimento, que o corrige. Seu relatório mensal mostra o número de contas sinalizadas, a definição usada e seu ponto cego conhecido. Ela aprende que uma medida só é útil quando sua definição e seus limites acompanham o número. O líder de segurança distribui o relatório aos gerentes de TI todo mês, e a definição é acrescentada ao manual de métricas de segurança.
Exemplo resolvido
Lindiwe sinaliza três contas com rajadas de 40 a 42 falhas entre 1.672 falhas de login, separa um cliente que tenta de novo devagar com 61 falhas e relata a medida com seu ponto cego.
Caso sintético. Os logs são sintéticos; as saídas vêm de lab_logins.py.
Erros e limites
Ordenar pelo total de falhas confunde clientes quebrados com ataques.
Exercícios
-
EX085 — Contas sinalizadas. Que contas são sinalizadas? Rubrica: 3 = u17, u402 e u977;; 2 = parcialmente correto;; 1 = errado;; 0 = nenhuma.
-
EX086 — Conta do topo. Por que u1200 não é sinalizada? Rubrica: 3 = falhas espalhadas ao longo do dia;; 2 = parcialmente correto;; 1 = vago;; 0 = nenhuma.
-
EX087 — Ponto cego. O que a medida por janela deixa passar? Rubrica: 3 = a adivinhação lenta e paciente;; 2 = parcialmente correto;; 1 = vago;; 0 = nenhuma.
Continue estudando — aula 29 (capítulo 29 de 50)
← Capítulo 28 · Índice das aulas · Capítulo 30 →
Continue para a próxima aula já escrita.