◇ OpenCyber Academy
Engenharia · Capítulo 30 · Português

Capítulo 30 — Laboratório de verificação I

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 30 — Laboratório de verificação I

Mapa da aula

Aula 30 publicada. Mapa, exemplo, EX088.

flowchart TD
  N0["30.1 Plano"]
  N1["30.2 Execução"]
  N2["30.3 Relatório"]
  N3["Nota prática"]
  N4["30.1b Dados de teste de referência e inventário"]
  N5["Nota de campo — verde independente"]
  N6["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
  N6 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX088"]

Desenho lógico

flowchart LR
  N0["30.1 Plano"]
  N1["30.2 Execução"]
  N2["30.3 Relatório"]
  N3["Nota prática"]
  N4["30.1b Dados de teste de referência e inventário"]
  N5["Nota de campo — verde independente"]
  N6["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX088"]
[30.1 Plano]
    |
    v
[30.2 Execução]
    |
    v
[30.3 Relatório]
    |
    v
[Nota prática]
    |
    v
[30.1b Dados de teste de referência e inventário]
    |
    v
[Nota de campo — verde independente]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX088]

Objetivos de aprendizagem

Você vai (1) executar um plano de verificação contra o monitor e o zoneamento da ABP; (2) registrar aprovação/reprovação com os hashes das evidências; (3) parar o laboratório se um teste de segurança física falhar.

30.1 Plano

Testes: permitir as leituras no escopo; negar códigos de função ruins; negar escritas fora da faixa; falha fechada com política ausente; alcançabilidade do SIS a partir do L4 é falsa; tempo de ciclo dentro do orçamento com o tap. Cada linha: id, preparação, ação, esperado, caminho da evidência.

Na ABP, cada linha do plano nomeia o requisito que confere, como o S-1 para a linha da política ausente e o R-12 para a linha da alcançabilidade. A linha do tempo de ciclo usa a cópia de bancada do tronco até o PLC-A com o tap instalado, conferindo se o tempo fica bem abaixo da parada em 50 ms. As linhas são escritas antes de o laboratório rodar.

30.2 Execução

Use apenas hosts sintéticos e bancadas. Capture o stdout e os hashes de configuração. Qualquer falha de segurança física (falha aberta ou SIS alcançável) para o laboratório e abre um bloqueio — nada de continuar para juntar dados.

# Lab 23 - reachability count on a synthetic Purdue-layered OT network
# Nodes: L5-ERP, L4-Office, L3.5-DMZ, L3-Hist, L2-SCADA, L1-PLC, L1-SIS, L0-IO
edges_flat=[("L5","L4"),("L4","L3"),("L3","L2"),("L2","L1-PLC"),("L2","L1-SIS"),("L1-PLC","L0"),("L1-SIS","L0"),("L4","L2")]
edges_zoned=[("L5","L4"),("L4","L3.5"),("L3.5","L3"),("L3","L2"),("L2","L1-PLC"),("L1-SIS","L0"),("L1-PLC","L0")]  # SIS not reachable from SCADA
def reach(edges, start):
    g={};
    for a,b in edges: g.setdefault(a,[]).append(b)
    seen=set(); stack=[start]
    while stack:
        n=stack.pop()
        if n in seen: continue
        seen.add(n); stack.extend(g.get(n,[]))
    return seen
for name,e in (("flat",edges_flat),("zoned",edges_zoned)):
    r=reach(e,"L4")
    print(f"{name}: L4 reaches {sorted(r)} count={len(r)} writes_to_SIS={'L1-SIS' in r}")

Saída esperada:

flat: L4 reaches ['L0', 'L1-PLC', 'L1-SIS', 'L2', 'L3', 'L4'] count=6 writes_to_SIS=True
zoned: L4 reaches ['L0', 'L1-PLC', 'L2', 'L3', 'L3.5', 'L4'] count=6 writes_to_SIS=False

O laboratório de Lena na ABP roda no ambiente de bancada, com hosts e dados de teste sintéticos. Quando a linha da política ausente reprovou uma vez, o laboratório parou e um bloqueio foi aberto contra o S-1; nenhuma outra linha rodou até a correção, porque continuar teria produzido resultados sobre um monitor já sabidamente inseguro.

30.3 Relatório

Relatório de laboratório de uma página: versões do ambiente, tabela de resultados, bloqueios abertos, assinatura. Anexe os hashes.

Caso sintético — Ashford Batch Plant. O Laboratório I reprovou uma vez na linha da política ausente; a versão foi suspensa até que o S-1 fosse corrigido.

O relatório de Lena de cada execução do Laboratório I lista as versões das ferramentas, o hash do conjunto de dados de teste, o resultado de cada linha e eventuais bloqueios abertos, e é assinado pelo executor independente. Os hashes dos logs e das exportações são anexados, para que um revisor possa confirmar que a evidência confere com o que foi executado. Um relatório sem hashes não é evidência.

30.4 Erros e limites

Laboratórios em bancadas compartilhadas colidem; reserve o ambiente sintético.

Lena reserva o ambiente de bancada da ABP para cada execução de laboratório no calendário compartilhado, com a versão sob teste na reserva. Duas equipes uma vez rodaram builds diferentes na mesma bancada em horários sobrepostos, e os seus logs ficaram impossíveis de separar. Desde então, uma execução sem reserva não conta como evidência de versão, e a bancada é restaurada para um estado conhecido antes de cada execução reservada. Reservar leva minutos.

Nota prática

O Laboratório I de uma mudança no monitor ou na lista de permissões é executado por alguém que não a implementou. A aprovação registrada precisa de um checklist verde independente.

30.1b Dados de teste de referência e inventário

Mantenha um diretório lacrado de dados de teste sintéticos com decisões esperadas conhecidas. Uma execução na bancada só conta como evidência de versão do monitor quando os seus dados de teste conferem por hash com o conjunto lacrado. Fotografe ou exporte o inventário do ambiente de laboratório para o relatório. "Passou na minha máquina" sem inventário não é evidência transferível.

As mudanças nos dados de teste são revisadas como código: uma nova decisão esperada precisa nomear o requisito de onde vem. Os logs dos resultados do laboratório são evidência; guarde-os com a tag da versão.

O conjunto de dados de teste de Lena é lacrado e tem hash.

Nota de campo — verde independente

O implementador de uma correção urgente se ofereceu para rodar o Laboratório I para ganhar tempo. O revisor recusou, rodou pessoalmente as linhas de segurança física e encontrou um caminho que ainda permitia (ALLOW) quando o arquivo de política era um diretório, e não um arquivo. Executores independentes pegam os pressupostos que os autores deixam de ver.

30.5 Exemplo resolvido — lendo um resultado de laboratório com honestidade (ABP sintética)

O Laboratório I reproduz um dia gravado de tráfego da ABP mais 40 tentativas de escrita injetadas, passando pela função permit e pela lógica de alarmes. Resultados: 40 de 40 escritas injetadas bloqueadas; 2 escritas legítimas de engenharia bloqueadas porque a estação de engenharia faltava na lista de permissões durante o comissionamento; 0 alarmes suprimidos. Lena relata os dois bloqueios falsos como um defeito de projeto, não como ruído — numa planta em operação, eles teriam impedido uma mudança de receita programada — e acrescenta um conjunto de vetores para o modo de comissionamento. O relatório do laboratório declara o que não foi testado: desempenho sob carga, enlaces seriais e o SIS-B, que está fora do escopo por projeto.

Exercícios

Síntese

Verifique a segurança física primeiro; pare na falha aberta ou na exposição do SIS; calcule o hash de tudo.

Continue estudando — capítulo 30 de 50

← Capítulo 29 · Índice de capítulos do curso · Capítulo 31 →

Siga para a próxima lição escrita.