OpenCyber Academy
Técnico · Capítulo 7 · Português
Código do curso: OCA-069Capítulo 07: OCA-069-C007

Capítulo 7 — Infraestrutura crítica e segurança setorial: dados e telemetria

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 07 publicada. Mapa, exemplo, EX025.

flowchart TD
  N0["7.1 Fontes e pontos cegos"]
  N1["7.2 Estrutura do syslog"]
  N2["7.3 Tempo"]
  N3["7.5 Atividade prática"]
  N4["Síntese do capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX025"]

Desenho lógico

flowchart LR
  N0["7.1 Fontes e pontos cegos"]
  N1["7.2 Estrutura do syslog"]
  N2["7.3 Tempo"]
  N3["7.5 Atividade prática"]
  N4["Síntese do capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX025"]
[7.1 Fontes e pontos cegos]
    |
    v
[7.2 Estrutura do syslog]
    |
    v
[7.3 Tempo]
    |
    v
[7.5 Atividade prática]
    |
    v
[Síntese do capítulo]
    |
    v
[Exemplo resolvido] --> [Exercício EX025]

Objetivos de aprendizagem e conexão

Ao final deste capítulo, você deverá ser capaz de:

O Capítulo 6 disse onde as coisas estão. Este capítulo trata do que elas lhe dizem, e de se você consegue pôr as histórias delas na ordem certa.

7.1 Fontes e pontos cegos

Tabela da aula; deslize para ver todas as colunas →

Fonte Mostra Não mostra
Dados do processo (historiador) Valores e alarmes ao longo do tempo Quem causou uma mudança
Logs de eventos da IHM e do SCADA Ações do operador, reconhecimentos de alarmes Ações feitas diretamente no controlador
Logs do controlador/RTU Sessões de configuração, mudanças de modo (se suportados e habilitados) Muitas vezes nada; muitos dispositivos registram pouco
Logs de firewall Conexões permitidas e bloqueadas na fronteira Tráfego dentro de uma zona
Logs de hosts (host de salto, servidores) Logins, comandos, eventos de serviço Atividade em dispositivos sem registro
Captura passiva / registros de fluxo Quem conversou com quem, com que função Conteúdo criptografado; tráfego que não passa pelo sensor

O guia de gestão de logs do NIST descreve a coleta, a retenção e a proteção desses registros (SP 800-92). A primeira tarefa do técnico é saber qual fonte responde a qual pergunta, e a quais perguntas nenhuma fonte responde.

7.2 Estrutura do syslog

A RFC 5424 define o formato moderno do syslog: <PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID STRUCTURED-DATA MSG (RFC 5424). O valor de prioridade é facility × 8 + severidade: <38> é a facility 4 (segurança/autorização), severidade 6 (informativa). O timestamp é RFC 3339 com deslocamento, e um traço (-) significa "nulo" — para um timestamp, o remetente não sabia a hora. Muitos dispositivos ainda enviam o formato BSD mais antigo (<13>Oct 11 23:15:02 host app: ...), sem ano e sem fuso; conte essas linhas e analise-as separadamente, em vez de descartá-las.

7.3 Tempo

Toda linha do tempo só é tão boa quanto os seus relógios. O NTP (RFC 5905) permite que os hosts meçam o seu deslocamento em relação a uma referência (RFC 5905). Em ambientes de controle, alguns dispositivos não têm cliente NTP, derivam minutos ou são deliberadamente isolados das fontes de tempo. Registre, para todo host que contribui para uma linha do tempo, o seu deslocamento medido num momento conhecido, e corrija os seus timestamps subtraindo-o: corrigido = informado − (relógio do host − referência). Converta tudo para UTC antes de ordenar; deslocamentos locais como +01:00 estão corretos, mas é fácil ordená-los errado a olho.

7.4 Exemplo resolvido: a sequência das 23:14 (sintético)

Na noite de 11 de outubro, um operador relatou que a bomba 2 da KW-04 ligou inesperadamente. Você coletou seis linhas e mediu os deslocamentos dos relógios na manhã seguinte (a RTU estava 212 s atrás da referência).

Laboratório 7 (salve como lab07.py e execute com python3 lab07.py):

# Lab 7 - parse RFC 5424 syslog, correct clock offsets and build a UTC timeline (offline, stdlib)
# Synthetic lines from the Kestrel Vale operations centre; offsets measured against the NTP reference.
import re
from datetime import datetime, timedelta, timezone
lines = [
 "<38>1 2026-10-11T23:14:05.120Z fw-01 filterlog - - - block tcp 10.30.3.7:51544 -> 10.10.4.2:502",
 "<86>1 2026-10-12T00:13:58+01:00 jump-01 sshd 812 - - Accepted publickey for jtan from 10.90.0.40",
 "<134>1 2026-10-11T23:16:40Z hmi-02 hmi - - - operator setpoint change KW-04 PUMP2 start",
 "<38>1 2026-10-11T23:15:31Z rtu-kw04 auth - - - config session opened user=eng",
 "<13>Oct 11 23:15:02 eng-ws-15 app: project download started",
 "<38>1 - hist-02 histd - - - archive rollover",
]
offset_s = {"fw-01": 0.0, "jump-01": 0.4, "hmi-02": 0.0, "rtu-kw04": -212.0}   # host clock minus reference
pat = re.compile(r"^<(\d{1,3})>1 (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) ?(.*)$")
events, unparsed = [], []
for ln in lines:
    m = pat.match(ln)
    if not m: unparsed.append(("not RFC 5424", ln)); continue
    pri, ts, host, app, _pid, _msgid, _sd, msg = m.groups()
    if ts == "-": unparsed.append(("no timestamp", ln)); continue
    t = datetime.fromisoformat(ts.replace("Z", "+00:00")).astimezone(timezone.utc)
    t_corr = t - timedelta(seconds=offset_s.get(host, 0.0))
    fac, sev = divmod(int(pri), 8)
    events.append((t_corr, host, f"fac={fac} sev={sev}", msg, offset_s.get(host, 0.0)))
for t, host, fs, msg, off in sorted(events):
    note = f" (clock corrected {-off:+.1f} s)" if off else ""
    print(f"{t.strftime('%H:%M:%S.%f')[:-3]}Z {host:<9} {fs:<11} {msg}{note}")
for why, ln in unparsed: print("UNPARSED", why, "|", ln)

Saída esperada (Python 3.13.5):

23:13:57.600Z jump-01   fac=10 sev=6 Accepted publickey for jtan from 10.90.0.40 (clock corrected -0.4 s)
23:14:05.120Z fw-01     fac=4 sev=6 block tcp 10.30.3.7:51544 -> 10.10.4.2:502
23:16:40.000Z hmi-02    fac=16 sev=6 operator setpoint change KW-04 PUMP2 start
23:19:03.000Z rtu-kw04  fac=4 sev=6 config session opened user=eng (clock corrected +212.0 s)
UNPARSED not RFC 5424 | <13>Oct 11 23:15:02 eng-ws-15 app: project download started
UNPARSED no timestamp | <38>1 - hist-02 histd - - - archive rollover

Antes da correção, a linha da RTU (23:15:31Z) aparecia antes da mudança de setpoint na IHM (23:16:40Z), sugerindo que alguém configurou a RTU e depois o operador agiu. Depois da correção, a sessão da RTU aconteceu às 23:19:03Z — depois do comando de partida do operador. A história muda de "alguém adulterou primeiro" para "uma sessão de engenharia se seguiu à ação do operador", o que leva a uma pergunta diferente (quem abriu uma sessão de configuração às 23:19, e por quê). Duas linhas não puderam ser posicionadas: a linha em formato BSD da estação de engenharia não tem ano nem fuso, e a linha do historiador tem timestamp nulo. Elas são relatadas, não descartadas; o "project download started" da estação de engenharia é potencialmente a linha mais importante de todas, e posicioná-lo exige uma verificação própria do relógio e os logs locais da estação.

7.5 Atividade prática

Meça o deslocamento de uma máquina sua frente a um servidor NTP público ou local (por exemplo, chronyc tracking ou ntpq -p no Linux, w32tm /stripchart no Windows), registre-o com o horário da medição e repita depois de 24 horas para ver a deriva.

Registre o host, a referência, o deslocamento e o horário da medição. Depois de vinte e quatro horas, compare o novo deslocamento com o antigo para ver a deriva. Guarde as duas leituras com o trabalho de linha do tempo do Laboratório 7, para que uma investigação posterior saiba quão incerta seria uma correção feita a partir de uma única medição.

7.6 Erros comuns e limites

Exercícios — capítulo 7

EX025 — Decodifique prioridades. Objetivo: calcular facility e severidade. Insumos: <86>, <134>, <11>, <165>. Passos: calcular cada uma. Evidência esperada: quatro pares com nomes. Rubrica: 3 = 86 → 10/6 (authpriv, informativa); 134 → 16/6 (local0, informativa); 11 → 1/3 (user, erro); 165 → 20/5 (local4, aviso); 2 = aritmética certa, faltam os nomes; 1 = parcial; 0 = nada.

EX026 — Corrija um relógio. Objetivo: aplicar a fórmula do deslocamento. Insumos: o fep-01 registra um evento às 02:10:00Z; o seu deslocamento, medido uma hora depois, era de +47 s (host adiantado). Passos: dar o horário corrigido e a incerteza que você declararia. Evidência esperada: horário corrigido e uma frase sobre a incerteza. Rubrica: 3 = 02:09:13Z; incerteza porque o deslocamento foi medido depois e a deriva é desconhecida, por exemplo "± alguns segundos; deslocamento medido às 03:10Z"; 2 = horário certo, sem incerteza; 1 = direção errada; 0 = nada.

EX027 — Posicione a linha BSD. Objetivo: tratar formatos legados com segurança. Insumos: a linha da eng-ws-15 no Laboratório 7. Passos: listar o que você precisa para posicioná-la na linha do tempo e escrever a regra de análise que acrescentaria. Evidência esperada: lista e regra. Rubrica: 3 = o ano a partir do contexto da coleta, a configuração de fuso do host e o seu deslocamento medido; analisar com atribuição explícita de fuso e marcar o resultado como "fuso presumido"; 2 = regra sem os pressupostos registrados; 1 = descartá-la; 0 = nada.

EX028 — Pergunta de ponto cego. Objetivo: associar perguntas a fontes. Insumos: "Alguém escreveu na KW-04 diretamente pela porta de notebook local da estação?" Passos: dizer quais fontes poderiam respondê-la, quais não podem e o que você precisaria acrescentar. Evidência esperada: análise curta. Rubrica: 3 = o firewall e a captura do centro de controle não veem o tráfego local da estação; os logs da RTU poderiam ver, se ela registrar configurações e escritas; acrescentar um sensor no nível da estação ou o registro na RTU e os registros de acesso físico; 2 = em parte; 1 = "verificar o firewall"; 0 = nada.

Síntese do capítulo

A telemetria é um conjunto de testemunhas parciais. Saiba o que cada fonte consegue ver, analise os formatos com rigor, contando o que não consegue analisar, e corrija cada relógio frente a uma referência antes de ordenar os eventos. Uma linha do tempo construída sobre relógios não corrigidos pode inverter causa e efeito; uma construída sobre relógios corrigidos, com as suas incertezas declaradas, é evidência.

Respostas comentadas

EX025 — Decodifique prioridades. <86>: 86 = 10 × 8 + 6 → facility 10 (authpriv), severidade 6 (informativa). <134>: 16 × 8 + 6 → local0, informativa. <11>: 1 × 8 + 3 → user, erro. <165>: 20 × 8 + 5 → local4, aviso (notice).

EX026 — Corrija um relógio. Um deslocamento de +47 s significa que o host está adiantado; corrigido = 02:10:00 − 47 s = 02:09:13Z. Declare a incerteza: "deslocamento medido por volta das 03:10Z; deriva ao longo da hora desconhecida; tratar como ±5 s, a menos que haja dados de deriva".

EX027 — Posicione a linha BSD. Necessário: o ano (a partir do contexto da coleta — a data da exportação), o fuso horário configurado na estação e o seu deslocamento medido. Regra: as linhas que casam com ^<\d+>[A-Z][a-z]{2} [ \d]\d \d\d:\d\d:\d\d são analisadas com ano e fuso explícitos, tirados de uma tabela por host, e o evento é marcado assumed_zone=true na linha do tempo. Se o fuso ou o deslocamento do host forem desconhecidos, ponha-o numa lista separada de "não posicionados", em vez de adivinhar.

EX028 — Pergunta de ponto cego. Os logs do firewall do centro de controle e o sensor da Z2 não conseguem ver o tráfego entre um notebook e a RTU no switch local ou na porta serial da estação. Os próprios logs da RTU poderiam ver, se ela registrar sessões de configuração e escritas e se o registro estiver habilitado. Acrescentar: registro de eventos da RTU encaminhado quando o enlace estiver ativo, um sensor passivo no nível da estação onde se justificar e registros de acesso físico (alarmes de porta, livro de visitas ao local).