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 namespacedefault, o RoleBindings cruzados entre namespaces.
Control de acceso
rbac: busca bindings decluster-admin, verbos y recursos comodín, verbos peligrosos comoescalateobind, y ServiceAccounts con tokens automontados innecesarios.psa: evalúa el uso de Pod Security Admission, verificando los nivelesenforce,warnyauditen cada namespace y detectando la presencia de la obsoletaPodSecurityPolicy.
Seguridad de cargas de trabajo
runtime: revisa contenedores privilegiados, ejecución como root, uso dehostNetwork/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 tenganimagePullSecretsy que no se use la estrategiaRecreatecon 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úmeneshostPath, montajes del socket Docker, política de reclamaciónRecycleobsoleta 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.