El OWASP Kubernetes Top 10 y su laboratorio
En el curso Kubernetes: fundamentos y seguridad usted aprendió a desplegar cargas y a aplicar las primeras defensas. Ahora va a ordenar ese conocimiento con un mapa que usan equipos de plataforma, auditores y analistas de todo el mundo: el OWASP Kubernetes Top 10. Esta lección explica qué es, de dónde viene, por qué importa y qué conceptos dará por sabidos el resto del curso.
Qué es OWASP y qué es esta lista
OWASP, Open Worldwide Application Security Project, es una fundación sin fines de lucro que publica guías, herramientas y listas abiertas sobre seguridad de software. Su lista más conocida es el Top 10 de aplicaciones web, pero tiene otras para APIs, móviles, modelos de lenguaje y también para Kubernetes.
El OWASP Kubernetes Top 10 reúne los diez riesgos más frecuentes e importantes en clústeres reales. No es un estándar de cumplimiento como el CIS Benchmark, sino una lista priorizada para enfocar el esfuerzo: si su clúster resiste estos diez, cerró la mayoría de las puertas usadas en incidentes públicos.
Breve historia y contexto
| Año | Hito |
|---|---|
| 2001 | Nace OWASP como comunidad abierta de seguridad de aplicaciones |
| 2003 | Primera edición del OWASP Top 10 de aplicaciones web |
| 2014 | Google anuncia Kubernetes, inspirado en su sistema interno Borg |
| 2015 | Kubernetes 1.0 y donación a la recién creada CNCF |
| 2022 | Primera edición del OWASP Kubernetes Top 10; Pod Security Admission pasa a estable en la versión 1.25 |
| 2023 | OWASP cambia "Web" por "Worldwide" en su nombre |
Kubernetes significa "timonel" en griego; K8s reemplaza por un 8 sus ocho letras centrales. Al mudarse las aplicaciones a contenedores, muchos incidentes pasaron a ser fallas de configuración de la plataforma, y esta lista nació para nombrarlas con un vocabulario común.
| Edición 2022 (este curso) | Edición 2025 |
|---|---|
| K01 Configuraciones inseguras de cargas | K01 |
| K02 Vulnerabilidades de la cadena de suministro | Sin ítem propio |
| K03 Configuraciones RBAC demasiado permisivas | K02 Autorización demasiado permisiva |
| K04 Falta de aplicación centralizada de políticas | K04 |
| K05 Registro y monitoreo inadecuados | K10 |
| K06 Mecanismos de autenticación rotos | K09 |
| K07 Falta de segmentación de red | K05 |
| K08 Fallas en la gestión de secretos | K03 |
| K09 Componentes del clúster mal configurados | K07 Componentes del clúster mal configurados y vulnerables |
| K10 Componentes desactualizados y vulnerables | K07 (fusionado con K09) |
| No existía | K06 Componentes de Kubernetes demasiado expuestos (nuevo) |
| No existía | K08 Movimiento lateral del clúster a la nube (nuevo) |
Por qué importa y dónde se usa
Un manifiesto mal escrito puede entregar un nodo, y un permiso de más, el clúster completo. Como Kubernetes acepta casi cualquier configuración sin quejarse, quien no conoce estos riesgos los repite. La lista se usa en:
- Revisiones de código: comentar "K03" en un pull request deja claro el riesgo.
- Auditorías: agrupar hallazgos por identificador hace comparables los informes.
- Pipelines de CI/CD, donde escáneres como Trivy revisan cada cambio.
- Servicios administrados como EKS, AKS y GKE: el proveedor cuida parte del plano de control, pero las cargas, el RBAC y la red siguen siendo suyos.
Conceptos clave
| Concepto | Qué significa |
|---|---|
| Pod | La unidad mínima que ejecuta uno o más contenedores |
| Namespace | Un espacio lógico que separa recursos y permisos dentro del clúster |
| Manifiesto | El archivo YAML que describe un objeto que se quiere crear |
| API server | El componente que recibe y valida toda petición al clúster |
| etcd | La base de datos donde el clúster guarda todos sus objetos |
| ServiceAccount | La identidad que usa un pod para hablar con el API server |
| Admisión | El paso en que el API server valida o rechaza un objeto antes de guardarlo |
| CNI | El plugin de red que conecta los pods y aplica las NetworkPolicy |
Los diez riesgos
| ID | Riesgo | Módulo |
|---|---|---|
| K01 | Configuración insegura de cargas de trabajo | 1 |
| K02 | Vulnerabilidades de la cadena de suministro | 1 |
| K03 | Configuraciones RBAC demasiado permisivas | 2 |
| K04 | Falta de aplicación centralizada de políticas | 3 |
| K05 | Registro y monitoreo inadecuados | 3 |
| K06 | Mecanismos de autenticación rotos | 2 |
| K07 | Falta de controles de segmentación de red | 3 |
| K08 | Fallas en la gestión de secretos | 2 |
| K09 | Componentes del clúster mal configurados | 3 |
| K10 | Componentes de Kubernetes desactualizados y vulnerables | 1 |
El curso los agrupa por la pregunta que responden, no por número. De cada uno verá qué es, por qué pasa, un caso público, el YAML vulnerable frente al corregido y cómo se detecta; nunca cadenas de ataque completas.
Cómo leer las sintaxis y pedir ayuda
En las fichas de comandos, lo que va entre corchetes es opcional, lo que va en MAYÚSCULAS lo reemplaza usted y ... indica que se puede repetir. Cuando dude, pregúntele a la propia herramienta:
kubectl auth can-i --help
kubectl explain pod.spec.securityContext--help muestra la sintaxis y los ejemplos de cada subcomando; kubectl explain documenta cualquier campo de un manifiesto sin salir de la terminal. Estas opciones generales de kubectl aparecerán en casi todas las lecciones:
| Opción | Qué hace | Ejemplo |
|---|---|---|
-A | Todos los namespaces | kubectl get networkpolicy -A |
-o wide | Más columnas | kubectl get nodes -o wide |
-L ETIQUETA | Agrega una columna con el valor de esa etiqueta | kubectl get ns -L app |
--field-selector | Filtra por campos como type o reason | --field-selector reason=FailedCreate |
--as | Hace la petición como otra identidad | --as=system:anonymous |
Su laboratorio: kind
Los laboratorios corren en un clúster local creado con kind, Kubernetes IN Docker: cada nodo es un contenedor de Docker en su computadora.
kind create cluster [--name NOMBRE] [--image IMAGEN_DE_NODO]
kind get clusters
kind delete cluster [--name NOMBRE]Si crea dos veces el mismo clúster, verá ERROR: failed to create cluster: node(s) already exist for a cluster with the name "owasp-k8s": use el existente o bórrelo primero.