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:
- traducir los conductos declarados (capítulo 6) en una política de cortafuegos de primera coincidencia con denegación por defecto;
- evaluar un conjunto de reglas frente a flujos de prueba mediante código, y detectar las reglas sombreadas y redundantes;
- reconocer los patrones de configuración que amplían el acceso en silencio: reglas amplias «temporales», «duplicados» que se solapan, permisos para cualquier puerto;
- configurar el acceso de proveedores y el acceso remoto como limitados en el tiempo, registrados y encaminados a través de la zona de gestión;
- planificar un cambio de configuración de forma que pueda verificarse (capítulo 11) y revertirse.
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:
- Regla sombreada: una regla posterior cuyo tráfico coincide por completo con una regla anterior de acción contraria. Nunca llega a aplicarse, aunque su comentario diga que sí.
- Regla redundante: una regla posterior que coincide por completo con una regla anterior de la misma acción. Inofensiva hoy; confusa mañana, cuando alguien borre la anterior.
- «Duplicado» que amplía: una regla que parece una copia de otra pero tiene un origen, un destino o un puerto más amplios. No es redundante; es un permiso nuevo.
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
- Reglas temporales que sobreviven a su finalidad («permitir la red corporativa hacia el centro de control para la migración»).
- Permisos para cualquier puerto (
tcp any) donde hacía falta uno solo. - Orígenes de subred donde hacía falta un único equipo.
- Reglas sin responsable, incidencia ni caducidad.
- Acceso de gestión desde zonas de usuarios en lugar de a través del servidor de salto.
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:
- 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.
- 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).
- 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
- Revisar una regla nueva sin leer las reglas que tiene encima y que quizá ya permiten o deniegan el mismo tráfico.
- Borrar una regla amplia sin comprobar en los registros quién la usa actualmente.
- Tratar «parece un duplicado» como «se puede conservar sin riesgo».
- Configurar el acceso de proveedores como permanentemente activado «para emergencias».
-
El Lab 10 modela una política sin estado de primera coincidencia con contención exacta; los cortafuegos reales añaden estado, objetos, NAT y zonas, y sus propias herramientas de análisis.
-
Restringir R4 para corregir los fallos de tcp/3389 y tcp/445 sin comprobar primero en los registros qué equipos corporativos dependen hoy de ella.
- Activar una cuenta de proveedor para un trabajo con incidencia y olvidar desactivarla cuando se cierra la ventana fija.
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.