<a id="ch-06"></a>

## Capítulo 6 — Estructuras discretas

<!-- open-cyber-academy:lesson-figures:start ch-06 -->
### Mapa de la lección

Lección 06 publicada. Mapa, ejemplo, EX016.

```mermaid
flowchart TD
  N0["Resultados de aprendizaje"]
  N1["6.1 Zonas y conductos como grafo"]
  N2["6.2 Búsqueda en anchura"]
  N3["6.3 Aristas de corte"]
  N4["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Ejemplo resuelto"]
  EX --> Q["Ejercicio EX016"]
```

### Dibujo lógico

```mermaid
flowchart LR
  N0["Resultados de aprendizaje"]
  N1["6.1 Zonas y conductos como grafo"]
  N2["6.2 Búsqueda en anchura"]
  N3["6.3 Aristas de corte"]
  N4["Síntesis del capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX016"]
```

```text
[Resultados de aprendizaje]
    |
    v
[6.1 Zonas y conductos como grafo]
    |
    v
[6.2 Búsqueda en anchura]
    |
    v
[6.3 Aristas de corte]
    |
    v
[Síntesis del capítulo]
    |
    v
[Ejemplo resuelto] --> [Ejercicio EX016]
```
<!-- open-cyber-academy:lesson-figures:end ch-06 -->


### Resultados de aprendizaje

Usted podrá (1) modelar zonas y conductos como un grafo dirigido; (2) calcular la alcanzabilidad con búsqueda en anchura; (3) razonar sobre qué eliminación de una sola arista desconecta un nodo crítico; y (4) usar conjuntos para expresar listas de permitidos.

### 6.1 Zonas y conductos como grafo

IEC 62443-3-2 pide a los propietarios de activos dividir un sistema en zonas (grupos de activos que comparten requisitos de seguridad) conectadas por conductos (los canales de comunicación entre zonas). Un grafo dirigido lo captura: los nodos son zonas y las aristas son conductos en el sentido en que puede abrirse una sesión. Una ruta desde la zona corporativa hasta la zona de seguridad funcional es una cuestión de alcanzabilidad en un grafo, que resulta mecánica una vez dibujado el grafo con honestidad.

En el grafo del laboratorio, Maya registra los conductos como pares ordenados, de modo que MeterGW→SCADA y Control→SIS son aristas visibles y no líneas en un dibujo.

### 6.2 Búsqueda en anchura

La búsqueda en anchura (BFS) visita un nodo de inicio, después todos sus vecinos, después los vecinos de estos, y marca cada nodo visitado una sola vez. Se ejecuta en un tiempo proporcional a los nodos más las aristas, así que incluso la lista de conductos de una gran refinería se comprueba al instante. El peligro no está en el algoritmo sino en la entrada: un módem de un proveedor olvidado o un portátil con doble conexión es una arista que el diagrama omite.

```python
"""Lab 06: reachability over a synthetic LDHP zone/conduit graph (BFS)."""
from collections import deque
CONDUITS = {"Enterprise": ["DMZ"], "DMZ": ["SCADA"], "SCADA": ["Control"],
            "Control": ["SIS"], "MeterCloud": ["MeterGW"], "MeterGW": ["SCADA"], "SIS": []}
def reach(src):
    seen, q = {src}, deque([src])
    while q:
        for n in CONDUITS.get(q.popleft(), []):
            if n not in seen: seen.add(n); q.append(n)
    return seen
for z in ["Enterprise", "MeterCloud", "SCADA"]:
    r = sorted(reach(z) - {z}); print(f"{z:10} -> {r}  SIS reachable: {'SIS' in r}")
CONDUITS["Control"] = []  # design change: SIS gets its own hardwired trip, no Control->SIS data conduit
print("after removing Control->SIS:", "SIS" in reach("Enterprise"))
```

Ejecútelo con `python3 lab_reach.py`. Salida verificada:

```text
Enterprise -> ['Control', 'DMZ', 'SCADA', 'SIS']  SIS reachable: True
MeterCloud -> ['Control', 'MeterGW', 'SCADA', 'SIS']  SIS reachable: True
SCADA      -> ['Control', 'SIS']  SIS reachable: True
after removing Control->SIS: False
```

En LDHP, un módem de proveedor que nadie registró o una EWS-1 conectada a la vez a la red de oficina y a la de control añadiría una arista que el laboratorio no puede conocer; la respuesta de la BFS solo es tan cierta como la lista de conductos.

### 6.3 Aristas de corte

Una arista cuya eliminación desconecta las zonas expuestas al atacante de la zona crítica es una arista de corte para ese par. En el laboratorio, Control→SIS es una de ellas: eliminarla hace que SIS sea inalcanzable desde Enterprise y desde MeterCloud. La ingeniería suele preferir eliminar por completo un conducto de datos hacia un sistema de seguridad funcional y confiar en disparos cableados, que es exactamente lo que representa el cambio de diseño del laboratorio. La nota de Maya añade el segundo paso: la arista MeterGW→SCADA existe solo para que facturación pueda leer los totales de caudal, así que sustituirla por una exportación unidireccional desde el historiador elimina la otra ruta de la nube de contadores hacia la zona de control.

### Ejemplo resuelto (LDHP sintética)

El laboratorio muestra que la nube de contadores alcanza SIS a través de MeterGW → SCADA → Control → SIS. Maya expresa la lista de conductos como un conjunto de pares ordenados y señala que la arista MeterGW→SCADA existe solo para que facturación pueda leer los totales de caudal. Sustituirla por una exportación unidireccional desde el historiador elimina una segunda ruta; eliminar Control→SIS elimina la última.

> **Caso sintético — Lakeside District Heating Plant.** Los nombres de las zonas y los conductos del laboratorio son inventados para que el grafo sea lo bastante pequeño como para comprobarlo a mano.

### Errores y límites

La alcanzabilidad indica que puede abrirse una sesión, no que vaya a tener éxito ni lo que puede hacer. Los dibujos no dirigidos ocultan la diferencia entre «el SCADA sondea la pasarela» y «la pasarela puede conectarse al SCADA».

### Ejercicios — capítulo 6

- **EX016 — Seguir una BFS a mano.** Enumere el orden en que la BFS desde MeterCloud visita los nodos del grafo original. *Rúbrica:* 3 = MeterCloud, MeterGW, SCADA, Control, SIS; 2 = conjunto correcto, orden incorrecto; 1 = falta un nodo; 0 = nada.
- **EX017 — Un módem de proveedor omitido.** Un módem de proveedor da a internet un conducto directo hacia Control. Tras el cambio de diseño del laboratorio, ¿es SIS alcanzable desde internet? *Rúbrica:* 3 = no, Control no tiene arista saliente hacia SIS tras el cambio, pero el propio Control queda ahora expuesto; 2 = solo «no»; 1 = «sí»; 0 = nada.
- **EX018 — Lista de permitidos como conjunto.** Exprese «HIST-1 puede leer de PLC-H; HMI-1 puede leer y escribir en PLC-H» como un conjunto de tuplas (origen, destino, acción). *Rúbrica:* 3 = tres tuplas, nada más; 2 = algún extra menor; 1 = usa rangos de equipos; 0 = nada.

### Síntesis del capítulo

Dibujar zonas y conductos como un grafo dirigido convierte los argumentos de segmentación en comprobaciones que cualquiera puede volver a ejecutar, siempre que el grafo incluya todas las aristas reales.

### Siga estudiando — capítulo 06 de 40

[← Capítulo 05 (borrador)](#ch-05) · [Índice de capítulos del curso](../SUBJECTS.md) · [Capítulo 07 (borrador) →](#ch-07)

## Worked answers

<a id="answer-ex016"></a>
**EX016.** MeterCloud → MeterGW → SCADA → Control → SIS (cada nodo tiene una sola arista saliente, así que el orden de la cola es único).

<a id="answer-ex017"></a>
**EX017.** No: tras el cambio, Control no tiene ningún conducto saliente, así que la nueva arista Internet→Control no alcanza SIS. Sin embargo, sí expone el control a nivel de PLC directamente a internet, lo que es un hallazgo grave por sí mismo.

<a id="answer-ex018"></a>
**EX018.** {(HIST-1, PLC-H, read), (HMI-1, PLC-H, read), (HMI-1, PLC-H, write)}.
