Capítulo 14 — Infraestructura crítica y seguridad sectorial: automatización
Mapa de la lección
Lección 14 publicada. Mapa, ejemplo, EX053.
flowchart TD
N0["Resultados de aprendizaje y conexión"]
N1["14.1 Por qué hashes"]
N2["14.2 Cuatro resultados, cuatro acciones"]
N3["14.4 Automatización segura en entornos de control"]
N4["14.5 Proteger la automatización"]
N5["14.6 Actividad práctica"]
N6["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Ejemplo resuelto"]
EX --> Q["Ejercicio EX053"]
Dibujo lógico
flowchart LR
N0["Resultados de aprendizaje y conexión"]
N1["14.1 Por qué hashes"]
N2["14.2 Cuatro resultados, cuatro acciones"]
N3["14.4 Automatización segura en entornos de control"]
N4["14.5 Proteger la automatización"]
N5["14.6 Actividad práctica"]
N6["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX053"]
[Resultados de aprendizaje y conexión]
|
v
[14.1 Por qué hashes]
|
v
[14.2 Cuatro resultados, cuatro acciones]
|
v
[14.4 Automatización segura en entornos de control]
|
v
[14.5 Proteger la automatización]
|
v
[14.6 Actividad práctica]
|
v
[Síntesis del capítulo]
|
v
[Ejemplo resuelto] --> [Ejercicio EX053]
Resultados de aprendizaje y conexión
Al terminar este capítulo debería ser capaz de:
- automatizar la detección de derivas de la configuración con hashes criptográficos y un manifiesto aprobado;
- clasificar las diferencias como ausentes, nuevas, cambio aprobado o cambio no aprobado, y actuar de forma distinta en cada caso;
- diseñar una automatización segura para entornos de control: solo lectura por defecto, radio de impacto pequeño, conservar antes de revertir y aprobación humana para todo lo que toque el proceso;
- proteger la propia automatización, ya que una herramienta que puede cambiar todos los equipos es un objetivo.
Los capítulos 10–13 cambiaron, verificaron y diagnosticaron a mano. Este capítulo automatiza las comprobaciones repetibles, para que la atención del técnico se dirija a las diferencias que importan.
14.1 Por qué hashes
Un resumen SHA-256 (FIPS 180-4) de un archivo cambia si cambia cualquier byte, y es inviable construir un archivo distinto con el mismo resumen. Comparar los resúmenes con un manifiesto registrado en un momento en que todo era correcto le dice qué archivos cambiaron, de forma barata y sin guardar copias. No le dice cómo cambiaron (para eso necesita la copia aprobada, guardada en control de versiones), ni si el cambio fue legítimo (para eso necesita los registros de cambio). El módulo hashlib de Python ofrece SHA-256 en la biblioteca estándar (Python hashlib).
14.2 Cuatro resultados, cuatro acciones
| Resultado | Significado | Acción |
|---|---|---|
| Sin cambios | Coincide con el manifiesto | Nada |
| Cambiado, aprobado | Lo cubre un registro de cambio | Verificar (capítulo 11) y después actualizar el manifiesto |
| Cambiado, no aprobado | Sin registro | Conservar, investigar y después revertir mediante un cambio |
| Nuevo o ausente | El archivo apareció o desapareció | Investigar antes de borrar o restaurar |
El error de automatización más peligroso es «revertir automáticamente toda deriva». Destruye la evidencia de un cambio no aprobado y puede deshacer una corrección de emergencia hecha a las 03:00 que aún no se ha documentado. La detección automatizada es barata y segura; la corrección automatizada necesita una lista breve y explícita de lo que puede corregirse automáticamente, y nada que toque el control del proceso.
14.3 Ejemplo resuelto: deriva en hist-02 (sintético)
Una tarea nocturna compara los archivos clave de hist-02 con el manifiesto aprobado después de CHG-2207. El Lab 14 simula una noche, usando un directorio temporal. Lab 14 (guárdelo como lab14.py y ejecútelo con 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])
Salida 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
fw-01.rules no ha cambiado. ntp.conf cambió y CHG-2210 lo cubre (se añadió un segundo servidor NTP): verifique que la hora está sincronizada y después actualice el manifiesto. sshd_config cambió sin registro: alguien volvió a habilitar el inicio de sesión de root. debug.sh es nuevo y contiene una orden que deja algo a la escucha. Ambos se conservan (copia, hash, marcas de tiempo, la cuenta que los escribió por última vez si el equipo lo registra) antes de revertir nada, y es muy probable que el segundo se convierta en un incidente. Se imprime el resumen del propio manifiesto para que también pueda comprobarse; guarde ese resumen en un lugar que los administradores del equipo no puedan modificar (capítulo 18).
14.4 Automatización segura en entornos de control
- Primero, solo lectura. La automatización más valiosa se limita a recoger y comparar: configuraciones, versiones de firmware, listas de cuentas, reglas de cortafuegos, caducidad de certificados.
- Radio de impacto pequeño. Actúe sobre un equipo o unos pocos; deténgase si muchos equipos difieren de la misma manera, lo que suele significar que el estado deseado o el recolector están mal.
- Ritmo y momento. El tráfico de recogida hacia los dispositivos de campo debe respetar el presupuesto de sondeo (capítulo 1) y no ejecutarse nunca en periodos críticos para el proceso sin acuerdo.
- Aprobación humana para todo cambio que pueda afectar al proceso, por pequeño que sea.
- Registre cada ejecución en el colector, con lo que se leyó y lo que se cambió.
14.5 Proteger la automatización
La cuenta de automatización puede leer o cambiar todos los equipos que gestiona, así que: guarde sus credenciales en una bóveda y rótelas; restrinja desde dónde puede conectarse; exija revisión de los cambios en su estado deseado; alerte de las ejecuciones fuera del calendario. El aviso de CISA sobre el acceso prolongado a infraestructuras críticas describe actores que usan herramientas de administración legítimas y cuentas válidas (CISA AA24-038A); una cuenta de automatización con privilegios excesivos es exactamente una herramienta así.
Una herramienta que puede cambiar todos los equipos es tan atractiva para un adversario como una estación de ingeniería. Revise los cambios de su estado deseado igual que revisa los cambios del cortafuegos.
14.6 Actividad práctica
Amplíe el Lab 14 para que, ante un cambio no aprobado, escriba un registro de conservación (nombre del archivo, resumen anterior, resumen nuevo, tamaño y hora de modificación) en el directorio temporal antes de imprimir el hallazgo, e imprima el SHA-256 del propio registro de conservación. Escriba el registro de conservación antes de imprimir el hallazgo e incluya en la salida el resumen del propio registro. Así, un investigador posterior podrá demostrar que la copia tomada en el momento de la detección coincide con lo que la tarea afirmó guardar. Mantenga la limpieza del directorio temporal después de registrar los hashes.
14.7 Errores comunes y límites
- Solo hashes; ninguna copia aprobada con la que comparar el contenido.
-
El Lab 14 ignora los permisos, la propiedad y las marcas de tiempo, que importan tanto como el contenido (un archivo de servicio con escritura para todos es una deriva).
-
Revertir automáticamente toda deriva y destruir la evidencia de un cambio no aprobado.
- Guardar el manifiesto en el equipo que protege.
- Calcular hashes solo del contenido e ignorar los permisos que hacen que un archivo de servicio tenga escritura para todos.
- Sondear los dispositivos de campo de forma tan agresiva que falla el ciclo de sondeo.
- Informar de una deriva sin anotar con qué versión aprobada de la línea base se comparó.
Ejercicios — capítulo 14
EX053 — Clasifique y actúe. Objetivo: aplicar los cuatro resultados. Entradas: la salida del Lab 14. Pasos: escriba la acción y el responsable de cada línea, en orden de ejecución. Evidencia esperada: lista ordenada. Rúbrica: 3 = conservar primero sshd_config y debug.sh (copia, hash, metadatos), avisar a la responsable de seguridad; investigar debug.sh antes de eliminarlo; revertir sshd_config mediante un cambio tras la conservación; verificar NTP y actualizar el manifiesto para ntp.conf; nada para fw-01.rules; 2 = orden erróneo; 1 = revertirlo todo; 0 = nada.
EX054 — Lista de correcciones automáticas. Objetivo: limitar la automatización. Entradas: correcciones automáticas candidatas: reactivar el reenvío de registros, restablecer sshd_config, reiniciar el servicio del historiador, corregir la lista de servidores NTP, aplicar reglas de cortafuegos, restablecer el punto de consigna de un PLC. Pasos: marque cada una como corrección automática, incidencia o no automatizar nunca, con sus motivos. Evidencia esperada: seis filas. Rúbrica: 3 = reenvío de registros y lista NTP como corrección automática (restauran la visibilidad y la hora, bajo riesgo para el proceso); sshd_config y aplicación de reglas de cortafuegos mediante incidencia (riesgo para la conservación y de quedarse fuera); reinicio del historiador mediante incidencia con operaciones; el punto de consigna del PLC nunca automatizado por herramientas de seguridad; 2 = una errónea; 1 = todas automáticas; 0 = nada.
EX055 — Salvaguarda de detención. Objetivo: reducir el radio de impacto. Entradas: una flota de 14 equipos; una noche, 9 muestran ntp.conf cambiado de forma idéntica. Pasos: proponga una condición de detención y explique qué significa probablemente el patrón. Evidencia esperada: salvaguarda y explicación. Rúbrica: 3 = detener cuando más de una proporción fijada (por ejemplo, el 25 %) de los equipos muestre el mismo cambio; lo más probable es un cambio deliberado de la flota sin registrar o un manifiesto erróneo: confirmarlo con el calendario de cambios antes de cualquier acción; seguir tratándolo como hallazgo hasta que se explique; 2 = salvaguarda sin interpretación; 1 = revertir los nueve; 0 = nada.
EX056 — Registro de conservación. Objetivo: ampliar el laboratorio. Entradas: la actividad 14.6. Pasos: impleméntelo y muestre la salida. Evidencia esperada: código y salida. Rúbrica: 3 = el registro se escribe antes de la línea del hallazgo, contiene los campos requeridos y se imprime su resumen; explica por qué el resumen del registro debe guardarse fuera del equipo; 2 = registro sin resumen; 1 = intentado; 0 = nada.
Síntesis del capítulo
Automatice las comprobaciones que nunca cambian: recoger, calcular hashes, comparar con un manifiesto aprobado y clasificar las diferencias. Actúe de forma distinta ante los elementos aprobados, no aprobados, nuevos y ausentes (conserve antes de revertir) y limite la corrección automática a una lista breve que nunca toque el proceso. Proteja la automatización como la herramienta poderosa que es.
Siga estudiando — capítulo 14 de 18
← Capítulo 13 · Índice de capítulos del curso · Capítulo 15 →
Continúe con la siguiente lección escrita.