La seguridad informática se explica mal cuando se explica en abstracto. Por eso este curso entero gira alrededor de una empresa concreta, con sus servidores, sus clientes, sus prisas y su presupuesto limitado. En esta primera lección conocerás esa empresa, aprenderás qué es exactamente la seguridad informática y en qué se diferencia de términos que se usan como sinónimos sin serlo, y fijarás el vocabulario que vas a usar durante las siete módulos siguientes. Si confundes amenaza con vulnerabilidad o riesgo con impacto, todo lo demás se vuelve confuso: las conversaciones con proveedores, los informes de auditoría y hasta los boletines de seguridad se leen mal. Aquí ponemos ese vocabulario en orden.
Contenido
- Nimbus Reservas, S.L.: la empresa que nos acompañará todo el curso
- Qué es la seguridad informática (y qué no es)
- La tríada CIA: confidencialidad, integridad y disponibilidad
- Cómo se rompe cada propiedad: ejemplos en código
- Más allá de la tríada: autenticidad, no repudio y trazabilidad
- El trío AAA: autenticación, autorización y auditoría
- Vocabulario base: activo, amenaza, vulnerabilidad, exploit, riesgo, impacto y control
- La seguridad como proceso continuo y como compromiso
- Nimbus Reservas, S.L.: la empresa que nos acompañará todo el curso
Nimbus Reservas, S.L. es una PYME española de 38 empleados con oficina en Valencia. Desarrolla y opera un SaaS (software como servicio) de gestión de reservas y citas que utilizan clínicas de fisioterapia, gimnasios y academias de toda España. Sus clientes no compran un programa: entran en una web, y sus pacientes o alumnos reservan hora desde el móvil.
Qué datos maneja Nimbus:
| Dato | Ejemplo | Por qué es sensible |
|---|---|---|
| Identidad del cliente final | Nombre, apellidos, DNI en algunos casos | Permite identificar a personas concretas |
| Contacto | Correo electrónico, teléfono | Vector directo de fraude y suplantación |
| Historial de citas | «15/03, fisioterapia, rehabilitación de rodilla» | En clínicas revela indirectamente información de salud |
| Facturación | Importes, conceptos, datos fiscales del negocio cliente | Información económica sujeta a obligaciones legales |
| Pagos | Token de tarjeta devuelto por la pasarela externa | Nimbus no guarda el número de tarjeta, pero sí la referencia |
Ese tercer punto es el que cambia todo. Nimbus no cree ser una empresa «de datos sensibles» porque solo gestiona agendas, pero una agenda de una clínica de fisioterapia es, en la práctica, un listado de personas con dolencias. El curso volverá sobre las implicaciones legales de esto en la lección de RGPD (06-03); de momento quédate con la idea: el dato aparentemente inocuo puede ser sensible por el contexto en el que vive.
Cómo está montado técnicamente:
flowchart LR
subgraph Clientes
SPA[SPA web]
APP[App movil]
end
SPA --> API
APP --> API
API["API REST\nPython / FastAPI"]
API --> DB[(PostgreSQL)]
API --> S3[Bucket S3\nadjuntos y copias]
API --> MAIL[Proveedor de email\ntransaccional]
API --> PAY[Pasarela de pago]
CI["GitHub Actions\nCI/CD"] -->|despliega contenedores| API
Las personas:
- Marta — CTO. Decide arquitectura y prioridades; es quien tiene que justificar el presupuesto de seguridad ante la dirección.
- Iván — desarrollador backend. Escribe la API en Python/FastAPI.
- Lucía — administradora de sistemas y DevOps. Lleva la nube, los contenedores y el CI/CD.
- Rubén — soporte a clientes. Es quien más veces al día toca datos reales de clientes finales.
- Sara — responsable de administración y RRHH. Custodia nóminas, contratos y facturación.
El entorno físico y humano: oficina en Valencia con una wifi corporativa y una de invitados, unos 40 portátiles, y la mitad de la plantilla trabajando en remoto. Hay tres terceros con los que Nimbus depende: una consultora que da soporte de sistemas con acceso remoto, el proveedor de email transaccional y la pasarela de pago.
Todos los datos, nombres e incidentes de este curso son ficticios. Nimbus no existe; su parecido con empresas reales es exactamente el punto.
- Qué es la seguridad informática (y qué no es)
Tres términos se usan como sinónimos y no lo son. La diferencia no es pedantería: determina quién es responsable de qué dentro de una organización.
| Término | Qué protege | Alcance | Ejemplo en Nimbus |
|---|---|---|---|
| Seguridad de la información | La información, en cualquier soporte | El más amplio: incluye papel, conversaciones, procesos, personas | Sara guarda los contratos firmados en un archivador cerrado con llave |
| Seguridad informática | La información y los recursos en sistemas informáticos | Sistemas, redes, software, hardware, datos digitales | Cifrar el disco de los 40 portátiles |
| Ciberseguridad | Los sistemas frente a amenazas provenientes del ciberespacio | Centrada en el adversario y en sistemas conectados | Defender la API de Nimbus del escaneo automatizado de Internet |
Una forma sencilla de recordarlo:
flowchart TD
SI[Seguridad de la informacion\ncualquier soporte] --> SINF[Seguridad informatica\nsistemas y datos digitales]
SINF --> CIBER[Ciberseguridad\namenazas desde redes conectadas]
Cada círculo está dentro del anterior, pero no encajan perfectamente: la ciberseguridad también se ocupa de cosas que no son información (la disponibilidad de un servicio, por ejemplo, o el control de un dispositivo industrial).
Definición de trabajo para este curso:
La seguridad informática es el conjunto de medidas técnicas, organizativas y humanas destinadas a preservar la confidencialidad, la integridad y la disponibilidad de la información y de los sistemas que la tratan, ante fallos accidentales o acciones deliberadas.
Fíjate en tres palabras de esa definición:
- «Conjunto»: no es un producto que se compra. Un cortafuegos no «da seguridad»; es una pieza.
- «Humanas»: la mayoría de incidentes empieza con una persona haciendo algo razonable en un contexto engañoso.
- «Fallos accidentales o acciones deliberadas»: si Lucía borra por error el bucket de copias, el daño es idéntico al de un atacante que lo borre. La seguridad informática cubre ambos casos; la ciberseguridad se centra sobre todo en el segundo.
El alcance completo de la ciberseguridad, con su terminología propia y su marco de trabajo, se desarrolla en la lección 02-01. Aquí nos quedamos con la distinción.
- La tríada CIA: confidencialidad, integridad y disponibilidad
La tríada CIA (por sus siglas en inglés: Confidentiality, Integrity, Availability) es el modelo mental sobre el que se apoya todo lo demás. Cuando no sepas si algo es «un problema de seguridad», pregúntate: ¿rompe alguna de las tres?
3.1 Confidencialidad
Definición: la información solo es accesible para quien está autorizado a acceder a ella.
Confidencialidad no es lo mismo que secreto. El horario de apertura de una clínica cliente de Nimbus es público y no pierde nada por serlo. Confidencialidad significa que cada dato tiene un círculo de acceso definido y ese círculo se respeta.
Contraejemplos concretos en Nimbus (fallos de confidencialidad):
- Un endpoint
/api/v1/reservas/{id}que devuelve la reserva pedida sin comprobar que pertenece al cliente que la pide. Un usuario del Gimnasio Levante puede leer las citas de la Clínica Turia cambiando el número en la URL. - Rubén, en soporte, exporta a un CSV la lista completa de clientes finales para «hacer una prueba» y la deja en su carpeta de Descargas, en un portátil sin cifrar.
- El bucket S3 de adjuntos configurado con lectura pública porque así era más fácil servir las imágenes de perfil.
- Los logs de la API imprimen el cuerpo completo de las peticiones, incluidos teléfonos y notas de la cita, y esos logs los ve toda la consultora externa.
3.2 Integridad
Definición: la información es exacta y completa, y solo se modifica de forma autorizada y controlada.
La integridad tiene dos caras que conviene separar:
- Integridad del dato: el dato no ha sido alterado (ni por un atacante, ni por un error de software, ni por un fallo de disco).
- Integridad del origen: el dato viene de quien dice venir (esto solapa con la autenticidad, que veremos en el apartado 5).
Contraejemplos concretos en Nimbus (fallos de integridad):
- Un script de mantenimiento ejecuta un
UPDATEsinWHEREy pone el mismo estado a las 240.000 reservas de la base de datos. - El importe de una factura se recalcula en el navegador y la API se fía de lo que le manda el cliente, en lugar de recalcularlo en el servidor.
- Dos peticiones simultáneas reservan la misma franja horaria porque no hay control de concurrencia: la agenda queda inconsistente.
- Un atacante modifica un registro de auditoría para borrar el rastro de lo que hizo.
3.3 Disponibilidad
Definición: la información y los servicios están accesibles cuando quien está autorizado los necesita.
Es la propiedad que más a menudo se olvida al hablar de «seguridad», y la que más rápido nota el cliente. Si la Clínica Turia abre a las 8:00 y la API de Nimbus no responde, a las 8:05 el teléfono de Rubén está sonando.
Contraejemplos concretos en Nimbus (fallos de disponibilidad):
- Un ransomware cifra los servidores y las copias de seguridad accesibles desde la misma red.
- El certificado TLS del dominio caduca un domingo y la app móvil deja de conectar.
- Un despliegue rompe una migración de base de datos y hay que revertir a mano durante tres horas.
- El proveedor de email transaccional sufre una caída y no salen los recordatorios de cita: técnicamente la API funciona, pero el servicio que el cliente compró, no.
3.4 Las tres juntas, y sus tensiones
| Propiedad | Pregunta que responde | Se rompe cuando... | Control típico |
|---|---|---|---|
| Confidencialidad | ¿Quién puede verlo? | Alguien no autorizado lo lee | Cifrado, control de acceso, minimización |
| Integridad | ¿Es correcto y no ha cambiado? | Alguien o algo lo altera indebidamente | Validación, hashes/firmas, transacciones, permisos de escritura |
| Disponibilidad | ¿Está cuando hace falta? | El servicio o el dato no se puede usar | Copias, redundancia, capacidad, plan de recuperación |
Las tres compiten entre sí. Si Marta decide cifrar la base de datos con una clave que solo ella conoce, gana confidencialidad y pierde disponibilidad (si Marta está de baja, nadie restaura). Si Lucía da permisos de lectura a todo el equipo para que nadie se bloquee, gana disponibilidad y pierde confidencialidad. Buena parte del trabajo de seguridad consiste en elegir conscientemente el punto de equilibrio, no en maximizar una propiedad.
- Cómo se rompe cada propiedad: ejemplos en código
Ver el fallo en código lo fija mucho mejor que la definición. Los tres ejemplos siguientes están escritos sobre la API de Iván y la base de datos de Nimbus.
4.1 Romper la confidencialidad: la consulta que devuelve de más
# api/reservas.py -- VERSION VULNERABLE
from fastapi import APIRouter
router = APIRouter()
@router.get("/api/v1/reservas/{reserva_id}")
async def obtener_reserva(reserva_id: int, db=Depends(get_db)):
fila = await db.fetch_one(
"SELECT * FROM reservas WHERE id = :id",
{"id": reserva_id},
)
return filaQué hace, línea a línea:
- Declara un endpoint que recibe un
reserva_idpor la URL. - Consulta la tabla
reservasfiltrando solo por ese identificador. - Devuelve la fila entera tal cual.
Por qué rompe la confidencialidad: hay dos fallos independientes.
- No comprueba la propiedad del recurso. La consulta no filtra por el negocio (
tenant) del usuario autenticado. Cualquiera que tenga una sesión válida puede pedir/api/v1/reservas/91544y leer la cita de un paciente de otro cliente. Este patrón tiene nombre propio: IDOR (referencia directa insegura a objetos), y lo veremos entre los ataques del módulo 2. SELECT *devuelve columnas de más. Aunque el usuario tuviera derecho a ver la reserva, la fila incluye campos internos (notas_internas,id_pasarela_pago,creado_por_usuario_id) que no deberían salir de la base de datos.
Versión corregida:
# api/reservas.py -- VERSION CORREGIDA
@router.get("/api/v1/reservas/{reserva_id}")
async def obtener_reserva(reserva_id: int, usuario=Depends(get_usuario_actual), db=Depends(get_db)):
fila = await db.fetch_one(
"""
SELECT id, fecha_hora, servicio, estado, cliente_final_nombre
FROM reservas
WHERE id = :id
AND tenant_id = :tenant -- el recurso debe ser del negocio del usuario
""",
{"id": reserva_id, "tenant": usuario.tenant_id},
)
if fila is None:
raise HTTPException(status_code=404, detail="No encontrada")
return filaDos cambios y ambos importan: el AND tenant_id = :tenant ata el recurso al usuario autenticado, y la lista explícita de columnas evita filtrar campos internos. Además, se devuelve 404 y no 403: así el atacante no aprende si el identificador existe o no.
4.2 Romper la integridad: el UPDATE sin control
-- Ejecutado por error en produccion durante un mantenimiento nocturno
UPDATE reservas
SET estado = 'cancelada';Qué ocurre: sin cláusula WHERE, PostgreSQL actualiza todas las filas de la tabla. Las 240.000 reservas de todos los clientes de Nimbus pasan a estado «cancelada». Nadie ha entrado en el sistema; no ha habido ataque. La integridad se ha roto igual.
Cómo se protege una operación así:
-- 1. Envolver siempre en una transaccion y comprobar antes de confirmar
BEGIN;
UPDATE reservas
SET estado = 'cancelada'
WHERE tenant_id = 42
AND fecha_hora::date = DATE '2026-08-14' -- el dia que la clinica cierra
AND estado = 'confirmada';
-- 2. Verificar el numero de filas afectadas ANTES de confirmar
-- Si el numero no cuadra con lo esperado, se deshace todo:
-- ROLLBACK;
COMMIT;Explicación de cada defensa:
BEGIN/COMMITcrean una transacción: hasta que no se confirma, nada es definitivo. Si el recuento de filas sorprende, unROLLBACKlo deja todo como estaba.- El
WHEREacota por tres criterios en lugar de uno. Cuanto más específico, menos daño puede hacer un error. - La condición
estado = 'confirmada'hace la operación idempotente y acotada: no toca reservas ya canceladas.
A esto se añaden defensas estructurales que veremos en 01-03: la cuenta con la que la API se conecta a la base de datos no debería tener permiso para hacer un UPDATE masivo, y los mantenimientos deberían ejecutarse con una cuenta distinta y revisada por una segunda persona.
4.3 Romper la disponibilidad: la consulta que tumba el servicio
# Endpoint de informes -- VERSION PELIGROSA
@router.get("/api/v1/informes/historico")
async def informe_historico(db=Depends(get_db)):
# Sin limite de fechas, sin paginacion, sin timeout
return await db.fetch_all("SELECT * FROM reservas ORDER BY fecha_hora")Por qué rompe la disponibilidad: cada llamada carga en memoria la tabla entera y la ordena. Basta con que Rubén pulse «Actualizar» cinco veces seguidas para que el proceso de la API consuma toda la memoria del contenedor, el orquestador lo reinicie y todos los clientes vean errores. No hace falta un atacante: la fragilidad ya está ahí, y un atacante lo único que hace es descubrirla y repetirla.
Versión defendida:
@router.get("/api/v1/informes/historico")
async def informe_historico(
desde: date, hasta: date, pagina: int = 1,
usuario=Depends(get_usuario_actual), db=Depends(get_db),
):
if (hasta - desde).days > 366:
raise HTTPException(400, "El rango maximo es de 366 dias")
return await db.fetch_all(
"""
SELECT id, fecha_hora, servicio, estado
FROM reservas
WHERE tenant_id = :tenant AND fecha_hora BETWEEN :desde AND :hasta
ORDER BY fecha_hora
LIMIT 500 OFFSET :offset
""",
{"tenant": usuario.tenant_id, "desde": desde, "hasta": hasta,
"offset": (pagina - 1) * 500},
)Tres defensas de disponibilidad en pocas líneas: límite de rango (nadie pide diez años de golpe), paginación con LIMIT (el coste de cada petición está acotado) y filtro por tenant (que además vuelve a proteger la confidencialidad). Una sola corrección puede reforzar varias propiedades a la vez; es lo habitual.
- Más allá de la tríada: autenticidad, no repudio y trazabilidad
La tríada CIA cubre mucho, pero no todo. Tres propiedades adicionales aparecen constantemente en normativas y contratos.
5.1 Autenticidad
Definición: la garantía de que una entidad (persona, sistema, mensaje) es realmente quien o lo que dice ser.
Es distinta de la confidencialidad. Un correo puede llegar cifrado —confidencial— y venir de un remitente falso —no auténtico—. En Nimbus: cuando llega un correo diciendo «Soy Marta, cambia la cuenta bancaria de la nómina», la pregunta que falla no es ¿quién puede leerlo? sino ¿realmente lo escribió Marta?.
5.2 No repudio
Definición: la imposibilidad de que quien realizó una acción pueda negar después haberla realizado.
Es una propiedad jurídica antes que técnica. Si un cliente de Nimbus reclama que él nunca canceló 200 citas, Nimbus necesita poder demostrar que la petición vino de su sesión, desde su IP, a esa hora y con su token. Técnicamente se apoya en firmas digitales (módulo 3) y en registros de auditoría íntegros.
5.3 Trazabilidad
Definición: la capacidad de reconstruir qué ocurrió, quién lo hizo, cuándo y sobre qué recurso.
Sin trazabilidad no hay investigación posible de un incidente. Es la diferencia entre poder decirle a un cliente «se accedió a estos 14 registros el martes a las 03:12 desde esta cuenta» y tener que decirle «no lo sabemos». Ante un regulador, la segunda respuesta es mucho peor que la primera.
| Propiedad | Pregunta | Se apoya en | Ejemplo en Nimbus |
|---|---|---|---|
| Autenticidad | ¿Eres quien dices ser? | Credenciales, firmas, certificados | Verificar la firma del webhook de la pasarela de pago |
| No repudio | ¿Puedes negar que lo hiciste? | Firma digital + log íntegro | Registro firmado de las cancelaciones masivas |
| Trazabilidad | ¿Qué pasó exactamente? | Logs con actor, acción, recurso y hora | Log de accesos de Rubén a fichas de clientes |
Ejemplo de una línea de log de Nimbus que sostiene la trazabilidad:
2026-07-30T03:12:44Z level=INFO event=data_access actor_id=u-1042 [email protected]
tenant=42 action=read resource=cliente_final:88231 fields=[nombre,telefono,historial]
ip=203.0.113.55 user_agent="NimbusSoporte/2.1" request_id=7f3a91cc trace_id=b21e...Fíjate en qué contiene y en qué no contiene: hay quién, qué, cuándo, sobre qué y desde dónde, pero no hay valores de los datos leídos. Un log de auditoría que copie los datos sensibles se convierte él mismo en un problema de confidencialidad.
- El trío AAA: autenticación, autorización y auditoría
AAA es el modelo operativo que implementa buena parte de lo anterior. Se confunden constantemente los dos primeros, así que vamos despacio.
| Pregunta | Momento | En la API de Nimbus | |
|---|---|---|---|
| Autenticación (Authentication) | ¿Quién eres? | Al iniciar sesión / en cada petición | Validar el token JWT del cabecero Authorization |
| Autorización (Authorization) | ¿Qué puedes hacer? | En cada acción | Comprobar que el rol permite cancelar reservas de ese tenant |
| Auditoría / Accounting | ¿Qué hiciste? | Después, y de forma continua | Registrar el evento en el log de accesos |
Visto como flujo en una petición real de Nimbus:
sequenceDiagram
participant R as Ruben (soporte)
participant API as API Nimbus
participant DB as PostgreSQL
participant LOG as Log de auditoria
R->>API: DELETE /api/v1/reservas/91544 (token)
API->>API: 1. AUTENTICACION: token valido y no caducado?
API->>API: 2. AUTORIZACION: rol soporte + reserva del tenant 42?
API->>DB: UPDATE reservas SET estado='cancelada' WHERE id=91544 AND tenant_id=42
API->>LOG: 3. AUDITORIA: actor, accion, recurso, hora, IP
API-->>R: 204 No Content
Y en código, separando explícitamente las tres responsabilidades:
@router.delete("/api/v1/reservas/{reserva_id}", status_code=204)
async def cancelar_reserva(
reserva_id: int,
peticion: Request,
usuario=Depends(get_usuario_actual), # (1) AUTENTICACION
db=Depends(get_db),
):
# (2) AUTORIZACION: dos comprobaciones distintas y ambas necesarias
if "reservas:cancelar" not in usuario.permisos:
raise HTTPException(403, "Permiso insuficiente")
afectadas = await db.execute(
"UPDATE reservas SET estado='cancelada' WHERE id=:id AND tenant_id=:t AND estado='confirmada'",
{"id": reserva_id, "t": usuario.tenant_id}, # ...y el recurso debe ser suyo
)
if afectadas == 0:
raise HTTPException(404, "No encontrada")
# (3) AUDITORIA
logger.info(
"event=reserva_cancelada actor_id=%s tenant=%s recurso=reserva:%s ip=%s",
usuario.id, usuario.tenant_id, reserva_id, peticion.client.host,
)Los tres errores clásicos que este código evita:
- Confundir autenticar con autorizar. «Está logueado» no significa «puede hacerlo». La comprobación de permisos es una línea distinta de la validación del token.
- Autorizar solo por rol y olvidar el recurso. Rubén tiene el permiso
reservas:cancelar, sí — pero solo sobre las reservas de los tenants que le corresponden. Rol y pertenencia. - Registrar solo los errores. El log de auditoría debe registrar también las acciones exitosas sobre datos sensibles; son precisamente las que hay que poder reconstruir después.
Las técnicas concretas para autenticar bien —MFA, SSO, gestión de sesiones, modelos RBAC y ABAC— se desarrollan en la lección 02-05. Aquí solo necesitas tener claros los tres conceptos y su orden.
- Vocabulario base: activo, amenaza, vulnerabilidad, exploit, riesgo, impacto y control
Este es el apartado que más veces vas a releer. Estos siete términos se usan mal a diario, incluso en informes profesionales.
| Término | Definición | Naturaleza | Ejemplo en Nimbus |
|---|---|---|---|
| Activo | Algo que tiene valor para la organización y que por tanto merece protección | Lo que tienes | La base de datos PostgreSQL con las reservas |
| Amenaza | Un evento o actor potencial capaz de causar daño a un activo | Lo que existe ahí fuera, no lo controlas | Un grupo de ransomware que escanea Internet buscando bases de datos expuestas |
| Vulnerabilidad | Una debilidad de un activo o de un control que una amenaza puede aprovechar | Lo que falla en tu lado, sí lo controlas | El puerto 5432 de PostgreSQL accesible desde Internet con contraseña débil |
| Exploit | El medio concreto (código, técnica o procedimiento) que aprovecha una vulnerabilidad | La herramienta que materializa la amenaza | Un script que prueba credenciales por defecto contra ese puerto |
| Riesgo | La combinación de la probabilidad de que una amenaza aproveche una vulnerabilidad y del impacto resultante | Una estimación, no un hecho | «Alta probabilidad de acceso no autorizado a la BD, con impacto crítico» |
| Impacto | La consecuencia real para el negocio si el riesgo se materializa | El daño, medible | Parada de 2 días, notificación a la AEPD, pérdida de 6 clientes |
| Control | La medida (técnica, organizativa o física) que reduce el riesgo | Lo que haces al respecto | Cerrar el puerto, exigir VPN, rotar credenciales, alertar de intentos |
La frase-tipo que los encadena. Memoriza esta estructura; sirve para escribir cualquier hallazgo de seguridad de forma profesional:
Una amenaza [grupos de ransomware que escanean Internet] podría aprovechar una vulnerabilidad [el puerto 5432 expuesto con credenciales débiles] mediante un exploit [un script de fuerza bruta de credenciales] sobre un activo [la base de datos de reservas], con un impacto [cifrado de datos, parada del servicio y notificación obligatoria a la autoridad]. El riesgo resultante se estima alto, y se mitiga con el control [restringir el acceso a la red privada y exigir autenticación por certificado].
Practica reescribiendo hallazgos con esa plantilla. Un informe que dice «tenemos una amenaza de puerto abierto» está usando mal las palabras: un puerto abierto es una vulnerabilidad, no una amenaza.
Las tres confusiones más frecuentes:
- Amenaza vs. vulnerabilidad. La amenaza está fuera y no la eliminas (no puedes hacer que los grupos de ransomware dejen de existir). La vulnerabilidad está dentro y sí la puedes cerrar. Tu trabajo se ejerce sobre las vulnerabilidades y los controles, no sobre las amenazas.
- Riesgo vs. impacto. El impacto es «cuánto duele si pasa». El riesgo incorpora además «cuán probable es que pase». Un impacto catastrófico con probabilidad ínfima puede ser un riesgo menor que un impacto moderado que ocurre cada semana.
- Vulnerabilidad vs. exploit. La vulnerabilidad es el agujero; el exploit es la ganzúa. Existen vulnerabilidades sin exploit conocido (menos urgentes) y vulnerabilidades con exploit público y automatizado (mucho más urgentes).
El catálogo detallado de amenazas y de tipos de vulnerabilidad, con sus identificadores CVE y CVSS, es el contenido de la lección siguiente (01-02). La forma de calcular y priorizar el riesgo con matrices llega en 04-01.
- La seguridad como proceso continuo y como compromiso
8.1 No es un estado, es un ciclo
Marta podría contratar una auditoría, corregir todos los hallazgos y declarar «Nimbus es seguro». Duraría poco:
- Cada semana se publican vulnerabilidades nuevas en las dependencias que usa Iván.
- Cada despliegue de CI/CD cambia el sistema, y con él la superficie de ataque.
- Cada persona que entra o sale de la empresa cambia el mapa de accesos.
- Los atacantes cambian de técnica cuando la anterior deja de funcionar.
Por eso la seguridad se modela como un ciclo continuo, no como un proyecto con fecha de fin:
flowchart LR
ID[Identificar\nactivos y riesgos] --> PR[Proteger\ncontroles]
PR --> DE[Detectar\nmonitorizacion]
DE --> RE[Responder\nincidentes]
RE --> RC[Recuperar\ncontinuidad]
RC --> ID
Este ciclo —identificar, proteger, detectar, responder, recuperar— es la columna vertebral del curso: los módulos 4 y 5 lo desarrollan entero. Fíjate en que proteger es solo una quinta parte. Una organización que solo invierte en protección y no puede detectar ni responder está apostando a no fallar nunca, lo cual no es una estrategia.
8.2 El compromiso: seguridad, usabilidad y coste
Toda medida de seguridad se paga en alguna de estas monedas:
| Medida en Nimbus | Gana | Cuesta |
|---|---|---|
| Cifrar los 40 portátiles | Confidencialidad si se pierde uno | Tiempo de despliegue, riesgo de perder claves de recuperación |
| Exigir segundo factor a Rubén en cada acceso | Confidencialidad, autenticidad | Segundos por sesión; posible rechazo del equipo |
| Copias de seguridad cada hora en otra región | Disponibilidad, integridad | Coste de almacenamiento y transferencia |
| Revisión manual de cada despliegue | Integridad | Velocidad de entrega; frustración del equipo |
| Bloquear el acceso a la BD salvo por VPN | Confidencialidad | Fricción para la consultora externa |
La pregunta correcta nunca es «¿es esto seguro?», porque la respuesta siempre es «no del todo». La pregunta correcta es:
¿Cuánto riesgo estamos aceptando, quién lo ha aceptado por escrito y a cambio de qué?
Ese «quién» importa mucho: la aceptación de un riesgo es una decisión de negocio, no técnica. Lucía puede explicar que no cifrar las copias supone tal riesgo, pero quien acepta convivir con él es la dirección. Volveremos a ello en la lección de políticas de seguridad (04-02).
Y un corolario práctico: una medida de seguridad que la gente no puede cumplir no protege, sino que genera atajos. Si Nimbus obliga a cambiar la contraseña cada 30 días con reglas imposibles, acabará habiendo un post-it bajo el teclado. Este es el principio de aceptabilidad psicológica, que veremos formalmente en 01-03.
Errores Comunes y Consejos
Errores comunes al empezar en seguridad:
- Creer que «no tenemos nada interesante». Es el error más caro en una PYME. Nimbus no tiene secretos de estado, pero tiene datos personales de miles de personas, una infraestructura cloud que un atacante puede usar para minar criptomonedas y una relación de confianza con clientes que sirve de puente hacia ellos. La mayoría de ataques son oportunistas y automatizados: no eligen a la víctima, la encuentran.
- Reducir la seguridad a la confidencialidad. Muchos equipos piensan solo en «que no roben datos» y descuidan integridad y disponibilidad, que son las que paran el negocio de forma más inmediata.
- Usar «amenaza» para todo. «Tenemos varias amenazas en el informe de escaneo» — no: tienes vulnerabilidades. Usar el vocabulario con precisión mejora las decisiones, porque cada término apunta a un tipo de acción distinta.
- Confundir autenticado con autorizado. Es el origen de una fracción enorme de fugas de datos en APIs multi-cliente como la de Nimbus.
- Tratar la seguridad como una fase final. «Cuando terminemos el producto, hacemos la revisión de seguridad». Corregir un fallo de diseño después cuesta órdenes de magnitud más que evitarlo.
- Confiar en que el proveedor cloud «ya se encarga». El proveedor asegura la infraestructura; la configuración, los permisos y los datos son responsabilidad de Nimbus. Es el modelo de responsabilidad compartida, que se detalla en 05-07.
Consejos:
- Ante cualquier decisión técnica, pregúntate: ¿esto afecta a la C, a la I o a la D? Es un filtro sorprendentemente eficaz.
- Escribe los hallazgos con la frase-tipo del apartado 7. Te obligará a saber si estás describiendo una amenaza, una vulnerabilidad o un riesgo.
- Cuando propongas un control, indica siempre su coste y su fricción. Una propuesta de seguridad sin coste declarado no se aprueba, se ignora.
- Empieza por lo que sabes que tienes. Nada de lo que viene en este curso funciona sin inventario (01-04).
Ejercicios
Ejercicio 1 — Clasificar incidentes según la tríada CIA
Para cada situación de Nimbus, indica qué propiedad(es) de la tríada CIA se ven afectadas y justifica brevemente:
- Lucía descubre que el bucket S3 con los adjuntos de las citas (partes médicos escaneados) permite lectura anónima desde hace 4 meses.
- Un despliegue introduce un error que hace que el campo
estadode las reservas se guarde siempre comopendiente, aunque el usuario la confirme. - El proveedor de email transaccional sufre una caída de 6 horas y no salen los recordatorios de cita.
- Un exempleado conserva su cuenta activa y accede al panel de administración dos semanas después de irse, exporta la lista de clientes y borra su propio registro del log.
Ejercicio 2 — Reescribir un hallazgo con vocabulario correcto
El siguiente párrafo, escrito por un becario, mezcla los términos. Identifica los usos incorrectos y reescríbelo usando la frase-tipo del apartado 7.
«Hemos detectado un riesgo grave: el servidor de pruebas tiene una amenaza porque usa la contraseña
admin1234. El impacto es que hay un exploit. Recomendamos un control de vulnerabilidad.»
Ejercicio 3 — Separar autenticación, autorización y auditoría
Lee este endpoint de la API de Nimbus e identifica qué elementos de AAA están presentes, cuáles faltan y qué propiedad de seguridad queda comprometida por cada ausencia.
@router.get("/api/v1/clientes-finales/exportar")
async def exportar_clientes(usuario=Depends(get_usuario_actual), db=Depends(get_db)):
filas = await db.fetch_all("SELECT * FROM clientes_finales")
return {"total": len(filas), "datos": filas}Soluciones
Solución 1
- Confidencialidad, de forma grave: documentos con información de salud accesibles sin autorización. Añadido: si el bucket también permitiera escritura, habría además un problema de integridad; conviene comprobarlo. El hecho de que lleve 4 meses agrava el impacto, porque no se puede acotar quién accedió (fallo de trazabilidad).
- Integridad: el dato almacenado no refleja la realidad. No hay acceso indebido ni caída del servicio, pero la información es incorrecta. Secundariamente afecta a la disponibilidad funcional del servicio (las clínicas no pueden operar con una agenda que no confirma), aunque la causa raíz es de integridad.
- Disponibilidad: el servicio contratado (avisar a los pacientes) no está disponible, aunque la API responda. Es un buen ejemplo de que la disponibilidad se mide desde el punto de vista del cliente, no del servidor, y de que depende también de terceros.
- Las tres, y además propiedades extendidas: confidencialidad (exporta datos sin autorización), integridad (altera el log borrando su rastro), disponibilidad no directamente, pero sí trazabilidad y no repudio destruidos al manipular la auditoría. Es también un fallo de proceso: la baja del empleado no desencadenó la revocación de accesos.
Solución 2
Usos incorrectos:
- «tiene una amenaza porque usa la contraseña
admin1234» → una contraseña débil es una vulnerabilidad, no una amenaza. - «El impacto es que hay un exploit» → un exploit no es un impacto; el impacto es la consecuencia para el negocio.
- «control de vulnerabilidad» → un control es una medida concreta; hay que nombrarla.
- «Hemos detectado un riesgo grave» aplicado a un hecho observado: lo observado es la vulnerabilidad; el riesgo es la estimación que se deriva de ella.
Reescritura correcta:
Hemos identificado una vulnerabilidad en el servidor de pruebas: la cuenta administrativa usa la contraseña por defecto
admin1234. La amenaza correspondiente son los procesos automatizados que rastrean Internet probando credenciales conocidas, que disponen de exploits públicos y triviales para este caso. El activo afectado es el servidor de pruebas, que además contiene una copia parcial de datos reales de reservas. El impacto estimado incluye el acceso no autorizado a datos personales, el uso del servidor como punto de salto hacia la red interna y la posible notificación obligatoria a la autoridad de control. Valoramos el riesgo como alto por la facilidad de explotación. Controles propuestos: rotar la credencial a una contraseña única generada, restringir el acceso administrativo a la red privada y eliminar los datos reales del entorno de pruebas.
Solución 3
- Autenticación: presente. La dependencia
get_usuario_actualvalida quién hace la petición. - Autorización: ausente por partida doble. No se comprueba (a) que el usuario tenga un permiso específico de exportación, ni (b) que los datos devueltos pertenezcan a su tenant. La consulta
SELECT * FROM clientes_finalessinWHEREdevuelve los clientes finales de todos los negocios clientes de Nimbus. Cualquier usuario autenticado, incluido el recepcionista de un gimnasio, obtiene la base de datos completa. Propiedad comprometida: confidencialidad, de forma masiva. - Auditoría: ausente. Una exportación completa de datos personales es exactamente el tipo de acción que debe quedar registrada. Sin ello se pierden trazabilidad y no repudio: si mañana aparecen esos datos publicados, Nimbus no podrá saber quién los sacó.
- Extra — disponibilidad: cargar la tabla entera en memoria y serializarla en JSON, sin paginación ni límites, hace el endpoint vulnerable a un agotamiento de recursos, igual que en el apartado 4.3.
Versión corregida en lo esencial:
@router.get("/api/v1/clientes-finales/exportar")
async def exportar_clientes(peticion: Request, usuario=Depends(get_usuario_actual), db=Depends(get_db)):
if "clientes:exportar" not in usuario.permisos: # autorizacion por permiso
raise HTTPException(403, "Permiso insuficiente")
filas = await db.fetch_all(
"SELECT id, nombre, email FROM clientes_finales WHERE tenant_id = :t LIMIT 5000",
{"t": usuario.tenant_id}, # autorizacion por recurso
)
logger.info("event=exportacion_clientes actor_id=%s tenant=%s filas=%s ip=%s",
usuario.id, usuario.tenant_id, len(filas), peticion.client.host) # auditoria
return {"total": len(filas), "datos": filas}Conclusión
En esta lección has conocido a Nimbus Reservas —la PYME valenciana cuyo SaaS de reservas nos servirá de laboratorio durante todo el curso— y has fijado el vocabulario que hace posible el resto. Has visto que seguridad de la información, seguridad informática y ciberseguridad son círculos concéntricos y no sinónimos; que la tríada CIA (confidencialidad, integridad, disponibilidad) es el filtro con el que evaluar cualquier decisión técnica, y cómo se rompe cada una de sus propiedades con código real: una consulta sin filtro de tenant, un UPDATE sin WHERE, un endpoint sin paginación. Has añadido a la tríada la autenticidad, el no repudio y la trazabilidad, y has ordenado el trío AAA —autenticar, autorizar, auditar— separando explícitamente las tres responsabilidades en un endpoint de FastAPI.
Sobre todo, has separado siete palabras que se confunden a diario: activo, amenaza, vulnerabilidad, exploit, riesgo, impacto y control, y tienes una frase-tipo que las encadena para redactar cualquier hallazgo con precisión. Y has aceptado la premisa incómoda del oficio: la seguridad no es un estado que se alcanza, sino un ciclo que se mantiene, y siempre se paga en usabilidad o en dinero.
Con el vocabulario ya en su sitio, toca llenarlo de contenido. En la siguiente lección, Tipos de Amenazas y Vulnerabilidades (01-02), veremos el catálogo real: qué amenazas existen según su origen y su objetivo, qué familias de malware hay y cómo se distinguen, qué tipos de vulnerabilidades encontraremos en el entorno de Nimbus, y cómo se leen los identificadores que usa toda la industria —CWE, CVE y CVSS— para nombrar y priorizar los agujeros que hay que cerrar.
Curso de Fundamentos de Seguridad Informática
Módulo 1: Introducción a la Seguridad Informática
- Conceptos Básicos de Seguridad Informática
- Tipos de Amenazas y Vulnerabilidades
- Principios de la Seguridad Informática
- Activos, Superficie de Ataque y Actores de Amenaza
Módulo 2: Ciberseguridad
- Definición y Alcance de la Ciberseguridad
- Tipos de Ataques Cibernéticos
- Ingeniería Social y Phishing
- Medidas de Protección en Ciberseguridad
- Identidad, Autenticación y Control de Acceso
- Casos de Estudio de Incidentes de Ciberseguridad
Módulo 3: Criptografía
- Introducción a la Criptografía
- Criptografía Simétrica
- Criptografía Asimétrica
- Funciones Hash, HMAC y Almacenamiento de Contraseñas
- Protocolos Criptográficos
- Gestión de Claves, Certificados y PKI
- Aplicaciones de la Criptografía
Módulo 4: Gestión de Riesgos y Medidas de Protección
- Evaluación de Riesgos
- Políticas de Seguridad
- Controles de Seguridad
- Riesgo de Terceros y Cadena de Suministro
- Plan de Respuesta a Incidentes
- Recuperación ante Desastres y Continuidad de Negocio
Módulo 5: Herramientas y Técnicas de Seguridad
- Herramientas de Análisis de Vulnerabilidades
- Técnicas de Monitoreo y Detección
- Pruebas de Penetración
- Seguridad en Redes
- Seguridad en Aplicaciones
- Hardening de Sistemas y Seguridad del Endpoint
- Seguridad en la Nube y en Contenedores
Módulo 6: Buenas Prácticas y Normativas
- Buenas Prácticas en Seguridad Informática
- Normativas y Estándares de Seguridad
- Protección de Datos Personales y RGPD en la Práctica
- Cumplimiento y Auditoría
- Formación y Concienciación
- Ética, Aspectos Legales y Divulgación Responsable
