Análisis de Contenedores
Container Scanning es el proceso de analizar imágenes Docker para detectar vulnerabilidades de seguridad. Es un paso crítico en nuestra estrategia DevSecOps, ya que la imagen de contenedor es el artefacto final que se despliega en producción.
En HERA, este análisis se realiza principalmente con Docker Scout, que integra SCA, y se complementa con linters de Dockerfile como Hadolint.
¿Qué se Analiza en una Imagen Docker?
Sección titulada «¿Qué se Analiza en una Imagen Docker?»Una imagen no es solo tu código. Es un paquete completo con múltiples capas, y cada una puede tener vulnerabilidades.
Mejores Prácticas para Dockerfiles Seguros
Sección titulada «Mejores Prácticas para Dockerfiles Seguros»La seguridad de un contenedor empieza con un Dockerfile bien escrito.
Ejemplo: Dockerfile Seguro (Node.js)
Sección titulada «Ejemplo: Dockerfile Seguro (Node.js)»# ✅ SEGURO: Multi-stage y usuario no-root
# 1. Builder StageFROM node:20-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
# 2. Final Stage (Runtime)FROM node:20-alpine AS finalWORKDIR /app
# Crear usuario no-rootRUN addgroup -S appgroup && adduser -S appuser -G appgroup
# Copiar solo los artefactos necesarios desde el builderCOPY --from=builder --chown=appuser:appgroup /app/dist ./distCOPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modulesCOPY --chown=appuser:appgroup package.json .
USER appuserEXPOSE 3000CMD ["node", "dist/index.js"]Hadolint: Linting de Dockerfile
Sección titulada «Hadolint: Linting de Dockerfile»Para asegurar que los Dockerfiles sigan las mejores prácticas, el Golden Pipeline incluye Hadolint como job dockerfile-lint en la etapa validate. El equipo de producto no lo escribe a mano — se hereda del template.
Contrato del job dockerfile-lint
Sección titulada «Contrato del job dockerfile-lint»| Atributo | Valor |
|---|---|
| Stage | validate |
| Imagen base | Hadolint oficial |
| Alcance del escaneo | Dockerfile en la raíz del repositorio |
| Trigger | Solo en MRs ($CI_PIPELINE_SOURCE == 'merge_request_event') |
allow_failure | true — no bloquea el pipeline pero deja evidencia de las violaciones |
Ejemplos de errores que Hadolint detecta
Sección titulada «Ejemplos de errores que Hadolint detecta»DL3006:FROM nodeen lugar deFROM node:20-alpine(usar:latestestá prohibido).DL3002: No se ha cambiado del usuarioroot(violación de principio non-root).
Política de Remediación
Sección titulada «Política de Remediación»Al igual que con SCA, el pipeline fallará si se encuentran vulnerabilidades Críticas o Altas. La estrategia de remediación es generalmente una de las siguientes:
-
Actualizar la imagen base: Es la solución más común. Si tu Dockerfile usa
FROM python:3.11.5, y esa versión tiene una vulnerabilidad, cambiar aFROM python:3.11.6(que ya contiene el parche) usualmente resuelve el problema. -
Reconstruir la imagen: A veces, las bases de datos de vulnerabilidades se actualizan. Una simple reconstrucción de la imagen puede resolver vulnerabilidades porque se descargarán las últimas versiones de los paquetes base.
-
Actualizar un paquete explícitamente: Si una vulnerabilidad está en un paquete que instalas manualmente (ej. con
apt-get install curl), puedes forzar su actualización en el Dockerfile.# Actualizar paquetes para aplicar parches de seguridadRUN apt-get update && apt-get upgrade -y