◇ OpenCyber Academy
Técnico · Capítulo 18 · Português

Capítulo 18 — Projeto técnico supervisionado

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 18 — Projeto técnico supervisionado

Mapa da aula

Aula 18 publicada. Mapa, exemplo, EX071.

flowchart TD
  N0["18.1 Escolha de um projeto"]
  N1["18.2 Fases"]
  N2["18.3 Selagem de evidências"]
  N3["18.5 Rubrica de avaliação do projeto"]
  N4["18.6 Prática contínua"]
  N5["Síntese do capítulo"]
  N6["Capítulo 1: EX001–EX004"]
  N7["Capítulo 2: EX005–EX008"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
  N7 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX071"]

Desenho lógico

flowchart LR
  N0["18.1 Escolha de um projeto"]
  N1["18.2 Fases"]
  N2["18.3 Selagem de evidências"]
  N3["18.5 Rubrica de avaliação do projeto"]
  N4["18.6 Prática contínua"]
  N5["Síntese do capítulo"]
  N6["Capítulo 1: EX001–EX004"]
  N7["Capítulo 2: EX005–EX008"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX071"]
[18.1 Escolha de um projeto]
    |
    v
[18.2 Fases]
    |
    v
[18.3 Selagem de evidências]
    |
    v
[18.5 Rubrica de avaliação do projeto]
    |
    v
[18.6 Prática contínua]
    |
    v
[Síntese do capítulo]
    |
    v
[Capítulo 1: EX001–EX004]
    |
    v
[Capítulo 2: EX005–EX008]
    |
    v
[Exemplo resolvido] --> [Exercício EX071]

Objetivos de aprendizagem e conexão

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

Este capítulo encerra o curso. Ele usa tudo o que veio antes numa única tarefa realista, e o seu resultado é aquilo que um empregador ou avaliador pediria para ver: não uma alegação de competência, mas a evidência dela.

18.1 Escolha de um projeto

Um bom projeto supervisionado é estreito, valioso e verificável. Exemplos tirados deste livro: endurecer o conduto entre a rede corporativa e o centro de controle e verificá-lo (Capítulos 10–11); fechar o desvio pelo roteador da estação em todas as estações (Capítulo 13); implantar a detecção de desvio de configuração nos servidores do centro de controle (Capítulo 14); construir e testar o pipeline de detecção contra uma captura reproduzida e sanitizada (Capítulo 17). Todo projeto precisa de um supervisor (aqui, L. Ferreira) e de um autorizador que seja dono dos sistemas afetados (aqui, A. Mensah, pela Kestrel Water).

Combine o supervisor, o dono que assina o escopo e os critérios de sucesso antes do primeiro dia. Escolha um conduto ou uma classe de hosts, não o programa inteiro. Escreva os itens em aberto que você espera deixar, para que a honestidade sobre os limites seja planejada, e não improvisada na avaliação.

18.2 Fases

  1. Escopo (Capítulo 5): finalidade, sistemas, ações, janela, pessoas, condições de parada, tratamento das evidências — assinado.
  2. Linha de base: exportações de configuração e resumos antes de qualquer mudança (Capítulo 14); resultados atuais dos testes (Capítulo 11).
  3. Mudança: sob um registro de mudança com reversão (Capítulo 10).
  4. Verificação: testes positivos e negativos; cada requisito verificado, reprovado ou não testado.
  5. Registro de solução de problemas durante todo o trabalho, com os quatro rótulos (Capítulo 13).
  6. Passagem de responsabilidade: registro de como construído, instruções de trabalho, itens em aberto com responsáveis (Capítulo 16).
  7. Pacote de evidências: tudo o que está acima, selado.

Não pule os resumos da linha de base, mesmo quando a mudança parecer pequena; sem eles, você não consegue provar o que mudou. Mantenha o registro de solução de problemas aberto durante toda a janela, incluindo interrupções e começos em falso. O pacote de evidências vem por último, depois que os documentos de passagem de responsabilidade existirem para serem incluídos nele.

18.3 Selagem de evidências

Um manifesto lista cada artefato com o seu resumo SHA-256 (FIPS 180-4). O selo é o resumo do próprio manifesto. Registre o selo fora do pacote — no registro de mudança, num e-mail ao supervisor, no formulário de avaliação —, porque quem consegue editar o pacote também consegue editar um manifesto guardado dentro dele. Depois, recalcular os resumos dos artefatos mostra se algo mudou; recalcular o resumo do manifesto e compará-lo com o selo registrado externamente mostra se o manifesto foi alterado.

O que um selo prova: os artefatos são, byte a byte, o que eram quando foram selados. O que ele não prova: que eram verdadeiros, completos ou criados quando dizem ter sido. Isso depende de como foram coletados (Capítulo 5) e de registros independentes (logs do firewall no coletor, chamados de mudança no seu próprio sistema). Para garantias mais fortes, as organizações usam assinaturas com chaves mantidas por uma parte separada ou carimbo de tempo confiável; o princípio é o mesmo.

18.4 Exemplo resolvido: o projeto do conduto da KW-04 (sintético)

O projeto de R. Kaur removeu a regra corporativa ampla R4 do fw-01 (CHG-2215), verificou o resultado e investigou, no caminho, o evento da KW-09. O pacote de evidências é selado e, uma semana depois, verificado de novo.

Laboratório 18 (salve como lab18.py e execute com python3 lab18.py):

# Lab 18 - seal and re-verify a project evidence package (offline, standard library only)
# Synthetic artefacts from the supervised project; written only inside a temporary directory.
import hashlib, pathlib, tempfile
artefacts = {
 "01-scope.md": "Scope: KW-04 conduit hardening; authorized by A. Mensah (Kestrel Water) 2026-10-05.\n",
 "02-before-fw.txt": "R4 allow 10.30.0.0/16 10.20.0.0/24 tcp any\n",
 "03-after-fw.txt": "R4 removed CHG-2215\n",
 "04-tests.csv": "test,result\nT4,pass\nT5,pass\nT9,pass\n",
 "05-troubleshooting-log.md": "07:05Z KW-09 missing; H4 consistent; RTU config preserved as E-17.\n",
}
with tempfile.TemporaryDirectory() as tmp:
    d = pathlib.Path(tmp)
    for n, t in artefacts.items(): (d / n).write_text(t)
    lines = [f"{hashlib.sha256((d / n).read_bytes()).hexdigest()}  {n}" for n in sorted(artefacts)]
    (d / "MANIFEST.sha256").write_text("\n".join(lines) + "\n")
    seal = hashlib.sha256((d / "MANIFEST.sha256").read_bytes()).hexdigest()
    print("manifest:")
    for l in lines: print(" ", l[:16] + "...", l.split("  ")[1])
    print("seal (record this outside the package):", seal[:24])
    (d / "04-tests.csv").write_text("test,result\nT4,pass\nT5,pass\nT9,pass\nT10,pass\n")   # later edit
    for l in (d / "MANIFEST.sha256").read_text().splitlines():
        h, n = l.split("  ")
        ok = hashlib.sha256((d / n).read_bytes()).hexdigest() == h
        print(f"verify {n:<26} {'OK' if ok else 'MISMATCH'}")

Saída esperada (Python 3.13.5):

manifest:
  72d8be01e70067c7... 01-scope.md
  8d52d15a3e02b7f8... 02-before-fw.txt
  2cd59665641b4779... 03-after-fw.txt
  d6eccc2e2ac61ecb... 04-tests.csv
  6d2525605f11521c... 05-troubleshooting-log.md
seal (record this outside the package): 062b9a1fd700dd0eac04b3a8
verify 01-scope.md                OK
verify 02-before-fw.txt           OK
verify 03-after-fw.txt            OK
verify 04-tests.csv               MISMATCH
verify 05-troubleshooting-log.md  OK

Quatro artefatos são verificados; 04-tests.csv, não. Alguém acrescentou uma linha T10 depois da selagem. Pode ser um teste posterior legítimo — mas ele deve ser acrescentado como um artefato novo, datado separadamente e com entrada própria, e não pela edição de um arquivo selado. O avaliador pede a R. Kaur que restaure a versão selada a partir do arquivo (o seu resumo precisa coincidir com o manifesto) e que apresente o T10 como 06-tests-addendum.csv numa nova versão do pacote, selada de novo, com os dois selos registrados.

18.5 Rubrica de avaliação do projeto

Critério 3 (atinge o resultado técnico) 1
Escopo e autorização Escopo assinado, com dono, janela e condições de parada Aprovação verbal
Correção técnica A mudança atende aos requisitos; sem danos colaterais Parcial ou prejudicial
Verificação Todos os requisitos verificados ou explicitamente em aberto, testes positivos e negativos com evidências Apenas contagens de aprovação
Solução de problemas Hipóteses, previsões, eliminações, preservação Narrativa
Documentação Instruções de trabalho executáveis, registro de como construído, sem segredos Anotações de memória
Evidências Manifesto, selo externo, execução da verificação Pasta de capturas de tela
Honestidade sobre os limites Itens em aberto com responsáveis; pontos cegos declarados "Tudo pronto"

18.6 Prática contínua

Depois do curso, mantenha três hábitos: verificar antes de relatar, preservar antes de mudar e corrigir os relógios antes de ordenar os eventos. Mantenha os laboratórios contidos e nunca teste infraestrutura real sem autorização escrita do seu dono. Revisite normas e orientações quando mudarem; todas as fontes deste livro têm data de outubro de 2026.

Transforme o trabalho do curso num portfólio: planos com escopo, saídas dos laboratórios com as versões do Python, registros de solução de problemas e o pacote selado deste capítulo, cada selo registrado fora do seu pacote. Ao passar para uma nova versão do Python, execute de novo os laboratórios e compare as saídas; uma diferença é uma constatação a explicar, não a esconder. Busque trabalho supervisionado em que possa repetir o ciclo inteiro — escopo, linha de base, mudança, verificação, passagem de responsabilidade — num sistema real, com a assinatura do seu dono, e peça ao seu supervisor que o pontue segundo a rubrica da seção 18.5.

18.7 Erros comuns e limites

Verificações que pegam esses erros:

Exercícios — capítulo 18

EX069 — Escopo do projeto. Objetivo: definir um projeto supervisionado. Insumos: escolha um projeto da seção 18.1. Passos: escrever o escopo, os requisitos (testáveis) e a lista de artefatos que o pacote de evidências conterá. Evidência esperada: plano de uma página. Rubrica: 3 = todos os elementos do escopo, pelo menos quatro requisitos testáveis com testes positivos e negativos, artefatos associados às fases, supervisor e autorizador nomeados; 2 = uma lacuna; 1 = genérico; 0 = nada.

EX070 — Verifique um selo. Objetivo: usar o selo corretamente. Insumos: Laboratório 18. Passos: modificar o programa para também recalcular, ao final, o resumo do manifesto e compará-lo com o selo registrado; depois, editar também MANIFEST.sha256 para que coincida com o arquivo de testes adulterado e mostrar o que a comparação do selo relata. Evidência esperada: código e saídas dos dois casos. Rubrica: 3 = primeiro caso: o selo coincide (manifesto intacto) enquanto um artefato diverge; segundo caso: todos os artefatos "OK" contra o manifesto editado, mas a comparação do selo falha — explica por que o selo precisa ser guardado fora; 2 = um caso; 1 = tentativa; 0 = nada.

EX071 — Trate o acréscimo tardio. Objetivo: gerenciar mudanças nas evidências. Insumos: a edição do T10. Passos: escrever, passo a passo, o procedimento que o avaliador descreveu, incluindo o que é registrado e onde. Evidência esperada: procedimento. Rubrica: 3 = restaurar o original selado a partir do arquivo e conferir o seu resumo; acrescentar o adendo como artefato novo, com data e coletor; produzir uma nova versão do manifesto e um novo selo; registrar os dois selos externamente, com o motivo; nunca sobrescrever a versão 1; 2 = falta o registro externo; 1 = "editar e selar de novo"; 0 = nada.

EX072 — Autoavaliação. Objetivo: aplicar a rubrica com honestidade. Insumos: o projeto de R. Kaur, conforme descrito neste capítulo e nos Capítulos 10–13. Passos: pontuar cada critério da rubrica com uma frase de evidência e listar os itens em aberto. Evidência esperada: tabela pontuada e itens em aberto. Rubrica: 3 = pontuações justificadas pelo texto (por exemplo, verificação limitada pelo REQ-4 até a remoção da R6; critério de evidências reduzido pela edição posterior à selagem até ser corrigida), itens em aberto incluem a R6, o desvio pelo roteador da KW-04 nas demais estações, a cobertura do REQ-6 e o desfecho do incidente da KW-09, cada um com responsável; 2 = pontuações sem evidência; 1 = tudo 3; 0 = nada.

Síntese do capítulo

Um projeto supervisionado demonstra competência técnica como evidência: um escopo assinado, uma linha de base, uma mudança controlada, a verificação de cada requisito, um registro de solução de problemas, documentação executável e um pacote selado. Um selo prova que as evidências não mudaram desde a selagem, se for registrado fora do pacote; não prova que eram verdadeiras. Declare o que está em aberto, quem é o responsável e o que você não conseguiu ver.

Continue estudando — capítulo 18 de 18

← Capítulo 17 · Índice de capítulos do curso · Resoluções →

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

Resoluções e notas de avaliação

Cada resolução mostra uma resposta defensável e o que a rubrica recompensa. Uma resposta diferente recebe a pontuação máxima quando atende ao mesmo padrão de evidências, escopo e honestidade sobre os limites. Os resultados numéricos vêm dos laboratórios offline deste livro, executados com o Python 3.13.5 e apenas a biblioteca padrão; quando um resultado depende de um laboratório modificado, a modificação é descrita para que você possa reproduzi-la. Todos os números descrevem dados sintéticos; nunca os apresente como constatações sobre operadores reais.

Capítulo 1: EX001–EX004

EX001 — Classificação de caminhos. IHM → scada-01 "ligar bomba 2": controle; pior caso, um acionamento ou desligamento não autorizado de uma bomba (transbordamento, transiente de pressão). KW-04 → scada-01 leitura: monitoramento; pior caso, os operadores agem com base num nível falso. eng-ws-15 → KW-04 download de projeto: gerência (e, indiretamente, controle); pior caso, lógica do controlador substituída — a ação mais perigosa da lista, porque muda o que o controlador faz mesmo que nenhum outro comando seja enviado. jump-01 → hist-02 SSH: gerência; pior caso, registros históricos alterados ou apagados, ou um ponto de apoio na Z2. hist-02 → CSV corporativo: dados de monitoramento saindo da zona de controle; pior caso, divulgação de dados operacionais ou, se implementado como pull, uma credencial corporativa dentro da Z2 (Capítulo 15).

EX002 — Conserte o ciclo no papel. Exemplo: (1) varrer as quatro estações de fibra e as cinco celulares em canais separados das três estações de rádio (três canais: fibra 0,31 s, celular 6,52 s, rádio 4,50 s — o celular continua lento demais); (2) reduzir as varreduras por ciclo das celulares de 4 para 2, combinando as leituras de registradores numa única requisição (canal celular 3,26 s), e dar à KW-06 um canal próprio (2 varreduras × 690 ms = 1,38 s; celulares restantes 1,88 s). Com canais de ≤ 4,5 s, todas as estações saudáveis atendem aos 5 s. Limitar uma estação morta: um timeout de 800 ms sem nova tentativa imediata mantém uma KW-06 morta em 1,6 s no seu próprio canal. A pontuação máxima verifica editando stations, TIMEOUT_MS e a função cycle e relata os valores impressos; qualquer configuração que execute e atenda ao requisito recebe crédito, se o timeout for justificado frente à latência real do enlace.

EX003 — Impacto do túnel. Sequencial: 5 estações celulares × 4 varreduras × 35 ms = 700 ms, logo 11,33 → 12,03 s. Canais por estação: o ciclo próprio de cada estação celular sobe 4 × 35 = 140 ms; a KW-06 passa a 2,90 s, ainda abaixo de 5 s. Recomendação: o túnel só é aceitável junto com o novo desenho dos canais (EX002), e a sua latência deve ser medida num piloto, não presumida.

EX004 — Lista de plataformas compartilhadas. Hosts de virtualização — "Qual é a folga se um host falhar, e quais convidados reiniciam onde?" Diretório — "Quem está nos grupos de administradores, e os operadores conseguem entrar na IHM se o diretório estiver inalcançável?" Fonte de tempo — "Qual é a referência, há uma segunda, e o deslocamento é monitorado?" Coletor de monitoramento — "O que acontece quando o disco dele enche ou ele para — as fontes armazenam em buffer, e alguém é alertado?"

Capítulo 2: EX005–EX008

EX005 — Decodificação à mão. Quadro 1: tid 0x0010 = 16, protocolo 0, comprimento 6, unidade 1, função 16 (escrever vários registradores), endereço inicial 10, quantidade 2 — mas a função 16 também precisa levar uma contagem de bytes (4) e quatro bytes de valores, de modo que a PDU está incompleta; um analisador correto a rejeita, mesmo que o comprimento MBAP corresponda aos bytes presentes. Quadro 2: tid 17, comprimento 6, unidade 1, função 15 (escrever vários coils), endereço 0, quantidade 8 — também sem a sua contagem de bytes (1) e o byte dos coils. A pontuação máxima observa que as verificações do MBAP sozinhas não validam uma PDU; cada função tem a sua própria estrutura.

EX006 — Estenda o decodificador. No ramo de escrita: if fc in (15, 16): bc = b[12]; data = b[13:13 + bc] e, para a 16, vals = struct.unpack(f">{qty}H", data) depois de verificar bc == 2 * qty and len(data) == bc. Para o quadro de 10.30.3.7, ...011000070002040064000a, a contagem de bytes é 4 e os valores são 100 e 10 — dois registradores a partir do 7 (o setpoint e o registrador seguinte).

EX007 — Política de escrita como dados. Normal: (10.20.0.10, 10.10.0.0/16, {1, 2, 3, 4}). Janela de manutenção: acrescentar (10.20.0.15, a estação nomeada no chamado, {3, 5, 6, 15, 16}) apenas durante a janela. O plantão do KVROC liga e desliga a política mediante um chamado aprovado pelas operações da Kestrel Water; a alternância é registrada, e a janela expira automaticamente.

EX008 — Reconhecimento ou recurso? A consulta diária do scada-01 é coerente com um recurso de inventário; confirme na documentação do fornecedor do SCADA e acrescente-a ao modelo como um fluxo esperado. A rajada de três segundos de 10.20.0.31 é prioritária: um host desconhecido na Z2 consultando a identificação de várias estações tem a forma de reconhecimento. As primeiras verificações são somente de leitura: registros de DHCP e do switch para o endereço, o inventário de ativos, os logs do host de salto e do diretório para esse host. Não o sonde. O Capítulo 17 mostra o que ele fez em seguida.

Capítulo 3: EX009–EX012

EX009 — O primeiro valor vence. Se a linha comentada for descomentada onde está (depois de PasswordAuthentication yes), o valor efetivo continua yes, porque o sshd usa o primeiro valor lido. A correção precisa substituir a primeira ocorrência (ou apagá-la) e depois ser confirmada com sshd -T | grep -i passwordauthentication.

EX010 — Priorize as constatações do HIST-02. Hoje: preservar last/lastlog/os logs de autenticação de backup2 e vendor; remover backup2 (UID 0) e remover vendor do sudo e do ops-admins. Esta semana, como uma única mudança testada a partir de uma sessão aberta: ListenAddress 10.90.0.21, PermitRootLogin no, PasswordAuthentication no (depois de confirmar os logins por chave das duas pessoas autorizadas), X11Forwarding no, MaxAuthTries 3. Próxima janela: definir o shell de histsvc como /usr/sbin/nologin depois de verificar os jobs agendados e os scripts. O acesso do fornecedor passa para o processo com prazo do Capítulo 10.

EX011 — Estenda a auditoria. Acrescentar dentro do laço do passwd: if name != "root" and home in ("/root", "/") and not shell.endswith("nologin"): findings.append(f"account {name} has interactive shell and home {home}"). A saída acrescenta account backup2 has interactive shell and home /root, com 11 constatações. Um diretório pessoal compartilhado mistura o histórico do shell e as chaves entre identidades, de modo que as ações não podem ser atribuídas.

EX012 — Desenho de conta de serviço. UID de sistema (por exemplo, 998), shell /usr/sbin/nologin, diretório pessoal /opt/hist pertencente a root e legível pelo grupo histsvc; diretório de dados gravável apenas por histsvc; credencial do banco de dados num arquivo com modo 0400 pertencente a histsvc, ou no cofre de segredos da plataforma; trocada anualmente e depois de qualquer mudança de pessoal com acesso, responsável a equipe de plataforma do KVROC; a conta nunca é usada por pessoas.

Capítulo 4: EX013–EX016

EX013 — Preveja antes de executar. KW-11 12.0 → aceitar (faixa inclusiva); KW-12 inf → rejeitar "value not finite" (linha 13); KW-02 −0.0 → aceitar. Resumo {"accept": 4, "reject": 7, "quarantine": 2} (verificado executando). Normalizar −0,0 para 0,0 antes de armazenar.

EX014 — Rejeitar ou pôr em quarentena? (a) Quarentena: interpretável, mas fora da faixa — fluxo reverso, offset do sensor ou manipulação. (b) Rejeitar, a menos que o esquema defina explicitamente as unidades sem distinção de maiúsculas; nunca adivinhar. (c) Aceitar; um alarme de nível alto do processo é ferramenta do operador, não do validador. (d) Aceitar se estiver dentro de uma tolerância de relógio combinada (por exemplo, 5 s); caso contrário, quarentena como problema de relógio.

EX015 — JSON com armadilhas. json.loads('{"station": "KW-03", "value": NaN}') devolve {'station': 'KW-03', 'value': nan}. Defina def no_const(c): raise ValueError(f"non-standard JSON constant {c}") e chame json.loads(s, parse_constant=no_const); agora ele lança exceção. A RFC 8259 não permite NaN nem Infinity.

EX016 — Resumo para monitoramento. Exemplo: {"accept": 2, "reject": 6, "quarantine": 2, "by_reason": {"not a number": 2, "unit": 1, "timestamp": 1, "not finite": 1, "field count": 1, "range": 1, "future": 1}, "by_station": {"KW-03": 1, ...}}. Alerta: qualquer quarentena de uma tag CL2_MGL, ou rejeições acima de 10 % das linhas em duas exportações consecutivas, ou a ausência total da exportação.

Capítulo 5: EX017–EX020

EX017 — Conserte um escopo. Defeitos: a "TI" não é a dona do sistema (a Kestrel Water precisa autorizar); 10.10.0.0/16 são todas as estações; varredura ativa numa rede de controle; nenhuma janela ou horário; nenhuma ação permitida; nenhuma condição de parada; nenhum contato; nenhum tratamento das evidências. Reescrita: propósito "estabelecer os serviços expostos pelas RTUs das estações"; método primeiro a partir dos registros de ativos, das exportações de configuração e de uma captura passiva de 24 h; se restar uma lacuna, um teste de conexão por porta nomeada numa estação nomeada, numa janela combinada, com a sala de controle informada, autorizado por A. Mensah, parada a qualquer alarme, evidências com hash na pasta do caso.

EX018 — Rotule a nota. Observado: sessão de configuração da RTU KW-09 às 06:41Z (relógio corrigido); as leituras pararam às 07:05Z. Inferido: possível mudança não aprovada; quem a fez é desconhecido — "fornecedor" não está estabelecido. Feito: RTU reiniciada às 07:30Z por mim, sem preservação — a configuração em execução e o log da sessão anteriores ao reinício podem estar perdidos. Em aberto: quem abriu a sessão e por quê; se existe uma exportação de configuração ou um backup de antes do reinício; responsável L. Ferreira.

EX019 — Registro de evidência. O quê: fw-01-rules-20261013.txt (exportação bruta). Origem: fw-01, CLI de gerência, versão do firmware registrada. Tempo: 2026-10-13T08:12:40Z, host coletor sincronizado com o ntp-ops (deslocamento de +0,1 s). Coletor: R. Kaur. Método: o comando exato de exportação. Integridade: a saída de sha256sum fw-01-rules-20261013.txt registrada no registro do caso, guardada separada do arquivo.

EX020 — Alternativas passivas. Quem conversa com a KW-07: logs de fluxo do fw-01 e do roteador, ou uma captura SPAN. Firmware: registros de ativos, o inventário da ferramenta do fornecedor durante uma sessão de engenharia aprovada. Telnet: a exportação de configuração da RTU e a documentação do fornecedor sobre os serviços padrão. Um teste ativo só se justifica se os registros forem conflitantes, numa janela com escopo e com as operações presentes, como um único teste de conexão.

Capítulo 6: EX021–EX024

EX021 — Posicione os ativos. Roteador celular da KW-06: na fronteira da Z1; a sua interface de gerência é tão privilegiada quanto a Z5 e pertence ao inventário e às verificações de deriva. Gateway do fornecedor da SS-3: numa zona própria de acesso remoto, conectando-se apenas via jump-01, nunca posicionado na Z3. Servidor de relatórios: Z6. Notebook de engenharia: um ativo transitório com controles próprios (Capítulo 16), nunca permanentemente em zona alguma.

EX022 — Escreva um conduíte. C4: origem hist-02 (Z2) → destino report-01 (Z6) tcp/443; iniciado a partir da Z2 (push); propósito: CSV diário do relatório de operações; responsável: o líder de dados de operações da Kestrel Water; aplicação: regra do fw-01 com chamado; monitoramento: alerta do coletor se não houver envio até as 06:30 ou em qualquer conexão da Z6 para o hist-02; revisão anual.

EX023 — Contraste setorial. Água: confirmar um servidor SCADA redundante ou agendar fora dos períodos críticos; duração da interrupção da varredura combinada com as operações. Rede elétrica: reinícios do front end combinados com a sala de controle da rede, procedimentos de perda de telecontrole prontos; proteção não afetada, mas confirmar. Hospital: engenharia clínica e o nível de patch suportado pelo fabricante do sistema de gestão predial; continuidade dos alarmes de ventilação e dos quartos de isolamento durante o reinício. Um único cronograma semanal não serve para nenhum deles.

EX024 — Modelo versus captura. Não explicados pelos conduítes declarados: as escritas de 10.30.3.7 → KW-04 (nenhum conduíte corporativo para a Z1); a consulta de função 43 do scada-01, se o C1 for declarado apenas como "varreduras de leitura" (acrescentá-la explicitamente, se confirmada como recurso); dois quadros malformados do scada-01 — uma anomalia a explicar (falha de driver ou um programa diferente nesse host).

Capítulo 7: EX025–EX028

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).

Capítulo 8: EX029–EX032

EX029 — Nomeie o modo. (a) Inconsistência entre tags ou deriva: falha no retorno de posição da válvula, ou vazão entrando por outra rota (desvio, vazamento, válvula manual). (b) Valor travado / inconsistência entre tags: medidor de vazão com falha, ou um valor congelado ou substituído. (c) Dados desatualizados/em buffer: armazenamento e reenvio depois de uma queda do enlace, ou uma reprodução. (d) Perda da autoridade de controle: seletor local/remoto deixado em "local" depois de uma manutenção, ou um intertravamento impedindo a partida.

EX030 — Preveja uma mudança de regra. Com STUCK_MIN = 25 e MAX_STEP = 7.0 para o nível: a KW-02 deixa de ser sinalizada (20 < 25); os passos de 6,84 e 6,83 da KW-07 ficam abaixo de 7,0, portanto não há pico; a lacuna da KW-05 continua relatada; a KW-01 não muda. Saída verificada: apenas KW-05 FLOW_LS gap: 7 consecutive missing minutes. O que se perde: o analisador congelado e a excursão de uma única amostra — ambos potencialmente relevantes para a segurança.

EX031 — Regra condicional de valor travado. if pump_state == "running" for the whole run and run_length_identical(flow) >= M: alert("flow stuck while pump running"). Testes: bomba desligada por 40 min com vazão 0,0 → sem alerta; bomba funcionando com vazão exatamente 41,0 por M amostras → alerta; bomba funcionando com variação natural → sem alerta.

EX032 — Plano de falha ou ataque. Indicadores de falha: o display local do analisador difere do valor informado ou mostra um código de falha; diagnósticos da entrada analógica da RTU (laço aberto, entrada congelada); registros de manutenção mostrando calibração ou trabalho no analisador. Indicadores de manipulação: escritas capturadas no registrador de relatório ou num registrador de escala relacionado; uma sessão de configuração da RTU na janela; uma amostra manual pontual feita pelas operações que discorda de 0,62, enquanto o display do analisador concorda com a amostra. Todas são somente de leitura ou feitas pelas operações.

Capítulo 9: EX033–EX036

EX033 — Teste de resposta conhecida. Com 0x3D65 no laço que desloca para a direita, o assert falha (AssertionError) e o programa para antes de julgar qualquer quadro. Uma implementação com bits refletidos (LSB primeiro) precisa usar o polinômio refletido 0xA6BC; a forma normal 0x3D65 pertence às implementações MSB primeiro. O teste de resposta conhecida transformou um bug silencioso e plausível numa falha imediata.

EX034 — Decodifique o byte de controle. 0xC9 = 1100 1001: DIR 1 (do mestre), PRM 1, função 9 — request link status. 0x44 = 0100 0100: DIR 0 (da outstation), PRM 1 (primário), função 4 — unconfirmed user data, como usado, por exemplo, na resposta não solicitada de uma outstation. 0x0B = 0000 1011: DIR 0, PRM 0, função 11 — link status (secundário).

EX035 — Experimento mental de falsificação. O CRC mostra apenas que os bytes não foram corrompidos acidentalmente. O endereço de origem DNP3 1 é um campo que o remetente escreve; qualquer host pode reivindicá-lo. A autenticidade precisa de proteção criptográfica — o DNP3 Secure Authentication, ou um túnel cujas pontas sejam autenticadas (por exemplo, TLS terminando no fep-01 e na outstation ou no seu gateway) —, mais a aplicação pela rede de que só o caminho do fep-01 alcança a outstation. A origem de rede inesperada é, em si, a constatação.

EX036 — Seleção de método. (a) Passivo: decodificar uma captura no fep-01 ou os seus logs ao longo do mês e listar os endereços de origem. (b) Exportação da configuração do firewall do fep-01 e os seus logs; um único teste de conexão com escopo apenas se a exportação for ambígua. (c) Registro de ativos; caso contrário, a ferramenta do fornecedor em modo somente de leitura durante uma sessão aprovada, combinada com o engenheiro de proteção ou de telecontrole da Kestrel Grid — nunca sondando a outstation.

Capítulo 10: EX037–EX040

EX037 — Explique o sombreamento. Com a R5 acima da R4: nenhuma regra sombreada é relatada; testes: 1 PASS, 2 PASS (negado pela R5), 3 PASS, 4 FAIL (SMB permitido pela R4), 5 FAIL (R6). A reordenação cumpriu a promessa do comentário sobre o RDP, mas não resolveu a regra ampla.

EX038 — Conserte a política. Remover a R4 e a R6. Os cinco testes dão PASS (RDP e SMB agora negados pela R7; 10.20.0.12 negado pela R7). A R5 passa a ser redundante com a negação padrão; mantenha-a apenas se for desejada uma categoria de log separada para as tentativas de RDP (e então ela deve ficar acima de qualquer permissão); caso contrário, remova-a. Antes de remover a R4, verifique 30 dias de logs do fw-01 para listar o que usava a R4 e dê a cada uso legítimo o seu próprio conduíte.

EX039 — Configuração do acesso de fornecedores. vendor-ss3 desabilitada por padrão. A Kestrel Grid abre um chamado; o plantão do KVROC habilita a conta por uma janela fixa (por exemplo, 4 h) na ferramenta de acesso; o fornecedor se conecta ao jump-01 com MFA; a sessão é gravada; o jump-01 permite apenas o endereço de gerência do gateway do fornecedor e a porta de engenharia específica na SS-3, nunca a rede inteira da subestação; um alerta dispara em qualquer login fora de uma janela habilitada; a conta se desabilita automaticamente; no dia útil seguinte, o log da sessão é revisado frente ao chamado.

EX040 — Detecte ampliações. Acrescentar: def overlaps(a, b): return ip_network(a[2]).overlaps(ip_network(b[2])) and ip_network(a[3]).overlaps(ip_network(b[3])) and (a[4] in ("any", b[4]) or b[4] == "any") and (a[5] is None or b[5] is None or a[5] == b[5]) e, para uma regra posterior com a mesma ação que se sobrepõe, mas não está coberta, relatá-la quando a sua origem ou o seu destino não for uma sub-rede da anterior. A saída verificada acrescenta R6 broadens R1: same action, wider source 10.20.0.0/24, o mesmo para a R2, e R7 broadens R5 — esta última é a negação padrão pretendida e deve ser excluída (por exemplo, pulando as regras cuja origem e cujo destino são ambos 0.0.0.0/0). A revisão é necessária porque, numa leitura rápida, a regra parece uma duplicata, mas concede à sub-rede inteira do centro de controle acesso de escrita à KW-04.

Capítulo 11: EX041–EX044

EX041 — Torne testável. "O acesso remoto é seguro" → "O acesso do fornecedor à SS-3 só é possível via jump-01, com MFA, durante uma janela habilitada" (teste: uma tentativa fora da janela é recusada e gera alerta). "O tempo está sincronizado" → "Todos os hosts da Z2 e da Z5 estão a menos de 1 s do ntp-ops" (teste: relatório de deslocamentos). "Os logs são mantidos" → "Os eventos de permissão e de negação do fw-01 chegam ao coletor em até 60 s e são retidos por 12 meses" (teste: tentativa de conexão identificada, seguida de consulta ao coletor; verificação de retenção do registro mais antigo).

EX042 — Acrescente o teste que falta. Com o T9 para o REQ-6, a saída mostra o REQ-6 verificado via T9 e "verified 4/6". O REQ-3 e o REQ-4 continuam falhando, de modo que a CHG-2207 não está concluída.

EX043 — Testes positivos para uma mudança de firewall. O SCADA varre as doze estações (a contagem do historiador numa janela de 10 minutos é igual a 12 estações); conexão da eng-ws-15 à estação do chamado, numa janela; SSH do jump-01 para o hist-02 e o scada-01; a exportação diária do hist-02 chega ao servidor de relatórios; as sessões da IHM com o scada-01 não são afetadas. Evidências: saída da consulta ao historiador, logs de conexão, entradas no coletor.

EX044 — Não testado não é verificado. "A CHG-2207 não está concluída. Dos seis requisitos, três estão verificados com evidências (REQ-1, REQ-2, REQ-5), dois falharam (REQ-3: o RDP corporativo continua permitido porque a R4 permanece; REQ-4: 10.20.0.12 consegue alcançar o Modbus das estações por causa da R6) e um não foi testado (REQ-6, registro das negações). O T8 foi uma revisão de configuração sem saída registrada e não é contado. Responsáveis: remoção da R4 e da R6 — R. Kaur, sob uma nova mudança; teste do REQ-6 — J. Tan. Nova verificação depois da correção."

Capítulo 12: EX045–EX048

EX045 — Leia as respostas. tid 1: função 3, normal, 6 bytes: 342, 61, 0. tid 2: função 6, eco normal — registrador 7 = 300 escrito. tid 3: 0x86 = exceção à função 6, código 03 valor de dados ilegal (900 fora de 100–400). tid 4: 0x86, código 02 endereço de dados ilegal (registrador 0 não gravável). tid 5: 0x88 = exceção à função 8, código 01 função ilegal. tid 6: 0x83 = exceção à função 3, código 02 (a faixa 8–12 ultrapassa a tabela).

EX046 — Implemente a função 16. Interpretar addr, qty, bc = struct.unpack(">HHB", req[8:13]); se bc != 2 * qty or len(req) != 13 + bc, devolver a exceção 03; decodificar os valores; se algum endereço em addr..addr+qty-1 não estiver em WRITABLE, devolver 02; se algum valor estiver fora da sua faixa, devolver 03; caso contrário, escrever todos e devolver struct.pack(">HHHBBHH", tid, 0, 6, unit, 16, addr, qty). Registrar cada resultado. Nenhuma escrita parcial.

EX047 — Detecte tentativas de mapeamento. Regra: três ou mais respostas de exceção 02 para uma única origem em 60 s. As seis requisições originais produzem duas respostas de exceção 02 (tid 4 e tid 6), de modo que ela não dispara; acrescentar cinco leituras fora da faixa produz sete, e ela dispara. Contar 02 e 03 juntas já chegaria a três na execução original (tids 3, 4, 6) e dispararia com erros comuns; manter separada a regra de teste de limites (exceção 03) dá alertas mais claros.

EX048 — Avalie um laboratório. Contenção 1: um servidor em 0.0.0.0:502 é alcançável a partir de qualquer rede em que o notebook entre, inclusive a rede de uma estação, se o notebook for usado no local. Fidelidade: nenhuma declaração, pontuação 1. Correção: socketpair() ou vinculação a 127.0.0.1 com uma regra de firewall de host, ou uma rede de VMs isolada sem rota para fora; acrescentar uma declaração de fidelidade; registrar as saídas com a versão do Python.

Capítulo 13: EX049–EX052

EX049 — Previsões primeiro.

Hipótese Ping TCP 502 Resposta Modbus Contadores do rádio/celular Outras estações
Queda do enlace falha falha nenhuma erros subindo ok
Sobrecarga da varredura do SCADA (Capítulo 1) ok ok ok quando varrida, mas as varreduras atrasam estáveis também atrasadas
Tráfego bloqueado ou inundado por um host não autorizado ok ou falha falha ou lento timeouts estáveis ok

As observações que as separam são os contadores (enlace), a atualidade das outras estações (SCADA) e os logs de firewall/fluxo (relevante para a segurança).

EX050 — Acrescente a H6. Exemplo: "H6 RTU firmware degraded": {"rtu_ping": True, "tcp502_handshake": True, "modbus_reply": "timeout"} é refutada por modbus_reply (observada a exceção 2). Se você, em vez disso, previr a exceção 02 (alguns dispositivos a devolvem num modo degradado), a H6 continua coerente, e a observação extra somente de leitura é a página de diagnóstico ou de status da RTU (tempo ligado, modo) pela ferramenta do fornecedor em modo somente de leitura, ou o seu log de eventos mostrando um reinício.

EX051 — O momento do escalonamento. Mensagem: "07:22Z — as leituras da KW-09 pararam às 07:05Z. Observado: enlace, firewall e SCADA saudáveis; a RTU responde com exceção 02 às leituras normais; a RTU registrou uma sessão de configuração às 06:41Z (relógio corrigido) pelo usuário 'eng', sem chamado de mudança. Inferido: mapa de registradores alterado por essa sessão; quem e por quê, desconhecidos. Feito: nada mudado. Pedido: decisão sobre restaurar a configuração anterior depois da preservação. Gerente de plantão da Kestrel Water informado às 07:20Z." Preservados: exportação da configuração da RTU (07:25Z) e log de sessões; logs do jump-01 e da eng-ws-15 de 06:30–06:50Z; logs do fw-01 para 10.10.9.2; o registro de resolução de problemas — cada um com SHA-256 e horário de coleta.

EX052 — Feche o caminho da KW-04. Preservar a configuração do roteador e os seus logs de conexão; remover o redirecionamento de porta tcp/502 sob uma mudança aprovada pela Kestrel Water; pedir à operadora (por meio do responsável pelo contrato) que remova a alcançabilidade da VPN corporativa de acesso remoto para a rede privada das estações; teste negativo a partir de um cliente VPN identificado para o endereço da KW-04 na operadora; teste positivo da varredura do SCADA; depois, exportar e verificar os outros onze roteadores de estação quanto a redirecionamentos de porta e exposição da gerência; acrescentar as configurações dos roteadores à detecção de deriva. Responsável: o líder de redes do KVROC, com aprovação da Kestrel Water.

Capítulo 14: EX053–EX056

EX053 — Classifique e aja. (1) Preservar o sshd_config e o debug.sh: cópias, resumos, tamanho, mtime, proprietário e os logs de autenticação relevantes; informar L. Ferreira. (2) Investigar o debug.sh (quem o criou, se foi executado, se há um processo escutando) antes de removê-lo — provável incidente. (3) Reverter o sshd_config para a versão aprovada sob uma mudança, depois da preservação; verificar com sshd -T. (4) Para o ntp.conf: verificar o deslocamento frente aos dois servidores e depois atualizar o manifesto com a referência CHG-2210. (5) fw-01.rules: nada.

EX054 — Lista de correções automáticas. Reabilitar o encaminhamento de logs: correção automática (restaura a visibilidade, sem efeito no processo). Corrigir a lista de servidores NTP: correção automática (integridade do tempo, baixo risco). Redefinir o sshd_config: chamado (preservar primeiro; risco de trancamento). Reiniciar o historiador: chamado, junto com as operações (lacuna nos dados). Publicar regras de firewall: chamado, com testes (pode cortar a varredura). Redefinir um setpoint de CLP: nunca automatizado por ferramentas de segurança — o controle do processo pertence às operações.

EX055 — Trava de parada. Parar se a mesma chave mudar de modo idêntico em mais de 25 % dos hosts (aqui, 9 de 14 = 64 %). O mais provável é uma mudança de frota não registrada feita pela equipe de plataforma, ou um manifesto desatualizado; verificar o calendário de mudanças e o repositório do estado desejado. Até ser explicada, continua sendo uma constatação — um atacante com a conta da automação poderia produzir o mesmo padrão.

EX056 — Registro de preservação. Antes de imprimir a linha da mudança não aprovada: rec = {"file": name, "old": manifest[name], "new": current[name], "size": p.stat().st_size, "mtime": p.stat().st_mtime}; gravá-lo como JSON em root / f"preserve-{name}.json" e imprimir o seu SHA-256. O resumo do registro precisa ser guardado fora do host (registro do caso ou coletor), porque, caso contrário, um administrador do host poderia reescrever tanto o arquivo quanto o registro.

Capítulo 15: EX057–EX060

EX057 — Os caminhos importam. Manter um mapa parent na busca em largura e percorrer de volta a partir de cada serviço. Caminhos: esx-03 → fep-01 → grid-ss3-telecontrol; esx-03 → ad-ops → scada-01 → water-telemetry; esx-03 → ad-ops → bms-server → hospital-bms. Um segundo servidor de diretório num host diferente quebra os caminhos da água e do hospital; o caminho da rede elétrica precisa de redundância do fep-01 em outro host.

EX058 — Novos componentes compartilhados. Depois de acrescentar os nós, compartilhados pelos três serviços: esx-03 e power-ups-a (verificado). cell-carrier afeta a água e a rede elétrica. Mudanças: alimentar o esx-02 e o esx-03 a partir de UPS e circuitos separados; dar às estações mais críticas e ao telecontrole da SS-3 um segundo caminho de comunicação independente (outra operadora ou rádio licenciado).

EX059 — Teste do modo degradado. Primeiro numa IHM réplica ou de reserva: bloquear o seu tráfego de diretório e testar o login com credenciais em cache e com a conta local de emergência documentada. Em produção, numa janela combinada e com as operações da Kestrel Water presentes: bloquear por 10 minutos, no fw-01, o caminho da IHM até o ad-ops; confirmar que os operadores conseguem fazer login e agir, e que a varredura do scada-01 continua (contagem do historiador). Condições de parada: qualquer perda de visão ou de controle pelo operador, qualquer alarme; remoção imediata da regra como reversão. Evidências: log de mudança da regra, registros de login, contagens do historiador.

EX060 — Sentido da exportação. O hist-02 envia (push) o CSV por HTTPS ao report-01 com uma credencial de serviço que só pode fazer upload; a conta corporativa e a senha armazenada usadas para entrar no hist-02 são removidas e a senha é trocada; o fw-01 permite apenas hist-02 → report-01 tcp/443, e nada da Z6 para o hist-02; incluir um resumo SHA-256 do arquivo nos metadados do upload e conferi-lo no recebimento; alertar se nenhum envio chegar até as 06:30.

Capítulo 16: EX061–EX064

EX061 — Conserte uma instrução de trabalho. Defeitos: senha no documento (e, portanto, comprometida — troque-a); sem pré-condições nem registro de mudança; sem modo somente leitura; sem resultados esperados; "corrigir qualquer coisa" autoriza mudança não planejada; operações avisadas só depois; sem condições de parada nem reversão. Reescrever no padrão da WI-KW-07: registro de mudança, ligação para a sala de controle antes, referência ao cofre para a credencial, exportação somente leitura com resultados esperados, constatações registradas para uma mudança separada, condições de parada, ligação depois.

EX062 — Política de dispositivos transitórios. Política: trabalho de engenharia em sistemas de controle apenas a partir de laptops dedicados, montados a partir de uma imagem controlada, nunca usados para e-mail ou internet; atualização e varredura de malware antes da visita numa estação controlada, registradas; mídias removíveis de um conjunto numerado, varridas e registradas; toda conexão a um local registrada. Transição: varrer os arquivos de projeto do laptop atual num sistema isolado, copiar os arquivos verificados para o novo laptop de engenharia, registrar os resumos e então devolver o laptop antigo apenas ao uso corporativo.

EX063 — Limites de segurança. Não fazer login, testar nem mudar nada. Registrar a identidade do dispositivo, a localização, o horário e como a condição foi notada (por exemplo, a página de login exibia um aviso de credencial padrão citado na documentação do fornecedor — não uma tentativa de login). Informar no mesmo dia o engenheiro de proteção da Kestrel Grid e L. Ferreira; os engenheiros de proteção decidem e fazem qualquer mudança segundo os seus procedimentos. Guardar a constatação com acesso restrito.

EX064 — Registro de como construído. Exemplo: fw-01, versão de firmware x.y; resumo do conjunto de regras (marcador) guardado na CHG-2215 e no coletor; regras R1, R2, R3, R7 como construídas; desvio: R5 mantida para registro em log (aprovado por L. Ferreira). hist-02: versão do OpenSSH; resumo da configuração efetiva obtida com sshd -T; desvio em aberto até a conclusão do EX010: shell do histsvc; datado e assinado pelo implementador e pelo verificador.

Capítulo 17: EX065–EX068

EX065 — Leia os episódios. "Observado: 07:03–07:12Z, o host desconhecido 10.20.0.31 enviou consultas de identificação do dispositivo à KW-04, KW-05 e KW-06, um quadro malformado à KW-07, e escreveu 65.535 no registrador 7 da KW-04 (setpoint da bomba 2) às 07:04:40, 07:05:30 e 07:12:00. Inferido: reconhecimento seguido de tentativas de mudança de setpoint. Feito: nada. Em aberto: identidade e dono do 10.20.0.31; se a KW-04 aceitou as escritas; como o host chegou à Z2. Pedido: que a Kestrel Water verifique agora a bomba 2 e o setpoint da KW-04; preservar os dados do sensor."

EX066 — Conserte o descarte cego. No ramo de quadro malformado, acrescentar NEW-TALKER quando a origem for desconhecida, antes do continue. Saída verificada: NEW-TALKER 07:03:00–07:05:30Z ×6, 13 alertas, 5 episódios, registros ainda contabilizados (10 = 9 analisados + 1 descartado).

EX067 — A troca da janela. 1 minuto: 6 episódios — NEW-TALKER se divide em 07:03:00–07:03:02 (×3), 07:04:40–07:05:30 (×2), 07:12:00 (×1); UNAUTH-WRITE em 07:04:40–07:05:30 (×2) e 07:12:00; DEVICE-ID, um. 10 minutos: 3 episódios — NEW-TALKER 07:03:00–07:12:00 ×6, DEVICE-ID ×3, UNAUTH-WRITE 07:04:40–07:12:00 ×3. Tudo verificado por execução. Cinco minutos é um padrão razoável para uma atividade em ritmo humano; a configuração de 10 minutos mantém a escrita das 07:12 visível como parte da mesma atividade, o que aqui é possivelmente melhor — registre a escolha e revise-a com dados reais.

EX068 — Regra de faixa de valores. Acrescentar POLICY = {7: (100, 400)}; para a função 6, decodificar addr, val dos bytes 8–12; para a 16, decodificar cada valor; alertar VALUE-RANGE quando um endereço em POLICY receber um valor fora da sua faixa. Ela dispara nas três escritas de 0xFFFF e não na escrita de 300 da eng-ws-15. Ela detecta, mas não impede: o dispositivo ainda pode aceitar a escrita, de modo que o firewall e os controles de acesso continuam sendo a camada preventiva.

Capítulo 18: EX069–EX072

EX069 — Escopo do projeto. Exemplo (desvio pelo roteador da estação): finalidade — remover caminhos não autorizados até o Modbus das estações via roteadores celulares; sistemas — doze roteadores de estação (leitura), mudanças apenas nos roteadores com constatações; janela — combinada por estação com a Kestrel Water; autorizador A. Mensah; supervisor L. Ferreira; condições de parada — qualquer perda de comunicação ou alarme. Requisitos: nenhum port-forward para tcp/502 em nenhum roteador (negativo: verificação da configuração e teste de conexão de um cliente VPN); o SCADA consulta todas as estações (positivo: contagem do historiador); configurações dos roteadores sob detecção de desvio (teste: mudança benigna injetada é detectada); gerência dos roteadores apenas a partir do jump-01 (teste negativo). Artefatos: escopo, exportações e resumos da linha de base, registros de mudança, resultados dos testes, registro de solução de problemas, registro de como construído, manifesto e selo.

EX070 — Verifique um selo. Após a verificação, calcular hashlib.sha256((d / "MANIFEST.sha256").read_bytes()).hexdigest() e comparar com seal: o caso 1 imprime "seal OK" enquanto 04-tests.csv diverge. Caso 2: reescrever a linha do manifesto de 04-tests.csv com o novo resumo; todos os artefatos agora são verificados como "OK", mas o resumo do manifesto difere do selo registrado, de modo que a verificação do selo falha. Só um selo guardado externamente revela que o próprio manifesto foi editado.

EX071 — Trate o acréscimo tardio. (1) Recuperar a versão 1 do pacote do arquivo; conferir cada artefato e o manifesto contra o selo registrado externamente. (2) Restaurar 04-tests.csv ao conteúdo selado. (3) Salvar os resultados do T10 como 06-tests-addendum.csv, com coletor e horário UTC. (4) Criar a versão 2 do manifesto, incluindo os seis artefatos; calcular o selo 2. (5) Registrar o selo 2 no registro de mudança e no formulário de avaliação, com o motivo, mantendo o selo 1. (6) Nunca sobrescrever a versão 1.

EX072 — Autoavaliação. Escopo 3 (assinado, com dono e condições de parada). Correção técnica 2 (R4 removida; R6 ainda presente). Verificação 2 (REQ-4 reprovado até a remoção da R6; REQ-6 testado só depois do EX042). Solução de problemas 3 (hipóteses, previsões e preservação no caso da KW-09). Documentação 2 (como construído pendente para as constatações dos roteadores). Evidências 2 até a correção da edição posterior à selagem; depois, 3. Honestidade 3 se os itens em aberto forem listados. Itens em aberto: remover a R6 (R. Kaur); verificação do desvio pelo roteador em todas as estações (líder de rede); teste de regressão mensal do REQ-6 (J. Tan); desfecho do incidente da KW-09 (L. Ferreira).

Glossário