Parte: 10 — Seguridad en la nube y contenedores · Fuente: Martin & Hausenblas, "Hacking Kubernetes" (O'Reilly) y CIS Kubernetes Benchmark ⏱️ Duración estimada: 150 min · Nivel: Avanzado
⚠️ Aviso ético. Esta clase incluye técnicas ofensivas (escape de pods, abuso de RBAC, acceso a etcd/kubelet). Practícalas solo en tu propio clúster de laboratorio o con autorización explícita.
Endurecer un clúster Kubernetes según el CIS Benchmark y, a la vez, reproducir los ataques más comunes para entender por qué cada control importa: pods privilegiados y escape al nodo, abuso de tokens de ServiceAccount, escalada por RBAC, y acceso a kubelet/etcd. El alumno usará kube-bench, Pod Security Admission y NetworkPolicies para cerrar esas vías.
Al finalizar, el alumno podrá:
securityContext y NetworkPolicies restrictivas.| # | Tema | Por qué importa |
|---|---|---|
| 1 | kube-bench y CIS Benchmark | Base objetiva de hardening |
| 2 | Pod Security Admission | Reemplaza a las PodSecurityPolicies |
| 3 | securityContext y escape de pods | Contener el proceso y evitar el salto al nodo |
| 4 | RBAC peligroso y escalada | create pods, escalate, bind como vías a admin |
| 5 | Abuso de tokens de ServiceAccount | Movimiento lateral dentro del clúster |
| 6 | NetworkPolicy por defecto denegar | Contener movimiento lateral de red |
| 7 | Acceso a kubelet y etcd | Vectores de compromiso total |
privileged/baseline/restricted. Clave: restricted bloquea pods peligrosos por namespace.escalate/bind: verbos que permiten otorgarse más permisos. Clave: deben restringirse; equivalen a admin.k8s) y kubectl.# Auditar el clúster con kube-bench (CIS)
kube-bench run --targets master,node
# Ver permisos peligrosos con kubeaudit
kubeaudit all -f manifest.yaml
# Escaneo integral del clúster con Trivy
trivy k8s --report summary cluster
Todo en tu clúster de laboratorio. No apuntes a clústeres ajenos.
securityContext.privileged: true y hostPID: true; desde él, accede al filesystem del nodo (nsenter/chroot al host). Comprueba el escape.restricted en el namespace y vuelve a intentar desplegar el pod privilegiado; confirma que el admission lo rechaza.create pods y demuestra cómo, montando un pod con un ServiceAccount potente, se escala a más permisos.escalate/bind innecesarios y usa automountServiceAccountToken: false donde no se requiera.securityContext (runAsNonRoot, readOnlyRootFilesystem, drop ALL capabilities) y reejecuta kube-bench/kubeaudit para confirmar la mejora.securityContext que impida correr como root y monte el filesystem read-only.restricted y ajusta los pods que dejen de desplegar.* sobre * y propuestas de recorte.Parte de un clúster "por defecto" con un Deployment vulnerable y llévalo a un estado endurecido:
PSA restricted, NetworkPolicy default-deny, RBAC mínimo y securityContext en todos los pods.
Criterio de aceptación: el ataque de pod privilegiado del laboratorio ya no puede desplegarse
(rechazado por PSA), kube-bench muestra los controles antes fallidos como PASS, y un pod
comprometido ya no alcanza a otros pods por red.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| PSA no bloquea pods peligrosos | Namespace en modo privileged o solo warn; ponlo en enforce: restricted. |
| NetworkPolicy "no hace nada" | El CNI no la soporta; usa Calico/Cilium y aplica default-deny primero. |
| Pod no arranca tras hardening | runAsNonRoot sin usuario válido o ruta que exige escritura; ajusta UID y monta tmpfs. |
| RBAC amplio "porque es más fácil" | Superficie de escalada enorme; refactoriza a Roles concretos por namespace. |
| Token de SA robado da acceso total | SA con permisos excesivos y token automontado; recorta permisos y desactiva automount. |
❓ ¿Por qué desapareció PodSecurityPolicy y qué la reemplaza? Las PSP se eliminaron en Kubernetes 1.25 por ser complejas y confusas. Su reemplazo es Pod Security Admission (niveles baseline/restricted por namespace) o políticas con OPA Gatekeeper/Kyverno.
❓ ¿Un pod comprometido significa clúster comprometido? No necesariamente, pero puede escalar: si el pod es privilegiado escapa al nodo; si su ServiceAccount tiene permisos altos, ataca la API. Hardening (PSA, securityContext, RBAC mínimo, NetworkPolicy) rompe esa cadena.
❓ ¿Es suficiente kube-bench para asegurar el clúster? Es una base excelente de configuración CIS, pero no cubre RBAC excesivo, imágenes vulnerables ni cargas mal escritas. Complétalo con kubeaudit, Trivy y revisión de NetworkPolicies.
Clase 228 — Seguridad de Kubernetes: arquitectura