Skip to content

🔧 Solucionando Vulnerabilidades en Imágenes Docker

Ahora que hemos escaneado nuestra imagen vulnerable con Docker Scout, vamos a corregir los problemas de seguridad identificados.


1️⃣ Analizando el Dockerfile Vulnerable

Examinemos las vulnerabilidades en nuestro Dockerfile.vulnerable:

dockerfile
# Etapa de construcción
# Usando Node.js 12.22.0 que tiene CVE-2021-22883 (vulnerabilidades de OpenSSL)
FROM node:12.22.0-alpine as build

# Etapa de producción
# Usando Nginx 1.14.0 que tiene CVE-2019-9516 (vulnerabilidad DoS en HTTP/2)
FROM nginx:1.14.0-alpine

# Instalar paquetes adicionales - usando una versión vulnerable de curl
# CVE-2018-1000120 en curl 7.60.0
RUN apk add --no-cache curl openssl

Docker Scout identificó varias vulnerabilidades:

  • Node.js 12.22.0: Contiene vulnerabilidades de OpenSSL (CVE-2021-22883).
  • Nginx 1.14.0: Contiene una vulnerabilidad de DoS en HTTP/2 (CVE-2019-9516).
  • curl: Contiene la vulnerabilidad CVE-2018-1000120.

2️⃣ Creando un Dockerfile Corregido

Creemos una versión corregida de nuestro Dockerfile:

bash
cat << 'EOF' > Dockerfile.fixed
# Etapa de construcción
# Actualizado a Node.js 20 (última LTS) para corregir vulnerabilidades
FROM node:20-alpine as build
WORKDIR /app
ENV DISABLE_ESLINT_PLUGIN=true

# Copiar archivos de paquetes e instalar dependencias
COPY package*.json ./
RUN npm install --no-package-lock

# Copiar el resto del código de la aplicación
COPY . .
RUN npm run build

# Etapa de producción
# Usando una versión de Alpine más reciente con menos vulnerabilidades
FROM nginx:stable-alpine

# Copiar la salida de la construcción para reemplazar el contenido por defecto de nginx
COPY --from=build /app/build /usr/share/nginx/html

# Copiar configuración de nginx
COPY nginx.conf /etc/nginx/conf.d/default.conf

# Actualizar paquetes antes de instalar para obtener los últimos parches de seguridad
RUN apk update && \
    apk upgrade && \
    apk add --no-cache curl openssl

# Exponer puerto
EXPOSE 80

# Iniciar nginx con un usuario no-root para mejor seguridad
# Crear un usuario no-root para ejecutar nginx
RUN adduser -D -H -u 1000 -s /sbin/nologin nginx-user && \
    chown -R nginx-user:nginx-user /var/cache/nginx /etc/nginx/conf.d

USER nginx-user

CMD ["nginx", "-g", "daemon off;"]
EOF

Correcciones clave:

  • Se actualizó Node.js de 12.22.0 a 20 (última LTS).
  • Se actualizó Nginx de 1.14.0 a stable-alpine (base más reciente).
  • Uso de apk update && apk upgrade para asegurar que todos los paquetes estén en sus últimas versiones disponibles.
  • Se agregó endurecimiento (hardening) de seguridad ejecutando Nginx como un usuario no-root.

3️⃣ Construir y Escanear la Imagen Corregida

Construye la imagen usando el Dockerfile corregido:

bash
docker build -t $DOCKER_USERNAME/rent-a-room:fixed -f Dockerfile.fixed .

Ejecuta otro escaneo de Docker Scout para confirmar que los problemas principales se han corregido:

bash
docker scout cves $DOCKER_USERNAME/rent-a-room:fixed

Es posible que aún veas algunas vulnerabilidades en los resultados del escaneo. Esto es común en la seguridad de contenedores; incluso los últimos paquetes disponibles en un repositorio pueden tener vulnerabilidades conocidas que aún no han sido parcheadas.

Entendiendo las vulnerabilidades restantes

Incluso en nuestra imagen "corregida", podrías ver vulnerabilidades en:

  • expat: Una dependencia de la imagen de Nginx Alpine.
  • curl: La última versión disponible en el repositorio de Alpine.
  • musl: Una librería principal de Alpine.
  • busybox: Un paquete de utilidades principal de Alpine.

Estas vulnerabilidades representan la realidad de la seguridad de contenedores; a menudo hay un equilibrio entre:

  1. Usar los últimos paquetes disponibles.
  2. Esperar a que los parches de seguridad estén disponibles en el repositorio.
  3. Aceptar cierto nivel de riesgo para vulnerabilidades no críticas.

4️⃣ Comparar los Resultados

Comparemos los resultados del escaneo entre la imagen vulnerable y la corregida:

bash
docker scout compare $DOCKER_USERNAME/rent-a-room:vulnerable --to $DOCKER_USERNAME/rent-a-room:fixed

Resultados de Scout

Esto te mostrará una comparación lado a lado de las vulnerabilidades que fueron remediadas.

5️⃣ Evaluación de Riesgos y Estrategias de Mitigación

Cuando manejes las vulnerabilidades restantes, considera estas estrategias:

  1. Evaluar la severidad y explotabilidad: Las vulnerabilidades críticas en paquetes expuestos necesitan atención inmediata.
  2. Usar supresión de vulnerabilidades: Para vulnerabilidades que has evaluado como de bajo riesgo.
  3. Considerar imágenes base alternativas: Algunas distribuciones parchean vulnerabilidades más rápido que otras.
  4. Implementar defensa en profundidad: Usa políticas de red, protección en tiempo de ejecución y principios de mínimo privilegio.

6️⃣ Mejores Prácticas para Dockerfiles Seguros

Mejor PrácticaDescripción
Usar Imágenes OficialesSiempre usa imágenes oficiales de Docker como imágenes base.
Usar Etiquetas EspecíficasEvita la etiqueta latest; usa etiquetas de versión específicas.
Mantener Imágenes Base ActualizadasActualiza regularmente las imágenes base para incluir parches de seguridad.
Minimizar Capas de la ImagenCombina comandos RUN para reducir las capas y la superficie de ataque.
Usar Construcciones Multi-etapaSepara los entornos de construcción y de ejecución.
Especificar Versiones de PaquetesFija (pin) las versiones de los paquetes para evitar actualizaciones inesperadas.
Escanear Imágenes RegularmenteIntegra Docker Scout en tu pipeline de CI/CD.

📌 Próximas Pasos

Ahora que nuestra imagen es segura, ¡vamos a automatizar el escaneo de vulnerabilidades en AWS CodePipeline!
Pasa a la siguiente sección para la integración de CI/CD. 🚀

Released under the GPL-3.0 License.