◇ OpenCyber Academy
Técnico · Capítulo 14 · Español

Capítulo 14 — Infraestructura crítica y seguridad sectorial: automatización

Aprendizaje gratuito y abierto para quienes desean proteger a las personas y la tecnología. No se necesita una cuenta para estudiar ni consultar las respuestas.

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:

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

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

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.

Respuestas desarrolladas

EX053 — Clasifique y actúe. (1) Conservar sshd_config y debug.sh: copias, resúmenes, tamaño, mtime, propietario y los registros de autenticación pertinentes; informar a L. Ferreira. (2) Investigar debug.sh (quién lo creó, si se ejecutó, si hay algo activo a la escucha) antes de eliminarlo: probable incidente. (3) Revertir sshd_config a la versión aprobada mediante un cambio, tras la conservación; verificar con sshd -T. (4) Para ntp.conf: verificar el desfase frente a ambos servidores y después actualizar el manifiesto con la referencia CHG-2210. (5) fw-01.rules: nada.

EX054 — Lista de correcciones automáticas. Reactivar el reenvío de registros: corrección automática (restaura la visibilidad, sin efecto sobre el proceso). Corregir la lista de servidores NTP: corrección automática (integridad de la hora, bajo riesgo). Restablecer sshd_config: incidencia (conservar primero; riesgo de quedarse fuera). Reiniciar el historiador: incidencia con operaciones (laguna de datos). Aplicar reglas de cortafuegos: incidencia con pruebas (puede cortar el sondeo). Restablecer el punto de consigna de un PLC: nunca automatizado por herramientas de seguridad; el control del proceso corresponde a operaciones.

EX055 — Salvaguarda de detención. Detener si la misma clave cambia de forma idéntica en más del 25 % de los equipos (aquí, 9 de 14 = 64 %). Lo más probable es un cambio de la flota sin registrar hecho por el equipo de plataforma o un manifiesto desactualizado; compruebe el calendario de cambios y el repositorio del estado deseado. Hasta que se explique sigue siendo un hallazgo: un atacante con la cuenta de automatización podría producir el mismo patrón.

EX056 — Registro de conservación. Antes de imprimir la línea del cambio no aprobado: rec = {"file": name, "old": manifest[name], "new": current[name], "size": p.stat().st_size, "mtime": p.stat().st_mtime}; escríbalo como JSON en root / f"preserve-{name}.json" e imprima su SHA-256. El resumen del registro debe guardarse fuera del equipo (expediente del caso o colector), porque, de lo contrario, un administrador del equipo podría reescribir tanto el archivo como el registro.