OpenCyber Academy
Técnico · Capítulo 10 · Español
Código del curso: OCA-069Capítulo 10: OCA-069-C010

Capítulo 10 — Infraestructura crítica y seguridad sectorial: configuración de controles

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.

Mapa de la lección

Lección 10 publicada. Mapa, ejemplo, EX037.

flowchart TD
  N0["Resultados de aprendizaje y conexión"]
  N1["10.1 Los conjuntos de reglas como programas"]
  N2["10.2 Patrones que erosionan una política"]
  N3["10.3 Acceso remoto y de proveedores"]
  N4["10.5 Planificación de cambios"]
  N5["10.6 Actividad práctica"]
  N6["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
  N6 --> EX["Ejemplo resuelto"]
  EX --> Q["Ejercicio EX037"]

Dibujo lógico

flowchart LR
  N0["Resultados de aprendizaje y conexión"]
  N1["10.1 Los conjuntos de reglas como programas"]
  N2["10.2 Patrones que erosionan una política"]
  N3["10.3 Acceso remoto y de proveedores"]
  N4["10.5 Planificación de cambios"]
  N5["10.6 Actividad práctica"]
  N6["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX037"]
[Resultados de aprendizaje y conexión]
    |
    v
[10.1 Los conjuntos de reglas como programas]
    |
    v
[10.2 Patrones que erosionan una política]
    |
    v
[10.3 Acceso remoto y de proveedores]
    |
    v
[10.5 Planificación de cambios]
    |
    v
[10.6 Actividad práctica]
    |
    v
[Síntesis del capítulo]
    |
    v
[Ejemplo resuelto] --> [Ejercicio EX037]

Resultados de aprendizaje y conexión

Al terminar este capítulo debería ser capaz de:

Los capítulos 6–9 describieron y observaron el sistema. Este capítulo lo cambia, empezando por el control que limita más directamente quién puede alcanzar un protocolo sin autenticación: el cortafuegos del conducto.

10.1 Los conjuntos de reglas como programas

La mayoría de los cortafuegos de red evalúan las reglas de arriba abajo y aplican la primera coincidencia. La guía de cortafuegos del NIST describe el diseño de políticas, la denegación por defecto y la gestión de los conjuntos de reglas (SP 800-41 Rev. 1). Pensar en un conjunto de reglas como en un pequeño programa aclara tres defectos:

El orden importa, así que todo cambio debe revisarse en su contexto, no como una línea aislada.

10.2 Patrones que erosionan una política

Las mitigaciones principales de CISA para la tecnología operacional insisten en eliminar la exposición a internet, cambiar las contraseñas por defecto, proteger el acceso remoto y segmentar la TI de la TO (CISA primary mitigations for OT).

10.3 Acceso remoto y de proveedores

Configure el acceso de proveedores para que solo exista cuando haga falta: la cuenta o la ruta está desactivada por defecto; se activa para un trabajo con incidencia y una ventana fija; se autentica con autenticación multifactor en el servidor de salto; la sesión queda registrada; y se dispara una alerta ante cualquier uso fuera de una ventana activada. El aviso de CISA sobre actores patrocinados por el Estado chino describe actores que mantienen un acceso prolongado a entornos de infraestructuras críticas, también mediante cuentas válidas y acceso remoto (CISA AA24-038A); por eso el acceso permanente es un hallazgo aunque hoy nadie lo esté usando indebidamente.

10.4 Ejemplo resuelto: fw-01 (sintético)

La política de fw-01 entre las zonas del KVROC tiene siete reglas. El Lab 10 la comprueba en busca de sombreados y frente a cinco flujos de prueba, cada uno con el resultado que espera la lista de conductos. Lab 10 (guárdelo como lab10.py y ejecútelo con python3 lab10.py):

# Lab 10 - evaluate a first-match firewall policy and find shadowed rules (offline, stdlib)
# Synthetic conduit policy for fw-01 between Kestrel Vale zones; addresses are RFC 1918.
from ipaddress import ip_address, ip_network
rules = [  # id, action, source, destination, protocol, port (None = any)
    ("R1", "allow", "10.20.0.10/32", "10.10.0.0/16", "tcp", 502),    # SCADA server polls stations
    ("R2", "allow", "10.20.0.15/32", "10.10.0.0/16", "tcp", 502),    # engineering workstation
    ("R3", "allow", "10.90.0.20/32", "10.20.0.0/24", "tcp", 22),     # jump host to control centre
    ("R4", "allow", "10.30.0.0/16",  "10.20.0.0/24", "tcp", None),   # "temporary" corporate access
    ("R5", "deny",  "10.30.3.0/24",  "10.20.0.0/24", "tcp", 3389),   # intended: block RDP from desks
    ("R6", "allow", "10.20.0.0/24",  "10.10.4.0/24", "tcp", 502),    # duplicate of R1 for KW-04
    ("R7", "deny",  "0.0.0.0/0",     "0.0.0.0/0",    "any", None),   # default deny
]
def matches(rule, src, dst, proto, port):
    _, _, s, d, p, pt = rule
    return (ip_address(src) in ip_network(s) and ip_address(dst) in ip_network(d)
            and p in ("any", proto) and pt in (None, port))
def covers(a, b):   # does earlier rule a match everything rule b matches?
    return (ip_network(b[2]).subnet_of(ip_network(a[2])) and ip_network(b[3]).subnet_of(ip_network(a[3]))
            and a[4] in ("any", b[4]) and a[5] in (None, b[5]))
for i, r in enumerate(rules):
    for earlier in rules[:i]:
        if covers(earlier, r):
            kind = "redundant" if earlier[1] == r[1] else "SHADOWED (never takes effect)"
            print(f"{r[0]} {kind}: fully covered by {earlier[0]}"); break
tests = [("10.20.0.10", "10.10.4.2", "tcp", 502, "allow"), ("10.30.3.7", "10.20.0.5", "tcp", 3389, "deny"),
         ("10.30.3.7", "10.10.4.2", "tcp", 502, "deny"), ("10.30.8.2", "10.20.0.5", "tcp", 445, "deny"),
         ("10.20.0.12", "10.10.4.2", "tcp", 502, "deny")]
for src, dst, proto, port, expect in tests:
    hit = next(r for r in rules if matches(r, src, dst, proto, port))
    status = "PASS" if hit[1] == expect else "FAIL"
    print(f"{status} {src}->{dst} {proto}/{port}: {hit[1]} by {hit[0]} (expected {expect})")

Salida esperada (Python 3.13.5):

R5 SHADOWED (never takes effect): fully covered by R4
PASS 10.20.0.10->10.10.4.2 tcp/502: allow by R1 (expected allow)
FAIL 10.30.3.7->10.20.0.5 tcp/3389: allow by R4 (expected deny)
PASS 10.30.3.7->10.10.4.2 tcp/502: deny by R7 (expected deny)
FAIL 10.30.8.2->10.20.0.5 tcp/445: allow by R4 (expected deny)
FAIL 10.20.0.12->10.10.4.2 tcp/502: allow by R6 (expected deny)

Tres hallazgos:

  1. R4 sombrea a R5. El comentario dice que el RDP desde los puestos corporativos está bloqueado, pero R4 ya permitía todo el TCP desde 10.30.0.0/16, de modo que R5 nunca se aplica: el «bloqueo» nunca ha funcionado.
  2. R4 es el verdadero problema. Una regla «temporal» permite todos los puertos TCP desde toda la zona corporativa hacia el centro de control. Sus pruebas fallan (se permiten RDP y SMB). Fíjese en lo que las pruebas no muestran: R7 deniega el puerto 502 de las estaciones a los puestos corporativos, así que fw-01 no explica las escrituras desde el puesto corporativo capturadas en KW-04 en el capítulo 2. Esa ruta tiene que existir en otro lugar; regístrela como abierta (el capítulo 13 la encuentra).
  3. R6 no es un duplicado de R1. Permite a toda la subred del centro de control escribir en KW-04, incluido 10.20.0.12, que no tiene nada que hacer allí.

Un cambio sólido: borrar R4 (tras confirmar con el responsable qué sigue usándola; los registros del cortafuegos lo mostrarán); subir el bloqueo de RDP por encima de cualquier permiso si sigue haciendo falta, o confiar en la denegación por defecto; sustituir R6 por nada (R1 y R2 ya cubren las rutas necesarias). Vuelva a ejecutar el evaluador con el nuevo conjunto de reglas antes del cambio, y las pruebas en servicio después (capítulo 11).

10.5 Planificación de cambios

Todo cambio de configuración en un entorno de control necesita: el antes y el después exactos; el motivo (hallazgo o requisito); el efecto esperado, escrito como pruebas; un plan de reversión; la ventana acordada con operaciones; y quién verifica. La guía del NIST sobre gestión de la configuración orientada a la seguridad describe las líneas base y el control de cambios (SP 800-128). La exportación del cortafuegos antes y después es evidencia; calcule su hash (capítulo 5).

Exporte el conjunto de reglas y calcule su hash antes y después del cambio, y guarde ambos resúmenes en el registro de cambio. Escriba el efecto esperado como las mismas pruebas que ejecuta el Lab 10, de modo que la verificación sea una nueva ejecución y no una invención nueva. Acuerde la ventana con operaciones y nombre a quién confirmará que el sondeo del SCADA sigue cumpliendo el requisito de frescura después del cambio.

10.6 Actividad práctica

Reescriba la política de fw-01 a partir de la lista de conductos del capítulo 6: una regla por conducto declarado, cada una con incidencia y responsable en su comentario, y después la denegación por defecto. Ejecute el Lab 10 sobre su versión hasta que las cinco pruebas se superen y ninguna regla quede sombreada ni sea redundante. Añada dos pruebas propias para el conducto C3. Ponga cada permiso por encima de la denegación por defecto, con la incidencia y el responsable en el comentario. Elimine R4 y R6 en lugar de intentar remendarlas. Añada dos pruebas para el conducto C3: servidor de salto hacia el centro de control por tcp/22, permitido, y un puesto corporativo hacia el mismo puerto, denegado. Vuelva a ejecutar hasta que todas las pruebas se superen y ninguna regla quede sombreada ni sea redundante.

10.7 Errores comunes y límites

Ejercicios — capítulo 10

EX037 — Explique el sombreado. Objetivo: razonar sobre el orden. Entradas: el Lab 10. Pasos: (1) suba R5 por encima de R4 y prediga los resultados de las pruebas; (2) ejecute y compare. Evidencia esperada: predicción y salida. Rúbrica: 3 = no se notifica ningún sombreado; la prueba 2 (RDP) se supera (denegación por R5); la prueba 4 (SMB) sigue fallando (permiso por R4); la prueba 5 sigue fallando (R6); 2 = casi todo; 1 = conjeturas; 0 = nada.

EX038 — Corrija la política. Objetivo: producir un conjunto de reglas correcto. Entradas: el Lab 10. Pasos: elimine R4 y R6 (conserve R5 o elimínela justificándolo); ejecute. Evidencia esperada: nueva lista de reglas y salida con cinco líneas PASS. Rúbrica: 3 = cinco líneas PASS; justificación sobre R5 (redundante con la denegación por defecto una vez eliminada R4, así que eliminarla o conservarla para un registro explícito); señala que antes hay que comprobar en los registros quién usa R4; 2 = se superan sin justificación; 1 = parcial; 0 = nada.

EX039 — Configuración del acceso de proveedores. Objetivo: configurar un acceso limitado en el tiempo. Entradas: el proveedor de los relés de SS-3 necesita acceso remoto unas dos veces al año. Pasos: especifique el estado de la cuenta, los pasos de activación, la ruta, la autenticación, el registro, las alertas y la caducidad. Evidencia esperada: una especificación de configuración. Rúbrica: 3 = desactivada por defecto; activada por la guardia del KVROC conforme a una incidencia aprobada por Kestrel Grid; ruta a través de jump-01 con MFA y grabación de la sesión; nunca directamente a la red de los relés; alerta ante un uso fuera de ventana; caducidad automática; revisión al día siguiente; 2 = falta un elemento; 1 = «VPN para el proveedor»; 0 = nada.

EX040 — Detecte las ampliaciones. Objetivo: ampliar el evaluador. Entradas: la función covers del Lab 10. Pasos: añada una comprobación que notifique cuándo una regla posterior con la misma acción se solapa parcialmente con una anterior y es más amplia en origen o destino. Evidencia esperada: código y salida. Rúbrica: 3 = notifica que R6 amplía R1 (el origen /24 contiene el /32 de R1; el destino /24 está dentro del /16; mismo puerto), explica por qué merece revisión; 2 = lo detecta sin explicación; 1 = intentado; 0 = nada.

Síntesis del capítulo

Un conjunto de reglas de cortafuegos es un programa de primera coincidencia, y sus defectos son defectos de programa: reglas sombreadas que nunca actúan, reglas redundantes que confunden y reglas de apariencia similar que amplían el acceso. Configure los conductos con una regla por finalidad declarada y denegación por defecto, mantenga desactivado el acceso de proveedores hasta que haga falta y planifique cada cambio con sus pruebas y su reversión. Después, verifique, que es el siguiente capítulo.

Respuestas desarrolladas

EX037 — Explique el sombreado. Con R5 por encima de R4: no se notifica ninguna regla sombreada; pruebas: 1 PASS, 2 PASS (denegación por R5), 3 PASS, 4 FAIL (SMB permitido por R4), 5 FAIL (R6). El cambio de orden cumplió la promesa del comentario sobre RDP, pero no resolvió la regla amplia.

EX038 — Corrija la política. Elimine R4 y R6. Las cinco pruebas dan PASS (RDP y SMB se deniegan ahora por R7; 10.20.0.12 se deniega por R7). R5 es ahora redundante con la denegación por defecto; consérvela solo si se quiere una categoría de registro aparte para los intentos de RDP (y entonces debe situarse por encima de cualquier permiso); en caso contrario, elimínela. Antes de eliminar R4, revise 30 días de registros de fw-01 para enumerar lo que usaba R4 y dar a cada uso legítimo su propio conducto.

EX039 — Configuración del acceso de proveedores. vendor-ss3 desactivada por defecto. Kestrel Grid abre una incidencia; la guardia del KVROC activa la cuenta durante una ventana fija (por ejemplo, 4 h) en la herramienta de acceso; el proveedor se conecta a jump-01 con MFA; la sesión se graba; jump-01 solo permite la dirección de gestión de la pasarela del proveedor y el puerto de ingeniería concreto de SS-3, nunca toda la red de la subestación; se dispara una alerta ante cualquier inicio de sesión fuera de una ventana activada; la cuenta se desactiva automáticamente; el siguiente día laborable se revisa el registro de la sesión frente a la incidencia.

EX040 — Detecte las ampliaciones. Añada: def overlaps(a, b): return ip_network(a[2]).overlaps(ip_network(b[2])) and ip_network(a[3]).overlaps(ip_network(b[3])) and (a[4] in ("any", b[4]) or b[4] == "any") and (a[5] is None or b[5] is None or a[5] == b[5]) y, para una regla posterior con la misma acción que se solapa pero no está cubierta, notifíquela cuando su origen o su destino no sea una subred del de la anterior. La salida verificada añade R6 broadens R1: same action, wider source 10.20.0.0/24, lo mismo para R2, y R7 broadens R5; esta última es la denegación por defecto prevista y debe excluirse (por ejemplo, omitiendo las reglas cuyo origen y destino son ambos 0.0.0.0/0). La revisión es necesaria porque, en una lectura rápida, la regla parece un duplicado, pero concede a toda la subred del centro de control acceso de escritura a KW-04.