Saltearse al contenido

Seguridad de contenedores

Los contenedores empaquetan la aplicación con sus dependencias. Su seguridad abarca la imagen (qué contiene), el build (cómo se construye) y el runtime (cómo se ejecuta). Un contenedor mal configurado es a menudo la vía de escape hacia el host o el clúster.

- imagen base MÍNIMA (distroless/alpine) -> menos superficie, menos CVEs
- NO ejecutar como root; usuario sin privilegios (USER en el Dockerfile)
- escaneo de vulnerabilidades de la imagen (Trivy/Grype) antes de publicar
- sin secretos en la imagen ni en capas intermedias (dso-secrets); multi-stage build
- fijar versiones (no :latest) y firmar la imagen (cosign, ver dso-cicd)
- multi-stage: compilar en una capa, copiar solo el artefacto a la final (sin toolchain)
- minimizar capas y paquetes; limpiar cachés; .dockerignore (no meter .git, secretos)
- escaneo de la config del Dockerfile (hadolint, Trivy config)
- procedencia/SBOM de la imagen (dso-deps) para responder a vulns
- capabilities mínimas (drop ALL, añadir solo lo necesario); no --privileged
- read-only root filesystem; no montar el socket de Docker en el contenedor (escape)
- seccomp/AppArmor/SELinux activos; límites de recursos (evitar DoS)
- user namespaces; rootless donde se pueda
- --privileged, montar /var/run/docker.sock o el FS del host -> escape al host
- capabilities peligrosas (CAP_SYS_ADMIN), kernel compartido -> vulns de kernel
- detección en runtime (Falco) de comportamiento anómalo dentro del contenedor
Escaneo imagen Trivy, Grype, Clair
Dockerfile hadolint, Trivy config
Runtime Falco (detección), gVisor/Kata (aislamiento reforzado)
Registro firma (cosign) + política de admisión (dso-k8ssec)
  • Imágenes mínimas, sin root, escaneadas y firmadas; sin secretos en capas (Gestión de secretos).
  • Runtime con mínimas capabilities, read-only FS y sin el socket de Docker montado.
  • Falco u otra detección en runtime para comportamiento anómalo; aislamiento reforzado si el riesgo lo pide.
  • Integrar escaneo de imagen en el CI (Seguridad en CI/CD) y admisión por firma en el clúster (Hardening de Kubernetes).
  • runC / CVE-2019-5736: escape de contenedor sobrescribiendo el binario runc desde dentro.
  • Leaky Vessels (2024): varias vulns de escape en runtimes de contenedor.
  • Montar el socket de Docker o usar —privileged es causa recurrente de escape al host en pentests reales.
  • Imagen base mínima y sin root (USER no privilegiado)
  • Escaneo de imagen (Trivy/Grype) en el CI antes de publicar
  • Multi-stage, sin secretos en capas, .dockerignore
  • Runtime: drop capabilities, read-only FS, sin docker.sock, no —privileged
  • seccomp/AppArmor/SELinux y límites de recursos
  • Firma de imagen (cosign) y SBOM
  • Detección en runtime (Falco) y admisión por firma