La superficie de ataque de los contenedores
Los contenedores dan aislamiento de procesos, no de seguridad. Un contenedor mal configurado puede exponer el kernel, filtrar secretos o servir como punto de pivote. Primero, entiende la superficie de ataque:
- Imágenes - Librerías vulnerables, credenciales hardcodeadas, herramientas innecesarias
- Runtime - Vulnerabilidades que permiten escapes
- Orquestador (RBAC de Kubernetes, network policies) - Servicios expuestos, permisos excesivos
- Cadena de suministro - Imágenes base o dependencias comprometidas
- Secretos - En imágenes o variables de entorno que cualquier proceso puede leer
La seguridad requiere defensa en profundidad: build, ship, run.
Seguridad de las imágenes
Usa imágenes base mínimas
Cada paquete adicional en una imagen de contenedor es una vulnerabilidad potencial. Prefiere imágenes base mínimas:
| |
Las imágenes distroless contienen solo tu aplicación y sus dependencias de runtime — sin shell, sin gestor de paquetes, sin binarios innecesarios. Esto reduce drásticamente la superficie de ataque.
Multi-Stage Builds
Los multi-stage builds permiten compilar en una etapa y copiar solo el artefacto final a una imagen de runtime mínima:
| |
Las herramientas de compilación, el código fuente y los archivos intermedios nunca llegan a la imagen final.
Nunca ejecutes como root
Ejecutar contenedores como root significa que un escape del contenedor le da al atacante acceso root en el host. Siempre especifica un usuario no-root:
| |
En Kubernetes, esto se refuerza con Pod Security Standards (más detalles abajo).
Comparación de Dockerfile seguro vs. inseguro
Aquí hay una comparación lado a lado de errores comunes frente a prácticas seguras:
| |
| |
Diferencias clave: imagen base mínima, multi-stage build, sin secretos en la imagen, usuario no-root, solo los puertos necesarios expuestos, health check incluido.
Escaneo de imágenes con Trivy
Trivy es un escáner de vulnerabilidades open-source que analiza imágenes de contenedores, sistemas de archivos y configuraciones de IaC. Intégralo en tu pipeline de CI para detectar vulnerabilidades antes del despliegue.
Escaneo básico de imagen
| |
Escaneo en CI/CD
Añade Trivy a tu pipeline para que ninguna imagen con vulnerabilidades críticas llegue a producción:
| |
Escaneo de IaC y sistemas de archivos
Trivy va más allá de las imágenes de contenedores:
| |
Seguridad en runtime con Falco
Mientras que el escaneo detecta vulnerabilidades en tiempo de build, Falco monitoriza los contenedores en tiempo de ejecución. Utiliza instrumentación a nivel de kernel para detectar comportamientos sospechosos:
- Ejecuciones inesperadas de shell dentro de contenedores.
- Procesos que leen archivos sensibles (
/etc/shadow,/etc/passwd). - Conexiones de red salientes a destinos inesperados.
- Intentos de escalada de privilegios.
Ejemplo de reglas Falco
| |
Despliega Falco como un DaemonSet en tu cluster de Kubernetes para obtener visibilidad sobre el comportamiento en runtime en todos los nodos.
Seguridad en Kubernetes
Pod Security Standards
Los Pod Security Standards de Kubernetes definen tres niveles de restricción:
- Privileged — Sin restricciones (solo para cargas de trabajo a nivel de sistema).
- Baseline — Previene escaladas de privilegios conocidas.
- Restricted — Altamente restringido, siguiendo las mejores prácticas de seguridad.
Aplícalos a nivel de namespace:
| |
NetworkPolicies
Por defecto, todos los pods en Kubernetes pueden comunicarse entre sí. Las NetworkPolicies permiten restringir el tráfico:
| |
Esta política asegura que el pod de la API solo recibe tráfico del frontend y solo envía tráfico a la base de datos.
RBAC
Sigue el principio de mínimo privilegio. Evita dar cluster-admin a service accounts. Crea roles específicos:
| |
Audita regularmente los RBAC bindings con herramientas como kubectl-who-can o rbac-tool.
Gestión de secretos
Nunca almacenes secretos en imágenes de contenedores, variables de entorno en Dockerfiles en texto plano ni en control de versiones. En su lugar:
- Usa Kubernetes Secrets (cifrados en reposo con KMS).
- Usa gestores de secretos externos: HashiCorp Vault, AWS Secrets Manager, Azure Key Vault.
- Usa el External Secrets Operator para sincronizar secretos de proveedores externos en Kubernetes.
- Rota los secretos regularmente y audita el acceso.
Seguridad de la cadena de suministro
Imágenes firmadas
Firma tus imágenes de contenedores con cosign (parte del proyecto Sigstore) y verifica las firmas antes del despliegue:
| |
SBOM (Software Bill of Materials)
Genera un SBOM para cada imagen para poder verificar rápidamente si un CVE recién publicado afecta a tus contenedores en ejecución:
| |
Checklist de seguridad de contenedores
Usa esta checklist para evaluar tu postura de seguridad en contenedores:
- Las imágenes base son mínimas (distroless o Alpine).
- Se usan multi-stage builds para excluir herramientas de compilación.
- Los contenedores se ejecutan como usuarios no-root.
- Las imágenes se escanean en busca de vulnerabilidades en CI/CD.
- No se almacenan secretos en imágenes ni en variables de entorno en texto plano.
- Los Pod Security Standards de Kubernetes están habilitados.
- Las NetworkPolicies restringen la comunicación entre pods.
- RBAC sigue el mínimo privilegio.
- La monitorización de seguridad en runtime está activa (Falco o equivalente).
- Las imágenes están firmadas y las firmas se verifican antes del despliegue.
- Se generan y almacenan SBOMs para todas las imágenes en producción.
- Los secretos se gestionan a través de un gestor de secretos externo.
- Las políticas de pull de imágenes están configuradas como
Alwayspara tags mutables. - Se realizan auditorías de seguridad y pruebas de penetración de forma regular.
Conclusión
La seguridad en contenedores es una práctica continua, no una tarea puntual. Empieza con lo básico: imágenes mínimas, usuarios no-root, escaneo. Luego añade monitorización en runtime, network policies, verificación de cadena de suministro, aplicación automatizada. Cada capa reduce el impacto y te acerca a seguridad real.