Capítulo 14 — Infraestrutura crítica e segurança setorial: automação
Mapa da aula
Aula 14 publicada. Mapa, exemplo, EX053.
flowchart TD
N0["14.1 Por que hashes"]
N1["14.2 Quatro resultados, quatro ações"]
N2["14.4 Automação segura em ambientes de controle"]
N3["14.5 Proteger a automação"]
N4["14.6 Atividade prática"]
N5["Síntese do capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5
N5 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX053"]
Desenho lógico
flowchart LR
N0["14.1 Por que hashes"]
N1["14.2 Quatro resultados, quatro ações"]
N2["14.4 Automação segura em ambientes de controle"]
N3["14.5 Proteger a automação"]
N4["14.6 Atividade prática"]
N5["Síntese do capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX053"]
[14.1 Por que hashes]
|
v
[14.2 Quatro resultados, quatro ações]
|
v
[14.4 Automação segura em ambientes de controle]
|
v
[14.5 Proteger a automação]
|
v
[14.6 Atividade prática]
|
v
[Síntese do capítulo]
|
v
[Exemplo resolvido] --> [Exercício EX053]
Objetivos de aprendizagem e conexão
Ao final deste capítulo, você deverá ser capaz de:
- automatizar a detecção de deriva de configuração com hashes criptográficos e um manifesto aprovado;
- classificar as diferenças como ausente, nova, mudança aprovada ou mudança não aprovada, e agir de modo diferente em cada caso;
- desenhar uma automação segura em ambientes de controle: somente leitura por padrão, raio de impacto pequeno, preservar antes de reverter e aprovação humana para tudo o que toca o processo;
- proteger a própria automação, já que uma ferramenta capaz de mudar todos os hosts é um alvo.
Os Capítulos 10–13 mudaram, verificaram e resolveram problemas à mão. Este capítulo torna automáticas as verificações repetíveis, para que a atenção do técnico vá para as diferenças que importam.
14.1 Por que hashes
Um resumo SHA-256 (FIPS 180-4) de um arquivo muda se qualquer byte mudar, e é inviável construir um arquivo diferente com o mesmo resumo. Comparar os resumos com um manifesto registrado num momento sabidamente bom diz quais arquivos mudaram, de modo barato e sem guardar cópias. Não diz como mudaram — para isso, você precisa da cópia aprovada, mantida em controle de versão — e não diz se a mudança foi legítima — para isso, você precisa dos registros de mudança. O hashlib do Python fornece o SHA-256 na biblioteca padrão (Python hashlib).
14.2 Quatro resultados, quatro ações
| Resultado | Significado | Ação |
|---|---|---|
| Inalterado | Corresponde ao manifesto | Nada |
| Alterado, aprovado | Um registro de mudança o cobre | Verificar (Capítulo 11) e depois atualizar o manifesto |
| Alterado, não aprovado | Nenhum registro | Preservar, investigar e depois reverter sob uma mudança |
| Novo ou ausente | O arquivo apareceu ou sumiu | Investigar antes de apagar ou restaurar |
O erro de automação mais perigoso é "reverter toda deriva automaticamente". Isso destrói a evidência de uma mudança não aprovada e pode desfazer uma correção de emergência feita às 03:00 que ainda não foi registrada. A detecção automatizada é barata e segura; a correção automatizada precisa de uma lista curta e explícita do que pode ser corrigido automaticamente, e de nada que toque o controle do processo.
14.3 Exemplo resolvido: deriva no hist-02 (sintético)
Um job noturno compara os arquivos-chave do hist-02 com o manifesto aprovado depois da CHG-2207. O Laboratório 14 simula uma noite, usando um diretório temporário.
Laboratório 14 (salve como lab14.py e execute com python3 lab14.py):
# Lab 14 - detect configuration drift against an approved manifest (offline, standard library only)
# Files are created in a temporary directory that is removed at the end.
import hashlib, json, pathlib, tempfile
def sha(p): return hashlib.sha256(p.read_bytes()).hexdigest()
with tempfile.TemporaryDirectory() as tmp:
root = pathlib.Path(tmp)
files = {"sshd_config": "ListenAddress 10.90.0.21\nPermitRootLogin no\nPasswordAuthentication no\n",
"ntp.conf": "server 10.90.0.5 iburst\n",
"fw-01.rules": "R1 allow 10.20.0.10 10.10.0.0/16 tcp 502\nR7 deny any any\n"}
for n, t in files.items(): (root / n).write_text(t)
manifest = {n: sha(root / n) for n in files} # approved baseline
approved_changes = {"ntp.conf": "CHG-2210"}
(root / "ntp.conf").write_text("server 10.90.0.5 iburst\nserver 10.90.0.6 iburst\n") # approved
(root / "sshd_config").write_text(files["sshd_config"].replace("PermitRootLogin no", "PermitRootLogin yes"))
(root / "debug.sh").write_text("nc -l -p 9000\n") # new, unexpected file
current = {p.name: sha(p) for p in sorted(root.iterdir())}
for name in sorted(set(manifest) | set(current)):
if name not in current: print(f"MISSING {name}")
elif name not in manifest: print(f"NEW {name} -> investigate before removing")
elif current[name] != manifest[name]:
tag = f"approved ({approved_changes[name]}) -> update baseline" if name in approved_changes else "UNAPPROVED -> preserve, then revert"
print(f"CHANGED {name} {tag}")
else: print(f"unchanged {name}")
print("manifest digest", hashlib.sha256(json.dumps(manifest, sort_keys=True).encode()).hexdigest()[:16])
Saída esperada (Python 3.13.5):
NEW debug.sh -> investigate before removing
unchanged fw-01.rules
CHANGED ntp.conf approved (CHG-2210) -> update baseline
CHANGED sshd_config UNAPPROVED -> preserve, then revert
manifest digest fdea74f1d09e359c
O fw-01.rules está inalterado. O ntp.conf mudou, e a CHG-2210 o cobre (um segundo servidor NTP foi acrescentado): verifique que o tempo está sincronizado e depois atualize o manifesto. O sshd_config mudou sem registro — alguém reabilitou o login de root. O debug.sh é novo e contém um comando de escuta. Ambos são preservados (cópia, hash, timestamps, a conta que os gravou por último, se o host registrar isso) antes que qualquer coisa seja revertida, e o segundo muito provavelmente se tornará um incidente. O resumo do próprio manifesto é impresso para que o manifesto possa ser conferido; guarde esse resumo num lugar que os administradores do host não possam alterar (Capítulo 18).
14.4 Automação segura em ambientes de controle
- Somente leitura primeiro. A maior parte da automação valiosa apenas coleta e compara: configurações, versões de firmware, listas de contas, regras de firewall, validade de certificados.
- Raio de impacto pequeno. Aja sobre um host ou poucos; pare se muitos hosts diferirem do mesmo modo, o que geralmente significa que o estado desejado ou o coletor está errado.
- Taxa e horário. O tráfego de coleta para dispositivos de campo precisa respeitar o orçamento de varredura (Capítulo 1) e nunca rodar durante períodos críticos do processo sem acordo.
- Aprovação humana para toda mudança que possa afetar o processo, por menor que seja.
- Registre cada execução no coletor, com o que foi lido e o que foi mudado.
14.5 Proteger a automação
A conta da automação consegue ler ou mudar todos os hosts que gerencia; portanto: guarde as suas credenciais num cofre e troque-as; restrinja de onde ela pode se conectar; exija revisão das mudanças no seu estado desejado; alerte sobre execuções fora do agendamento. O alerta da CISA sobre acesso de longo prazo à infraestrutura crítica descreve atores usando ferramentas legítimas de administração e contas válidas (CISA AA24-038A); uma conta de automação com privilégios excessivos é exatamente uma dessas ferramentas.
Uma ferramenta que consegue mudar todos os hosts é tão atraente para um adversário quanto uma estação de engenharia. Revise as mudanças no seu estado desejado do mesmo modo que revisa as mudanças de firewall.
14.6 Atividade prática
Estenda o Laboratório 14 para que, diante de uma mudança não aprovada, ele grave um registro de preservação — nome do arquivo, resumo antigo, resumo novo, tamanho e horário de modificação — no diretório temporário antes de imprimir a constatação, e imprima o SHA-256 do próprio registro de preservação.
Grave o registro de preservação antes de imprimir a constatação e inclua na saída o resumo do próprio registro. Assim, um investigador posterior pode mostrar que a cópia feita no momento da detecção corresponde ao que o job afirmou ter guardado. Mantenha a limpeza do diretório temporário depois que os hashes forem registrados.
14.7 Erros comuns e limites
- Apenas hashes; nenhuma cópia aprovada com a qual comparar o conteúdo.
-
O Laboratório 14 ignora permissões, propriedade e timestamps, que importam tanto quanto o conteúdo (um arquivo de serviço gravável por todos é deriva).
-
Reverter automaticamente toda deriva e destruir a evidência de uma mudança não aprovada.
- Guardar o manifesto no host que ele protege.
- Calcular hash apenas do conteúdo e ignorar permissões que tornam um arquivo de serviço gravável por todos.
- Varrer os dispositivos de campo com tanta agressividade que o ciclo de varredura deixa de ser atendido.
- Reportar desvios sem registrar com qual versão aprovada da linha de base foram comparados.
Exercícios — capítulo 14
EX053 — Classifique e aja. Objetivo: aplicar os quatro resultados. Insumos: a saída do Laboratório 14. Passos: escrever a ação e o responsável para cada linha, na ordem de execução. Evidência esperada: lista ordenada. Rubrica: 3 = preservar primeiro o sshd_config e o debug.sh (cópia, hash, metadados), avisar a líder de segurança; investigar o debug.sh antes da remoção; reverter o sshd_config sob uma mudança, depois da preservação; verificar o NTP e atualizar o manifesto para o ntp.conf; nada para o fw-01.rules; 2 = ordem errada; 1 = reverter tudo; 0 = nada.
EX054 — Lista de correções automáticas. Objetivo: limitar a automação. Insumos: correções automáticas candidatas: reabilitar o encaminhamento de logs, redefinir o sshd_config, reiniciar o serviço do historiador, corrigir a lista de servidores NTP, publicar regras de firewall, redefinir um setpoint de CLP. Passos: marcar cada uma como correção automática, chamado ou nunca automatizar, com justificativas. Evidência esperada: seis linhas. Rubrica: 3 = encaminhamento de logs e lista de NTP como correção automática (restauram a visibilidade e o tempo, baixo risco para o processo); sshd_config e publicação de firewall com chamado (risco de preservação e de trancamento); reinício do historiador com chamado, junto com as operações; setpoint de CLP nunca automatizado por ferramentas de segurança; 2 = um errado; 1 = tudo automático; 0 = nada.
EX055 — Trava de parada. Objetivo: reduzir o raio de impacto. Insumos: uma frota de 14 hosts; numa noite, 9 mostram o ntp.conf alterado de modo idêntico. Passos: propor uma condição de trava e explicar o que o padrão provavelmente significa. Evidência esperada: trava e explicação. Rubrica: 3 = parar quando mais do que uma proporção definida (por exemplo, 25 %) dos hosts mostrar a mesma mudança; o mais provável é uma mudança de frota deliberada, mas não registrada, ou um manifesto errado — confirmar com o calendário de mudanças antes de qualquer ação; ainda assim, tratar como constatação até ser explicada; 2 = trava sem interpretação; 1 = reverter os nove; 0 = nada.
EX056 — Registro de preservação. Objetivo: estender o laboratório. Insumos: atividade 14.6. Passos: implementar e mostrar a saída. Evidência esperada: código e saída. Rubrica: 3 = registro gravado antes da linha da constatação, contendo os campos exigidos, com o seu resumo impresso; explica por que o resumo do registro precisa ser guardado fora do host; 2 = registro sem resumo; 1 = tentativa; 0 = nada.
Síntese do capítulo
Automatize as verificações que nunca mudam: coletar, calcular hash, comparar com um manifesto aprovado e classificar as diferenças. Aja de modo diferente sobre os itens aprovados, não aprovados, novos e ausentes — preserve antes de reverter e restrinja a correção automática a uma lista curta que nunca toque o processo. Proteja a automação como a ferramenta poderosa que ela é.
Continue estudando — capítulo 14 de 18
← Capítulo 13 · Índice de capítulos do curso · Capítulo 15 →
Siga para a próxima lição escrita.