◇ OpenCyber Academy
Ingeniería · Capítulo 17 · Español

Capítulo 17 — Fundamentos de control y realimentació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 17 — Fundamentos de control y realimentación

Mapa de la lección

Lección 17 publicada. Mapa, ejemplo, EX034.

flowchart TD
  N0["Resultados de aprendizaje y conexión"]
  N1["17.1 Realimentación"]
  N2["17.2 Control PI"]
  N3["17.3 Datos falsos y el controlador confiado"]
  N4["17.4 Detección basada en residuos"]
  N5["17.6 Actividad práctica: Lab 7"]
  N6["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
  N6 --> EX["Ejemplo resuelto"]
  EX --> Q["Ejercicio EX034"]

Dibujo lógico

flowchart LR
  N0["Resultados de aprendizaje y conexión"]
  N1["17.1 Realimentación"]
  N2["17.2 Control PI"]
  N3["17.3 Datos falsos y el controlador confiado"]
  N4["17.4 Detección basada en residuos"]
  N5["17.6 Actividad práctica: Lab 7"]
  N6["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX034"]
[Resultados de aprendizaje y conexión]
    |
    v
[17.1 Realimentación]
    |
    v
[17.2 Control PI]
    |
    v
[17.3 Datos falsos y el controlador confiado]
    |
    v
[17.4 Detección basada en residuos]
    |
    v
[17.6 Actividad práctica: Lab 7]
    |
    v
[Síntesis del capítulo]
    |
    v
[Ejemplo resuelto] --> [Ejercicio EX034]

Resultados de aprendizaje y conexión

Al terminar este capítulo, usted podrá (1) describir el control en lazo abierto y en lazo cerrado, las consignas, el error y los límites de los actuadores; (2) explicar el control proporcional-integral (PI) y la saturación del integrador (wind-up); (3) analizar cómo los datos de sensor falsos, una inyección de datos falsos, llevan a un controlador correcto a un estado inseguro; y (4) diseñar una detección basada en residuos con mediciones físicas independientes e indicar sus puntos ciegos. Se apoya en el capítulo 6 y prepara los capítulos 27 y 33.

17.1 Realimentación

Un controlador en lazo cerrado mide una variable de proceso, la compara con una consigna y ajusta un actuador para reducir el error. La realimentación hace que los sistemas sean robustos frente a las perturbaciones y los errores de modelo, y hace que confíen por completo en sus sensores. Feedback Systems, de Åström y Murray, disponible gratuitamente en línea, es el texto de referencia de este capítulo. En Hollin Hill, el controlador PI ajusta el caudal de entrada de PS3 para mantener el nivel del depósito en su consigna. Ve el depósito solo a través del transmisor de nivel, de modo que lo que informe ese transmisor es, para el controlador, la verdad. El resto de este capítulo sigue las consecuencias de esa confianza.

17.2 Control PI

Un controlador proporcional fija la salida del actuador en $u = K_p e$; deja un error en régimen permanente cuando debe compensarse una perturbación constante. Añadir un término integral, $u = K_p e + K_i\int e\,dt$, elimina el error en régimen permanente porque la integral sigue creciendo hasta que el error es cero. Los actuadores se saturan (una bomba no puede dar más que su caudal máximo) y, mientras están saturados, la integral sigue creciendo (saturación del integrador), lo que causa un sobreimpulso cuando el actuador sale de la saturación. El antisaturación (anti-wind-up) detiene la integración mientras dura la saturación.

17.3 Datos falsos y el controlador confiado

Si un atacante añade un sesgo $b$ a la medición de nivel, el controlador regula el nivel medido a la consigna, de modo que el nivel real se estabiliza en la consigna menos $b$. El controlador funciona perfectamente; el proceso no. Este es el núcleo de los ataques conscientes del proceso: Stuxnet, según el análisis de Langner (2011), manipuló las velocidades de las centrifugadoras mientras reproducía ante los operadores valores de apariencia normal. Las defensas no pueden basarse en el mismo flujo de datos del sensor que controla el atacante.

En Hollin Hill, un transmisor de nivel sesgado bajaría el nivel real mientras la pantalla del operador mostraba la consigna, así que la defensa debe venir de una medición independiente.

17.4 Detección basada en residuos

Un residuo es la diferencia entre lo que dice una medición y lo que predice un modelo independiente. Para un depósito, el balance de masa predice el cambio de nivel a partir de los caudales de entrada y de salida medidos de forma independiente: $\Delta h = (q_{in} - q_{out})\Delta t / A$. Dos detectores: un residuo por paso compara el cambio del nivel medido con el cambio predicho en un paso; un residuo acumulado compara el nivel medido con el nivel integrado a partir de los caudales desde la última calibración de confianza. El detector por paso detecta un sesgo abrupto, pero no una deriva lenta; el detector acumulado detecta la deriva, pero acumula el error de los medidores, así que necesita recalibraciones periódicas y un umbral por encima de la deriva normal de los medidores. Un atacante que también controle los caudalímetros anula ambos: la independencia de los caminos de medición es el verdadero control.

17.5 Ejemplo resuelto: ataque al nivel de Hollin Hill (sintético)

El Lab 7 simula durante 48 h el control PI de Hollin Hill (superficie en planta de 1.000 m², consigna de 3,0 m, caudal de salida de 300 m³/h, bomba de entrada de 0–600 m³/h). Un sesgo escalón de +1,5 m a las 10 h lleva el nivel real a 1,5 m; ambos detectores alarman a las 10,0 h. Un sesgo de +0,04 m, lo bastante pequeño para parecer un error del sensor, solo lo detecta el detector acumulado. Una rampa lenta de 0,05 m/h elude por completo al detector por paso; el detector acumulado alarma a las 10,6 h, cuando el sesgo es de unos 0,03 m. Sin detección, la rampa deja el nivel real en 1,1 m al cabo de 48 h.

17.6 Actividad práctica: Lab 7

# Lab 7 - PI level control under sensor-bias attacks, and two residual detectors (synthetic, offline)
def run(attack=None, hours=48, dt=0.1):
    A = 1000.0                         # m2 reservoir plan area: level h (m), volume A*h (m3)
    h, integ, sp, kp, ki = 3.0, 7.5, 3.0, 400.0, 40.0   # integ preloaded so u = 300 at start
    est = h                            # mass-balance estimate from independently metered flows
    prev_meas, step_t, cum_t, hmin = h, None, None, h
    for k in range(int(hours / dt)):
        t = k * dt
        b = attack(t) if attack else 0.0
        meas = h + b
        err = sp - meas
        u = kp * err + ki * integ
        q_in = min(max(u, 0.0), 600.0)              # pump limits 0..600 m3/h
        if 0.0 < u < 600.0: integ += err * dt         # anti-windup
        q_out = 300.0
        if k > 0 and step_t is None and abs((meas - prev_meas) - (est - est_prev)) > 0.05: step_t = round(t, 1)
        if cum_t is None and abs(meas - est) > 0.03: cum_t = round(t, 1)
        prev_meas, est_prev = meas, est
        h += (q_in - q_out) / A * dt; est += (q_in - q_out) / A * dt
        hmin = min(hmin, h)
    return round(h, 2), round(hmin, 2), step_t, cum_t
print("columns: true final level m, true min level m, step-detector alarm h, cumulative-detector alarm h")
print("no attack        ", run())
print("step bias +1.5 m ", run(lambda t: 1.5 if t >= 10 else 0.0))
print("step bias +0.04 m", run(lambda t: 0.04 if t >= 10 else 0.0))
print("ramp 0.05 m/h    ", run(lambda t: 0.05 * (t - 10) if t >= 10 else 0.0))

Salida esperada:

columns: true final level m, true min level m, step-detector alarm h, cumulative-detector alarm h
no attack         (3.0, 3.0, None, None)
step bias +1.5 m  (1.5, 1.4, 10.0, 10.0)
step bias +0.04 m (2.96, 2.95, None, 10.0)
ramp 0.05 m/h     (1.1, 1.1, None, 10.6)

Lea las cuatro filas a la luz del ejemplo resuelto. Sin ataque, el nivel se mantiene en tres metros y ningún detector se activa. El sesgo escalón grande lo detectan ambos detectores a la vez, y el nivel real se estabiliza metro y medio por debajo. El escalón pequeño y la rampa lenta son los casos en que los detectores difieren: solo el detector acumulado los ve, y la rampa, si no se hace nada, arrastra el nivel real hasta alrededor de un metro. Recuerde que los caudalímetros del laboratorio son perfectos, de modo que los tiempos de detección reales serían más tardíos.

17.7 Errores comunes y límites

Para Hollin Hill, el EX034 muestra claramente el problema de la dependencia: el sensor de nivel y el caudalímetro de entrada están cableados ambos a la RTU3, de modo que comprometer una sola RTU anula los dos lados del residuo.

Ejercicios — capítulo 17

EX033 — Compromiso del umbral. Objetivo: ajustar un detector. Entradas: Lab 7. Pasos: (1) añada ruido gaussiano de desviación típica 0,01 m al nivel medido (semilla 17) y cuente las falsas alarmas del detector acumulado en el caso sin ataque con umbrales de 0,03 y 0,05; (2) informe el tiempo de detección de la rampa con ambos umbrales; (3) recomiende un umbral. Evidencia esperada: tabla y recomendación. Rúbrica: 3 = experimento implementado correctamente, compromiso explicado, recomendación ligada al tiempo de respuesta; 2 = un solo umbral; 1 = no ejecutado; 0 = nada.

EX034 — Argumento de independencia. Objetivo: argumentar la independencia de la detección. Entradas: la arquitectura de LRWA: el sensor de nivel y el caudalímetro de entrada, ambos cableados a la RTU3; el caudalímetro de salida en PS4, en la RTU4. Pasos: identifique qué posiciones del atacante anulan el detector de residuos y proponga un cambio de arquitectura que mejore la independencia. Evidencia esperada: media página. Rúbrica: 3 = el compromiso de la RTU3 anula tanto el nivel como el caudal de entrada, el cambio propone un camino separado (p. ej., un transmisor de nivel independiente hacia un registrador separado o una comprobación física con indicador de nivel); 2 = parcial; 1 = genérico; 0 = nada.

Síntesis del capítulo

La realimentación hace que los sistemas sean robustos y crédulos. Un sensor sesgado lleva a un controlador correcto a un estado físico incorrecto. Detecte con residuos construidos a partir de una física independiente, use pruebas por paso y acumuladas para los ataques abruptos y lentos, fije los umbrales a partir del ruido medido y recuerde que la independencia de los caminos de medición, y no la astucia del algoritmo, es lo que derrota a un atacante capaz.

Siga estudiando — capítulo 17 de 50

← Capítulo 16 · Índice de capítulos del curso · Capítulo 18 →

Continúe con la siguiente lección escrita.

Respuestas desarrolladas

EX033. Semilla 17, ruido σ = 0,01 m, 48 h: umbral de 0,03 m → 2 episodios de falsa alarma sin ataque (≈ 1 por día), primera alarma de la rampa de 0,05 m/h a las 10,7 h; umbral de 0,05 m → 0 episodios de falsa alarma, primera alarma de la rampa a las 10,9 h. Recomendación: 0,05 m; el retardo de detección de 0,2 h es pequeño frente a horas de autonomía, mientras que las falsas alarmas diarias enseñarían a los operadores a ignorar el detector. Vuelva a comprobarlo con datos de ruido reales.

EX034. Comprometer la RTU3 permite a un atacante falsificar tanto el nivel como el caudal de entrada, de modo que puede hacer coherente el balance de masa y el residuo sigue siendo pequeño; comprometer solo la RTU4 falsifica el caudal de salida y es detectable. Mejora: un transmisor de nivel independiente cableado a un registrador separado (otro controlador y otro camino de comunicaciones), o una lectura física periódica del indicador de nivel comparada con el SCADA.