Docker Imágenes Endurecidas: Seguridad Probada

Docker Hardened Images (DHI) cumple un año desde su lanzamiento oficial en mayo de 2025 y los números muestran por qué la empresa eligió el camino difícil: un catálogo de más de 1.000 imágenes mantenidas por Docker en lugar de depender de la comunidad, reduciendo vulnerabilidades hasta 75% en servicios financieros y eliminando prácticamente el mantenimiento manual de base images para equipos de infraestructura en todo el mundo.

En 30 segundos

  • Docker Hardened Images son imágenes base verificadas, mantenidas por Docker, que eliminan componentes innecesarios y se parchean automáticamente cuando surge un CVE crítico
  • Una empresa de servicios financieros redujo vulnerabilidades de alta gravedad 75% simplemente migrando de imágenes tradicionales a DHI
  • Los VEX statements (Vulnerability Exploitability eXchange) permiten diferenciar vulnerabilidades reales de falsas alarmas, cortando el ruido en seguridad
  • Las imágenes son hasta 95% más pequeñas que alternativas tradicionales y vienen con SBOM, firma criptográfica y provenance SLSA L3
  • Es gratuito bajo licencia Apache 2.0 y está disponible en Docker Hub para Node, Python, Nginx, PostgreSQL y más

¿Qué son Docker Hardened Images y por qué Docker hizo el trabajo que “no era su responsabilidad”?

Docker Hardened Images (DHI) son imágenes base Linux mantenidas oficialmente por Docker que vienen preconfiguradas con únicamente lo que necesitás para ejecutar una aplicación, sin la tonelada de herramientas del sistema que nunca usás. No es magia: es el resultado de Docker diciendo “mirá, la comunidad entrega imágenes normales, nosotros vamos a mantener versiones seguras, pequeñas, auditadas, y con updates automáticos cuando haya un CVE crítico”.

El catálogo actual incluye Node.js, Python, Ruby, Java, Go, PostgreSQL, MongoDB, Nginx, Apache, Redis y más de 1.000 combinaciones de versiones. Cada una es libre bajo Apache 2.0, así que si vos o tu empresa sos pequeños, no pagás nada. Subís la imagen, la usás, listo.

¿Qué pasó en el primer año? Que Docker terminó parchando vulnerabilidades de OpenSSL, glibc y BASH automáticamente cuando surgían, sin esperar a que tu equipo lo vea, arme el ticket, lo priorice (ponele que entre 50 tickets de bugs del producto), haga el testing, y finalmente mergeee. Eliminaron todo ese friction (y ese riesgo).

Vulnerabilidades en capas base vs capas de aplicación: por qué no todo CVE es igual

Ponele que ejecutás una aplicación Node.js sobre Ubuntu 20.04. Si esa distro tiene una vulnerabilidad en OpenSSL (como Heartbleed en 2014), vos estás expuesto aunque tu código sea impecable. Eso es una vulnerabilidad de base image: algo que te viene de afuera.

Ahora, si tu aplicación tiene un bug de inyección SQL, eso es application-layer: responsabilidad tuya. Pero en la mayoría de los casos, cuando Docker Scout o cualquier escáner de vulnerabilidades te reporta “encontré 450 CVEs”, 90% son de la base image, no de tu código.

El problema histórico: cuando surgía un CVE crítico en glibc (librería del sistema en Linux), vos dependías de que Ubuntu pusiera el parche, que la comunidad de Docker Hub actualizara sus imágenes, que lo viera en tu radar. A veces pasaban semanas. Docker Hardened Images achica ese margen a días máximo, porque el único dueño del build es Docker. Para más detalles técnicos, mirá gestión segura de secretos en contenedores.

Shellshock (CVE-2014-6271 en BASH) es un caso clásico: afectó máquinas durante meses porque los usuarios no sabían que tenían BASH en sus imágenes. Con DHI, BASH no estaría ahí en primer lugar (lo removieron si no lo necesitás para tu runtime específico).

Reducción de superficie de ataque: cómo Docker empaquetar menos es seguridad

Las imágenes DHI son drásticas: eliminan todo lo que no es esencial para que tu app funcione. No incluyen apt, curl, wget, systemd, man pages, documentación, ni headers de compilación. Resultado: 95% más pequeñas que imágenes tradicionales Debian full.

¿Por qué importa? Cuanto menos software está instalado, menos superficie de ataque hay. Si no tenés apt, un atacante no puede instalar tools. Si no tenés curl ni wget, una cadena de ejecución remota es mucho más limitada. Cada paquete que sacás es un punto de entrada que eliminás.

Además, cada imagen incluye:

  • SBOM (Software Bill of Materials): inventario firmado de qué está exactamente en la imagen, para auditar con escáneres automáticos
  • Firma criptográfica: garantiza que es la imagen real, no una clonada o interceptada en el canal
  • SLSA L3 provenance: prueba documentada de dónde, cuándo y cómo se built la imagen (cadena de custodia)
  • Ejecución sin root por defecto: el contenedor corre como usuario no-privilegiado, limitando daños si se compromete

Es el opuesto a “dale permisos al contenedor y que la seguridad sea responsabilidad del usuario”. Acá vino con candado.

VEX statements y la magia de priorizar vulnerabilidades sin falsos positivos

Esto es lo que realmente cambió el juego en el último año. VEX (Vulnerability Exploitability eXchange) es un estándar de CycloneDX que marca cada CVE con uno de cuatro estados:

  • Not affected: la vulnerabilidad existe en el componente, pero tu contexto de uso no es vulnerable (ej: CVE en una función que no usás)
  • Affected: estás expuesto y necesitás parchear
  • Fixed: ya está parchado en tu versión actual
  • Under Investigation: aún se está evaluando

La diferencia es gigante. Un escáner tradicional te grita “¡CVE en OpenSSL! ¡Crítico!”. VEX te dice “sí, hay un CVE en OpenSSL, pero esa función no se usa en tu caso de uso, así que Not affected”. Tema relacionado: conceptos fundamentales de ciberseguridad.

Docker Scout aplica VEX statements automáticamente (sin que vos hagas nada), y desde hace poco integró Mend.io para diferenciar entre vulnerabilidades de base image y application-layer. Un cliente de servicios financieros pasó de 450 CVEs reportados a 112, y de esos 112, solo 35 eran “Affected” reales. El ruido bajó 75%.

Cuando tienes esa claridad, tu equipo puede enfocarse en lo que importa: los 35 CVEs verdaderos, no los 415 falsos positivos.

Implementación en producción: Kubernetes, controladores de admisión, y casos reales

En Kubernetes, DHI se integra con:

Controladores de admisión y validación de imágenes

OPA/Kyverno pueden estar configurados para que solo permita imágenes firmadas criptográficamente. Si especificás una imagen DHI sin firma válida, el cluster rechaza el deploy. No hay margen para desvíos.

Docker Scout en CI/CD

Tu pipeline compila la imagen, Docker Scout la escanea automáticamente, genera un SBOM, aplica VEX statements. Si encontrás vulnerabilidades reales (Affected), el build falla antes de pushear a registry. Si todo está “Not affected” o “Fixed”, pasá el next stage.

Monitoreo en runtime con Falco

Falco monitorea comportamientos sospechosos dentro del contenedor. Si el proceso intenta escribir en directorios no autorizados, listar archivos del sistema o conectarse a puertos extraños, Falco te lo reporta. Complementa perfectamente con una base image hardened.

Caso real: CloudNativePG

CloudNativePG (gestor de PostgreSQL en Kubernetes) usa imágenes DHI para sus deployments. El catálogo DHI incluye una imagen oficial de PostgreSQL que viene sin herramientas de desarrollo, sin apt, sin nada que no sea necesario para correr el servidor. Equipos en startups hasta Fortune 500 usan esto porque simplemente funciona, está actualizado, y el CVE score baja.

Un año después: ¿cuál fue el costo operacional de mantener 1.000+ imágenes?

Acá viene lo interesante. Docker publicó hace poco el análisis de un año de mantenimiento de DHI, y los números muestran por qué eligieron el camino difícil:

  • Cuando surge un CVE crítico en OpenSSL o glibc, Docker lo parcha automáticamente en todas las imágenes afectadas. Triaje cero del usuario.
  • Un cliente que corría imágenes Node.js tradicionales tenía 80 vulnerabilidades reportadas. Al migrar a DHI, bajó a 1 (y ese 1 era Not affected gracias a VEX).
  • Imágenes DHI de Node tienen 98% menos paquetes que una Debian estándar: bajaste de 450 packages a 7-8.
  • El mantenimiento manual desapareció. Sin apt instalado, tu equipo no puede hacer actualizaciones puntuales (por diseño). Solo usás versiones verified de Docker.

El trade-off es claro: menos control a cambio de garantías más fuertes. Si alguna vez necesitás instalar algo dentro del contenedor, estás en el contexto equivocado (deberías multi-stage build o usar una imagen no-hardened, que es válido). Más contexto en proteger tus repositorios y pipelines.

Docker Hardened Images vs alternativas: cuándo elegir cada una

No es que DHI sea “la mejor” para todo. Hay casos donde otra opción tiene más sentido:

OpciónTamañoMantenimientoFlexibilidadMejor para…
Docker Hardened Images5-15 MBDocker lo haceBajaProducción, seguridad crítica, empresas
Distroless (genérico)5-20 MBVos lo mantenésBajaCuando DHI no tiene tu lenguaje
Alpine5-10 MBComunidadMediaDesarrollo local, proof of concept
Debian/Ubuntu slim50-100 MBComunidadMediaCuando necesitás apt y herramientas
Debian/Ubuntu full300-700 MBComunidadAltaDev, testing, no para producción
docker imágenes endurecidas seguridad diagrama explicativo

La elección real es: ¿querés que Docker mantenga la seguridad, o preferís hacerlo vos (o no hacerlo)? Si tu respuesta es “que Docker lo haga”, DHI gana. Si necesitás instalar cosas a mano o tenés un lenguaje que DHI aún no soporta, andá a distroless o Alpine.

Vale la pena mencionar que donweb.com tiene hojas de ruta sobre containerización y seguridad en producción; si estás evaluando imágenes para un proyecto empresarial, esos recursos documentan decisiones similares a la de Docker.

Errores comunes cuando pasás a Docker Hardened Images

Error 1: Asumir que DHI es más lenta porque es más pequeña

Falso. Una imagen más pequeña se descarga más rápido, se pushea más rápido, y tarda menos en startear. El único costo es si tu aplicación intenta usar herramientas del sistema (apt, curl, etc.) y no las encuentra. Pero eso es un problema de arquitectura tuya, no de la imagen.

Error 2: Intentar instalar paquetes adicionales dentro del contenedor

Si escribís RUN apt-get install curl en tu Dockerfile basado en DHI, eso falla porque apt no está. La solución correcta: si necesitás curl, usá un multi-stage build donde una etapa tiene herramientas y la final es DHI. O reconsiderá por qué necesitás curl en runtime (probabilidad: 95% de las veces no lo necesitás).

Error 3: No verificar que DHI soporta tu versión específica

El catálogo de DHI no tiene TODAS las versiones de todo. Si necesitás Node 18.14 y DHI solo tiene 18.15+, tenés que o elegir esa versión, o usar una imagen no-hardened. Chequeá el catálogo oficial antes de asignar resources a la migración.

Preguntas Frecuentes

¿Qué son las Docker Hardened Images exactamente?

Imágenes Linux oficiales de Docker que vienen con el mínimo de software necesario para correr una aplicación (Node, Python, Java, etc.), sin herramientas del sistema innecesarias, firmadas criptográficamente, y parchadas automáticamente por Docker cuando hay un CVE crítico. Son libres y están en Docker Hub.

¿Cuánta seguridad gano realmente si migro?

Depende de dónde venga tu aplicación. Si estás usando imágenes comunitarias viejas de Docker Hub, podrías reducir CVEs reportados entre 50-90% simplemente migrando. Una empresa financiera redujo “Affected” vulnerabilities 75%. El número exacto depende de qué imagen comunitaria estés usando ahora. Cubrimos ese tema en detalle en ejecutar servicios de forma aislada.

¿Cuesta dinero usar Docker Hardened Images?

No. Son Apache 2.0, completamente gratuitas. El costo es el tiempo de migración: cambiar tu Dockerfile de FROM node:20 a FROM docker.io/library/node:20-alpine-dhi (o algo similar, varía por versión). Eso es labor de 1-2 horas para una app típica.

¿Qué pasa si necesito instalar herramientas adicionales en el contenedor?

No podés si usás DHI puro (apt no está). Solución 1: multi-stage build donde una etapa tiene herramientas y la final es DHI. Solución 2: si eso no te cierra, usá una imagen distroless o Alpine en lugar de DHI. Solución 3 (la más probable): reconsiderá si realmente necesitás esas herramientas en runtime.

¿Qué pasa con los CVEs que surgen después de que yo pulle la imagen?

Si volvés a hacer docker pull node:20-dhi la próxima vez, Docker ya habrá parchado la imagen (si el CVE es crítico, parcha en días). Lo que no hace es actualizar imágenes que ya tenés corriendo en producción; para eso necesitás redeploy. Eso es tu responsabilidad.

Conclusión: cuando las restricciones son seguridad

Docker Hardened Images no son revolucionarias en concepto (distroless existe desde 2017), pero su implementación cambia la ecuación operacional: un vendor que asume la responsabilidad de mantener miles de imágenes, parchearlas automáticamente, e incluir SBOM y firma criptográfica de forma estándar. Eso es raro en la industria.

Si trabajás en una empresa donde seguridad y compliance importan (fintech, healthcare, cualquier cosa regulada), migrar a DHI es una decisión casi obvia: menos CVEs falsos, menos parcheo manual, menos fricción. Si sos una startup pequeña, DHI sigue siendo válido (es gratis), pero probablemente no es la prioridad si tu problema es escalar el producto.

Lo importante que cambió en este primer año es que VEX + Docker Scout ahora hacen el trabajo tedioso por vos: filtran automáticamente los CVEs que importan de los que no. Eso solo vale la pena si tenés 1.000+ imágenes. Para equipos medianos, es un win.

Si recién empezás un proyecto nuevo, probá DHI. Si ya estás en producción con imágenes tradicionales, migrar tiene ROI positivo (ojo: probá en staging primero). Si tu aplicación necesita herramientas del sistema, distroless o Alpine siguen siendo mejores opciones.

Fuentes

Similar Posts