Introducción

Kubernetes se ha convertido en la plataforma de orquestación de contenedores por excelencia, pero su flexibilidad viene acompañada de una superficie de ataque considerablemente amplia. Un clúster mal configurado puede exponer credenciales en variables de entorno, ejecutar contenedores con privilegios de root, carecer de políticas de red, o tener roles RBAC con permisos comodín que otorgan acceso irrestricto a cualquier recurso. Detectar todos estos problemas de forma sistemática y repetible requiere revisar decenas de objetos distribuidos a lo largo de múltiples namespaces, y hacerlo manualmente es lento, propenso a errores y difícil de documentar.

K8scan nace para cubrir exactamente esa necesidad: una herramienta de análisis de seguridad de solo lectura que automatiza la revisión de un clúster Kubernetes en 16 módulos especializados, con interfaz web, CLI y API REST. Se trata de una evolución de la anterior herramienta K8sAudit orientada a ser una aplicación web interactiva, aunque también dispone de una interfaz de línea de comandos.

Arquitectura de la herramienta

K8scan se compone de tres capas bien diferenciadas:

  • Backend (Python 3.13+ / FastAPI): recibe las peticiones, ejecuta los módulos de escaneo en segundo plano y expone los resultados a través de una API REST. El progreso de cada escaneo se transmite en tiempo real mediante Server-Sent Events (SSE).
  • Frontend (Vue 3 / TypeScript / Pinia): interfaz web con 7 vistas; Panel, Escaneo, Detalles, Historial, Comparar, Ajustes y Ayuda, disponible en inglés y español.
  • CLI (Typer / Rich): interfaz de línea de comandos para entornos sin acceso a navegador, con barras de progreso, badges de severidad y exportación a JSON.

La autenticación se realiza mediante el contexto kubectl existente o mediante la subida de un archivo kubeconfig. La herramienta verifica la conectividad antes de confirmar la conexión y gestiona de forma elegante los errores más comunes: certificados SSL inválidos, DNS no resuelto, credenciales caducadas o acceso denegado.

Un aspecto clave del diseño es la garantía de solo lectura: el cliente Kubernetes interno (ReadOnlyClient) únicamente expone métodos list_*, read_* y get_*. Los módulos de análisis nunca reciben el cliente API directo, y los tests verifican que el código fuente del cliente no contiene llamadas mutantes. Esto hace que K8scan sea seguro para ejecutar en entornos de producción.

Los 16 módulos de análisis

Los módulos están organizados en seis categorías que cubren el ciclo completo de seguridad de un clúster:

Infraestructura del clúster

  • api_server: detecta versiones de Kubernetes obsoletas o en EOL, APIs deprecadas, puertos 6443 y 2379 expuestos externamente, acceso anónimo habilitado o plugins de admisión ausentes.
  • node_security: identifica nodos del plano de control sin taints, nodos en estado NotReady o bajo presión de recursos, y desfases de versión de kubelet entre nodos.
  • namespace_isolation: alerta sobre la coexistencia de cargas de trabajo de producción y no producción, workloads en el namespace default, o RoleBindings cruzados entre namespaces.

Control de acceso

  • rbac: busca bindings de cluster-admin, verbos y recursos comodín, verbos peligrosos como escalate o bind, y ServiceAccounts con tokens automontados innecesarios.
  • psa: evalúa el uso de Pod Security Admission, verificando los niveles enforce, warn y audit en cada namespace y detectando la presencia de la obsoleta PodSecurityPolicy.

Seguridad de cargas de trabajo

  • runtime: revisa contenedores privilegiados, ejecución como root, uso de hostNetwork/hostPID/hostIPC, capabilities peligrosas y ausencia de límites de recursos.
  • workload: comprueba deployments con una sola réplica, ausencia de probes de liveness/readiness, falta de PodDisruptionBudget y pods en estado CrashLoopBackOff.
  • vulnerability: detecta imágenes sin tag, uso de :latest, registros no confiables y patrones de CVE conocidos.
  • supply_chain: verifica que las imágenes estén ancladas por digest, que los registros privados tengan imagePullSecrets y que no se use la estrategia Recreate con múltiples réplicas.

Protección de datos

  • secrets: analiza secrets obsoletos (más de un año), sin referencias activas, con cifrado en reposo ausente, expuestos como variables de entorno o con valores que coinciden con patrones de credenciales conocidos (AWS, GitHub, GitLab, Stripe, claves privadas, JWTs…).
  • env_credentials: escanea variables de entorno en busca de credenciales hardcodeadas: claves de AWS, tokens de GitHub/GitLab/Slack, claves privadas, cadenas de conexión, y variables con nombres sensibles (password, secret, token…).
  • configmaps: detecta ConfigMaps con claves sensibles, patrones de credenciales en los valores, objetos vacíos o de tamaño superior a 1 MB.
  • storage: identifica volúmenes hostPath, montajes del socket Docker, política de reclamación Recycle obsoleta y PVCs en estado pendiente.

Red y exposición

  • pentest: localiza servicios expuestos vía LoadBalancer o NodePort, Ingress sin TLS, credenciales de bases de datos por defecto, dashboards accesibles y ausencia de NetworkPolicy.
  • tls_certificates: revisa certificados expirados o próximos a expirar, autofirmados, con dominios comodín, o que no redirigen de HTTP a HTTPS ni incluyen cabecera HSTS.

Observabilidad

  • logging: detecta la presencia de agentes de logging (Fluentd, Fluent Bit, Filebeat, Promtail, Vector), backends configurados (Elasticsearch, Loki, Splunk) y workloads sin sidecar de recolección de logs.

Puntuación de seguridad

Cada escaneo genera una puntuación de 0 a 100 que refleja el estado general del clúster. La penalización por hallazgo depende de su severidad:

Severidad Penalización
CRÍTICO −10 puntos
ALTO −5 puntos
MEDIO −2 puntos
BAJO −0,5 puntos
INFO 0 puntos

Un clúster sin hallazgos obtiene 100 puntos. La puntuación nunca baja de 0.

Capturas de pantalla

Panel principal

Vista de detalles de un hallazgo

Generación de informes

Comparación entre dos escaneos

Instalación y puesta en marcha

La herramienta se distribuye como un archivo .zip. Tras descomprimirlo, la instalación completa (backend, frontend y CLI) se realiza con un único comando:

make install-deps

Para desarrollo se arrancan backend y frontend en terminales separados:

make dev-backend    # Puerto 8000, hot-reload
make dev-frontend   # Puerto 5173, hot-reload

Para producción standalone, el frontend se compila y se sirve junto con la API desde un único proceso:

make build && make prod   # Puerto 8000, 4 workers uvicorn

También existe un modo Docker con nginx como proxy inverso:

make docker-build && make docker-up   # Puerto 8080

El kubeconfig se monta como solo lectura desde ~/.kube, por lo que no es necesario copiar credenciales dentro del contenedor.

Uso desde la CLI

# Conectar al clúster
k8scan auth context

# Escaneo completo y exportar resultados
k8scan scan run --all --output resultados.json

# Revisar solo hallazgos críticos y altos del módulo RBAC
k8scan scan run --modules rbac --severity critical,high

# Visualizar un informe guardado agrupado por severidad
k8scan results show resultados.json --group

La sesión se persiste en k8scan-cli-session.json, de modo que el estado de autenticación sobrevive entre ejecuciones.

Acceso limitado y entornos restringidos

K8scan funciona incluso cuando el kubeconfig no tiene permisos a nivel de clúster. En ese caso, la herramienta conecta de todas formas, muestra un aviso con el namespace de contexto y limita el escaneo a los recursos accesibles. Las comprobaciones que devuelven error 403 se omiten y se listan en un banner en los resultados, en lugar de interrumpir el escaneo. Esto permite usar K8scan en entornos multi-tenant donde cada equipo solo tiene acceso a sus propios namespaces.

Conclusión

K8scan ofrece una visión completa y automatizada de la postura de seguridad de un clúster Kubernetes, abarcando desde la configuración del API Server hasta la presencia de credenciales hardcodeadas en variables de entorno. Su garantía de solo lectura lo hace adecuado para entornos de producción, y su triple interfaz; web, CLI y API REST, facilita su integración en distintos flujos de trabajo, desde revisiones manuales hasta pipelines de CI/CD automatizados.

El código fuente y el archivo de distribución .zip están disponibles en el siguiente enlace bajo licencia GNU GPLv3.