Capítulo 7 — Infraestructura crítica y seguridad sectorial: datos y telemetría
Mapa de la lección
Lección 07 publicada. Mapa, ejemplo, EX025.
flowchart TD
N0["Resultados de aprendizaje y conexión"]
N1["7.1 Fuentes y puntos ciegos"]
N2["7.2 Estructura de syslog"]
N3["7.3 Tiempo"]
N4["7.5 Actividad práctica"]
N5["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5
N5 --> EX["Ejemplo resuelto"]
EX --> Q["Ejercicio EX025"]
Dibujo lógico
flowchart LR
N0["Resultados de aprendizaje y conexión"]
N1["7.1 Fuentes y puntos ciegos"]
N2["7.2 Estructura de syslog"]
N3["7.3 Tiempo"]
N4["7.5 Actividad práctica"]
N5["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX025"]
[Resultados de aprendizaje y conexión]
|
v
[7.1 Fuentes y puntos ciegos]
|
v
[7.2 Estructura de syslog]
|
v
[7.3 Tiempo]
|
v
[7.5 Actividad práctica]
|
v
[Síntesis del capítulo]
|
v
[Ejemplo resuelto] --> [Ejercicio EX025]
Resultados de aprendizaje y conexión
Al terminar este capítulo debería ser capaz de:
- nombrar las fuentes de telemetría que usa un técnico en un entorno de control (datos del proceso, registros de dispositivos, registros del cortafuegos y de los equipos, registros de flujos, capturas pasivas) y lo que cada una puede mostrar y lo que no;
- analizar syslog RFC 5424, calcular la instalación y la severidad a partir del valor de prioridad y tratar las líneas que no son RFC 5424;
- medir y corregir los desfases de reloj frente a una referencia NTP y construir una única cronología en UTC;
- explicar cómo un reloj sin corregir invierte la causa y el efecto.
El capítulo 6 dijo dónde están las cosas. Este capítulo trata de lo que le cuentan y de si usted puede poner sus relatos en el orden correcto.
7.1 Fuentes y puntos ciegos
| Fuente | Muestra | No muestra |
|---|---|---|
| Datos del proceso (historiador) | Valores y alarmas a lo largo del tiempo | Quién causó un cambio |
| Registros de eventos de la HMI y del SCADA | Acciones del operador, reconocimientos de alarmas | Acciones realizadas directamente sobre el controlador |
| Registros del controlador/RTU | Sesiones de configuración, cambios de modo (si se admiten y están activados) | A menudo nada; muchos dispositivos registran poco |
| Registros del cortafuegos | Conexiones permitidas y denegadas en el límite | Tráfico dentro de una zona |
| Registros de los equipos (servidor de salto, servidores) | Inicios de sesión, órdenes, eventos de servicio | Actividad en dispositivos sin registro |
| Captura pasiva / registros de flujos | Quién habló con quién y con qué función | Contenido cifrado; tráfico que no pasa por el sensor |
La guía de gestión de registros del NIST describe la recogida, la conservación y la protección de estos registros (SP 800-92). La primera tarea del técnico es saber qué fuente responde a qué pregunta, y qué preguntas no responde ninguna fuente.
7.2 Estructura de syslog
La RFC 5424 define el formato moderno de syslog: <PRI>VERSION TIMESTAMP HOSTNAME APP-NAME PROCID MSGID STRUCTURED-DATA MSG (RFC 5424). El valor de prioridad es instalación × 8 + severidad: <38> es la instalación 4 (seguridad/autorización), severidad 6 (informativa). La marca de tiempo es RFC 3339 con desfase, y un guion (-) significa «nulo»; en una marca de tiempo, el emisor no conocía la hora. Muchos dispositivos siguen enviando el formato BSD antiguo (<13>Oct 11 23:15:02 host app: ...), sin año ni zona; cuente esas líneas y analícelas por separado en lugar de descartarlas.
7.3 Tiempo
Una cronología solo es tan buena como sus relojes. NTP (RFC 5905) permite a los equipos medir su desfase respecto a una referencia (RFC 5905). En los entornos de control, algunos dispositivos no tienen cliente NTP, derivan varios minutos o están aislados deliberadamente de las fuentes de hora. Registre, para cada equipo que aporte datos a una cronología, su desfase medido en un momento conocido, y corrija sus marcas de tiempo restándolo: corregida = notificada − (reloj del equipo − referencia). Convierta todo a UTC antes de ordenar; los desfases locales como +01:00 son correctos, pero es fácil ordenarlos mal a simple vista.
7.4 Ejemplo resuelto: la secuencia de las 23:14 (sintético)
La noche del 11 de octubre, un operador informó de que la bomba 2 de KW-04 había arrancado de forma inesperada. Usted recogió seis líneas y midió los desfases de los relojes a la mañana siguiente (la RTU iba 212 s por detrás de la referencia). Lab 7 (guárdelo como lab07.py y ejecútelo con python3 lab07.py):
# Lab 7 - parse RFC 5424 syslog, correct clock offsets and build a UTC timeline (offline, stdlib)
# Synthetic lines from the Kestrel Vale operations centre; offsets measured against the NTP reference.
import re
from datetime import datetime, timedelta, timezone
lines = [
"<38>1 2026-10-11T23:14:05.120Z fw-01 filterlog - - - block tcp 10.30.3.7:51544 -> 10.10.4.2:502",
"<86>1 2026-10-12T00:13:58+01:00 jump-01 sshd 812 - - Accepted publickey for jtan from 10.90.0.40",
"<134>1 2026-10-11T23:16:40Z hmi-02 hmi - - - operator setpoint change KW-04 PUMP2 start",
"<38>1 2026-10-11T23:15:31Z rtu-kw04 auth - - - config session opened user=eng",
"<13>Oct 11 23:15:02 eng-ws-15 app: project download started",
"<38>1 - hist-02 histd - - - archive rollover",
]
offset_s = {"fw-01": 0.0, "jump-01": 0.4, "hmi-02": 0.0, "rtu-kw04": -212.0} # host clock minus reference
pat = re.compile(r"^<(\d{1,3})>1 (\S+) (\S+) (\S+) (\S+) (\S+) (\S+) ?(.*)$")
events, unparsed = [], []
for ln in lines:
m = pat.match(ln)
if not m: unparsed.append(("not RFC 5424", ln)); continue
pri, ts, host, app, _pid, _msgid, _sd, msg = m.groups()
if ts == "-": unparsed.append(("no timestamp", ln)); continue
t = datetime.fromisoformat(ts.replace("Z", "+00:00")).astimezone(timezone.utc)
t_corr = t - timedelta(seconds=offset_s.get(host, 0.0))
fac, sev = divmod(int(pri), 8)
events.append((t_corr, host, f"fac={fac} sev={sev}", msg, offset_s.get(host, 0.0)))
for t, host, fs, msg, off in sorted(events):
note = f" (clock corrected {-off:+.1f} s)" if off else ""
print(f"{t.strftime('%H:%M:%S.%f')[:-3]}Z {host:<9} {fs:<11} {msg}{note}")
for why, ln in unparsed: print("UNPARSED", why, "|", ln)
Salida esperada (Python 3.13.5):
23:13:57.600Z jump-01 fac=10 sev=6 Accepted publickey for jtan from 10.90.0.40 (clock corrected -0.4 s)
23:14:05.120Z fw-01 fac=4 sev=6 block tcp 10.30.3.7:51544 -> 10.10.4.2:502
23:16:40.000Z hmi-02 fac=16 sev=6 operator setpoint change KW-04 PUMP2 start
23:19:03.000Z rtu-kw04 fac=4 sev=6 config session opened user=eng (clock corrected +212.0 s)
UNPARSED not RFC 5424 | <13>Oct 11 23:15:02 eng-ws-15 app: project download started
UNPARSED no timestamp | <38>1 - hist-02 histd - - - archive rollover
Antes de la corrección, la línea de la RTU (23:15:31Z) aparecía antes del cambio de punto de consigna en la HMI (23:16:40Z), lo que sugería que alguien configuró la RTU y que después actuó el operador. Tras la corrección, la sesión de la RTU ocurrió a las 23:19:03Z, después de la orden de arranque del operador. El relato pasa de «alguien manipuló primero» a «una sesión de ingeniería siguió a la acción del operador», lo que lleva a otra pregunta (quién abrió una sesión de configuración a las 23:19 y por qué). Dos líneas no pudieron situarse: la línea en formato BSD de la estación de ingeniería no tiene año ni zona, y la línea del historiador tiene una marca de tiempo nula. Se notifican, no se descartan; el «project download started» de la estación de ingeniería es posiblemente la línea más importante de todas, y situarla requiere su propia comprobación de reloj y los registros locales de la estación de trabajo.
7.5 Actividad práctica
Mida el desfase de una máquina de su propiedad frente a un servidor NTP público o local (por ejemplo, chronyc tracking o ntpq -p en Linux, w32tm /stripchart en Windows), regístrelo con la hora de la medición y repita al cabo de 24 horas para ver la deriva. Registre el equipo, la referencia, el desfase y la hora de la medición. Al cabo de veinticuatro horas, compare el nuevo desfase con el anterior para ver la deriva. Guarde ambas lecturas junto con el trabajo de cronología del Lab 7, para que una investigación posterior sepa cuán incierta sería una corrección hecha a partir de una sola medición.
7.6 Errores comunes y límites
- Ordenar por el texto de marcas de tiempo con desfases mezclados.
- Corregir los relojes en el sentido equivocado; escriba cada vez que la corregida es igual a la notificada menos el desfase.
- Descartar las líneas que no se analizan; cuéntelas y notifíquelas.
- Suponer que un desfase medido hoy se aplicaba anoche; la deriva y la resincronización lo cambian, así que indique la incertidumbre.
- Suponer que la ausencia de una línea de registro significa la ausencia de un evento; muchos dispositivos sencillamente no registran.
- Fusionar registros de dispositivos cuyos desfases se midieron en momentos distintos sin anotar la hora de cada medición junto a su desfase.
- Dar una hora corregida al segundo cuando el propio desfase solo se conoce con un margen de unos segundos.
Ejercicios — capítulo 7
EX025 — Decodifique prioridades. Objetivo: calcular la instalación y la severidad. Entradas: <86>, <134>, <11>, <165>. Pasos: calcule cada una. Evidencia esperada: cuatro pares con sus nombres. Rúbrica: 3 = 86 → 10/6 (authpriv, informativa); 134 → 16/6 (local0, informativa); 11 → 1/3 (user, error); 165 → 20/5 (local4, aviso); 2 = aritmética correcta, faltan los nombres; 1 = parcial; 0 = nada.
EX026 — Corrija un reloj. Objetivo: aplicar la fórmula del desfase. Entradas: fep-01 registra un evento a las 02:10:00Z; su desfase, medido una hora después, era de +47 s (el equipo iba adelantado). Pasos: dé la hora corregida y la incertidumbre que indicaría. Evidencia esperada: hora corregida y una frase sobre la incertidumbre. Rúbrica: 3 = 02:09:13Z; incertidumbre porque el desfase se midió más tarde y la deriva es desconocida, p. ej., «± unos segundos; desfase medido a las 03:10Z»; 2 = hora correcta sin incertidumbre; 1 = sentido equivocado; 0 = nada.
EX027 — Sitúe la línea BSD. Objetivo: tratar con seguridad los formatos heredados. Entradas: la línea de eng-ws-15 del Lab 7. Pasos: enumere lo que necesita para situarla en la cronología y escriba la regla de análisis que añadiría. Evidencia esperada: lista y regla. Rúbrica: 3 = el año a partir del contexto de la recogida, la zona horaria configurada en el equipo y su desfase medido; analizar con asignación explícita de zona y marcar el resultado como «zona supuesta»; 2 = regla sin registrar las suposiciones; 1 = descartarla; 0 = nada.
EX028 — Pregunta de punto ciego. Objetivo: emparejar preguntas con fuentes. Entradas: «¿Escribió alguien en KW-04 directamente desde el puerto local para portátil de la estación?». Pasos: indique qué fuentes podrían responderla, cuáles no y qué tendría que añadir. Evidencia esperada: análisis breve. Rúbrica: 3 = el cortafuegos y la captura del centro de control no pueden ver el tráfico local de la estación; los registros de la RTU podrían, si registra la configuración y las escrituras; añadir un sensor en la estación o el registro de la RTU y los registros de acceso físico; 2 = en parte; 1 = «revisar el cortafuegos»; 0 = nada.
Síntesis del capítulo
La telemetría es un conjunto de testigos parciales. Sepa lo que puede ver cada fuente, analice los formatos de forma estricta contando lo que no puede analizar y corrija cada reloj frente a una referencia antes de ordenar los eventos. Una cronología construida sobre relojes sin corregir puede invertir la causa y el efecto; una construida sobre relojes corregidos, con sus incertidumbres indicadas, es evidencia.
Siga estudiando — capítulo 07 de 18
← Capítulo 06 · Índice de capítulos del curso · Capítulo 08 →
Continúe con la siguiente lección escrita.